4

redis备份与恢复_LinkSLA智能运维管家的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/u_15576159/5929351
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

版本:4.0.14

持久化:RDB+AOF

1、RDB相关参数:

dbfilename dump.rdb
dir /redis/data

2、AOF相关参数:

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

3、生成测试数据

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"

4、备份数据库

[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

5、模拟误删除键

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

通过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"

通过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"

6、如何强制优先以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。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK