华企号 元宇宙 关于redis的备份和恢复

关于redis的备份和恢复

版本:4.0.14

持久化:RDB+AOF

RDB相关参数:

 

1
2
dbfilename dump.rdb
dir /redis/data

AOF相关参数:

 

1
2
3
4
5
appendonly  yes
appendfilename appendonly.aof
appendfsync everysec
auto-aof-rewrite-percentage  100
auto-aof-rewrite-min-size    64mb

生成测试数据

 

1
2
3
4
5
6
7
8
9
10
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"

备份数据库

 

1
2
3
4
5
6
7
[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

 

1
2
3
4
5
127.0.0.1:6379> del key xxx
(integer) 1
127.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 -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空文件

 

1
2
3
[redis@cjcos02 conf]$ redis-cli
127.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.conf
appendonly  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。

作者: 华企网通李铁牛程序员

我是程序员李铁牛,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。15889726201 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部