版本:4.0.14
持久化:RDB+AOF
RDB相关参数:
|
1
2
|
dbfilename dump.rdbdir /redis/data |
AOF相关参数:
|
1
2
3
4
5
|
appendonly yesappendfilename appendonly.aofappendfsync everysecauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb |
生成测试数据
|
1
2
3
4
5
6
7
8
9
10
|
127.0.0.1:6379> set name cjcOK127.0.0.1:6379> set xxx 123OK127.0.0.1:6379> set ccc wwwOK127.0.0.1:6379> keys *1) "name"2) "ccc"3) "xxx" |
备份数据库
|
1
2
3
4
5
6
7
|
[redis@cjcos02 data]$ lsappendonly.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
|
1
2
3
4
5
|
127.0.0.1:6379> del key xxx(integer) 1127.0.0.1:6379> keys *1) "name"2) "ccc" |
恢复1:
通过rdb备份进行恢复
停库
|
1
|
127.0.0.1:6379> shutdown |
将dump.rdb备份还原
|
1
|
[redis@cjcos02 data]$ cp ../bak/dump.rdb . |
启动
|
1
|
[redis@cjcos02 conf]$ redis-server redis.conf |
数据没有恢复,因为aof优先级高于rdb,启动数据库时优先加载aof文件
|
1
2
3
4
|
[redis@cjcos02 conf]$ redis-cli 127.0.0.1:6379> keys *1) "ccc"2) "name" |
恢复2:
通过aof进行恢复
停库
|
1
|
127.0.0.1:6379> shutdown |
将aof备份还原
|
1
|
[redis@cjcos02 data]$ cp ../bak/appendonly.aof . |
启动
|
1
|
[redis@cjcos02 conf]$ redis-server redis.conf |
数据恢复成功
|
1
2
3
4
5
6
|
[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文件
停库
|
1
|
127.0.0.1:6379> shutdown |
重命名
|
1
|
[redis@cjcos02 data]$ mv appendonly.aof appendonly.aof_bak |
启库,生成了一个空的aof文件
|
1
2
3
4
5
6
|
[redis@cjcos02 conf]$ redis-server redis.conf[redis@cjcos02 data]$ ls -lrthtotal 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空文件
|
1
2
3
|
[redis@cjcos02 conf]$ redis-cli127.0.0.1:6379> keys *(empty list or set) |
并且当前的dump.rdb数据也会根据空的aof文件进行更新,导致数据全部丢失
2.关闭aof
先恢复刚才丢失的数据
|
1
|
[redis@cjcos02 data]$ cp ../bak/dump.rdb . |
停库
|
1
|
127.0.0.1:6379> shutdown |
关闭aof
|
1
2
|
[redis@cjcos02 data]$ vi ../conf/redis.confappendonly no |
启库
|
1
2
3
4
5
6
7
|
[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
2
3
4
5
6
|
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。 |
