redis 備份和恢復

chenoracle發表於2022-12-05

版本:4.0.14

持久化:RDB+AOF

RDB相關引數:

dbfilename dump.rdb
dir /redis/data

AOF相關引數:

appendonly  yes
appendfilename appendonly.aof
appendfsync everysec
auto-aof-rewrite-percentage  100
auto-aof-rewrite-min-size    64mb

生成測試資料

127.0.0.1:6379> set name cjc
OK
127.0.0.1:6379> set xxx 123
OK
127.0.0.1:6379> set ccc www
OK
127.0.0.1:6379> keys *
1) "name"
2) "ccc"
3) "xxx"

備份資料庫

[redis@cjcos02 data]$ ls
appendonly.aof  dump.rdb
[redis@cjcos02 data]$ cp * ../bak/
[redis@cjcos02 data]$ ls -lrth ../bak/
total 8.0K
-rw-rw-r-- 1 redis redis 130 Dec  5 09:52 dump.rdb
-rw-r--r-- 1 redis redis 259 Dec  5 09:52 appendonly.aof

模擬誤刪除key

127.0.0.1:6379> del key xxx
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "ccc"

恢復1:

透過rdb備份進行恢復

停庫

127.0.0.1:6379> shutdown

將dump.rdb備份還原

[redis@cjcos02 data]$ cp ../bak/dump.rdb .

啟動

[redis@cjcos02 conf]$ redis-server redis.conf

資料沒有恢復,因為aof優先順序高於rdb,啟動資料庫時優先載入aof檔案

[redis@cjcos02 conf]$ redis-cli 
127.0.0.1:6379> keys *
1) "ccc"
2) "name"

恢復2:

透過aof進行恢復

停庫

127.0.0.1:6379> shutdown

將aof備份還原

[redis@cjcos02 data]$ cp ../bak/appendonly.aof .

啟動

[redis@cjcos02 conf]$ redis-server redis.conf

資料恢復成功

[redis@cjcos02 conf]$ redis-server redis.conf
[redis@cjcos02 conf]$ redis-cli 
127.0.0.1:6379> keys *
1) "name"
2) "ccc"
3) "xxx"

如何強制優先以rdb檔案載入?

1.破壞當前aof檔案

停庫

127.0.0.1:6379> shutdown

重新命名

[redis@cjcos02 data]$ mv appendonly.aof appendonly.aof_bak

啟庫,生成了一個空的aof檔案

[redis@cjcos02 conf]$ redis-server redis.conf
[redis@cjcos02 data]$ ls -lrth
total 8.0K
-rw-r--r-- 1 redis redis 259 Dec  5 09:57 appendonly.aof_bak
-rw-rw-r-- 1 redis redis 124 Dec  5 10:00 dump.rdb
-rw-r--r-- 1 redis redis   0 Dec  5 10:01 appendonly.aof

資料全部丟失,原因是資料庫載入了新生成的aof空檔案

[redis@cjcos02 conf]$ redis-cli
127.0.0.1:6379> keys *
(empty list or set)


並且當前的dump.rdb資料也會根據空的aof檔案進行更新,導致資料全部丟失

2.關閉aof

先恢復剛才丟失的資料

[redis@cjcos02 data]$ cp ../bak/dump.rdb .

停庫

127.0.0.1:6379> shutdown

關閉aof

[redis@cjcos02 data]$ vi ../conf/redis.conf
appendonly  no

啟庫

[redis@cjcos02 conf]$ redis-server redis.conf
[redis@cjcos02 conf]$ redis-cli 
127.0.0.1:6379> keys *
1) "fsd"
2) "age"
3) "name"
4) "xx"

總結:

1.redis資料持久化有rdb和aof,因為aof資料更新一些,所以如果rdb和aof都開啟了,啟動redis優先載入aof檔案。
2.備份時可以將rdb和aof都備份走。
3.如果rdb和aof都開啟了,啟動時想以rdb載入redis,千萬不能採用刪除或重新命名aof的方式,
熟悉oracle的都知道,引數檔案優先載入spfile,如果希望優先載入pfile,可以重新命名spfile,
但是在redis裡千萬不能這麼搞,如果這麼操作,redis啟動後會生成一個空的新aof檔案,並載入到redis裡,並以新的aof檔案更新rdb檔案,最終導致資料丟失。
正確的方式是透過引數關閉aof。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2926666/,如需轉載,請註明出處,否則將追究法律責任。

相關文章