Redis 通过 RDB 方式进行数据备份与还原
Redis 通過 RDB 方式進行數據備份與還原
Intro
有的時候我們需要對 Redis 的數據進行遷移,今天介紹一下通過 RDB(快照)文件進行 Redis 數據的備份和還原
Redis 持久化
Redis 的數據持久化有兩種機制,一種是 RDB(Redis Database),一種是 AOF(Append Only File)
Redis 提供了不同級別的持久化方式:
RDB持久化方式能夠在指定的時間間隔能對你的數據進行快照存儲.
AOF持久化方式記錄每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操作到文件末尾.Redis還能對AOF文件進行后臺重寫,使得AOF文件的體積不至于過大.
如果你只希望你的數據在服務器運行的時候存在,你也可以不使用任何持久化方式.
你也可以同時開啟兩種持久化方式, 在這種情況下, 當redis重啟的時候會優先載入AOF文件來恢復原始的數據,因為在通常情況下AOF文件保存的數據集要比RDB文件保存的數據集要完整.
廢話不多說直接看下面的示例吧,通過 docker 運行一個 redis 實例,并設置一些數據,然后導出 RDB 文件,再運行一個 redis 實例通過 RDB 文件還原數據
備份
通過 docker run -d --name redis-test-1 redis:alpine 命令來創建一個 redis 實例,接著 SET 一個 key 保存到我們的 redis,使用命令 SET hello world 寫入測試數據,你也可以寫入別的自己想寫的數據,接著可以使用 keys * 來驗證數據是否寫入成功
測試數據寫入成功后使用 SAVE 命令來創建 RDB 文件,命令執行成功后我們可以在 /data 目錄下看到會有一個 dump.rdb 文件,這就是我們想要的 RDB 文件,通過 docker cp 命令可以把這個文件拷貝到 host 目錄下
還原
通過上面 RDB 文件我們可以在 redis 啟動的時候還原 RDB 文件中的數據,只需要在 Redis 啟動前把 RDB 文件放在 redis 的 data 目錄下就可以了。
執行 docker run --rm --name redis-test-2 -v ${pwd}/data:/data redis:alpine
這個命令我是在 powershell 上執行的,如果執行在 Linux 上執行需要把 ${pwd} 換成 $(pwd) 來表示當前目錄
可以看到上面的日志里有 Loading RDB ... 就是在加載 RDB 文件中的數據
我們再來驗證一下 RDB 文件里的數據是否真的加載到了新的 redis 實例中,先來驗證一下 data 目錄是否正常掛載了,執行 docker exec -it redis-test-2 sh 來進入到 redis 實例容器中,ls 查看 data 目錄中的文件看是否有我們期望的 RDB 文件,接著進入 redis-cli 來驗證數據是否存在
使用 keys * 來列出來所有的 key 信息,可以看到有我們在上一個 redis 里寫入的測試數據了,再來使用 GET hello 來驗證數據是否正確,至此我們的數據就還原到新的 redis 實例中了~~
More
當 Redis 需要保存 dump.rdb 文件時, 服務器執行以下操作:
Redis 調用forks. 同時擁有父進程和子進程。
子進程將數據集寫入到一個臨時 RDB 文件中。
當子進程完成對新 RDB 文件的寫入時,Redis 用新 RDB 文件替換原來的 RDB 文件,并刪除舊的 RDB 文件。
這種工作方式使得 Redis 可以從寫時復制(copy-on-write)機制中獲益。
如果 redis 被訪問的比較頻繁,可以使用 BGSAVE 代替 SAVE 來異步創建 RDB 備份
如果 redis 不是使用 docker 來使用的,/data 目錄可以在 redis-cli 中使用 CONFIG GET dir 來獲取保存 rdb 文件的目錄,默認保存的 RDB 文件名稱是 dump.rdb,如果有修改過,可以通過 CONFIG GET dbfilename 來獲取當前使用的文件名
References
https://redis.io/topics/persistence
http://redis.cn/topics/persistence.html
總結
以上是生活随笔為你收集整理的Redis 通过 RDB 方式进行数据备份与还原的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社区 正式发布了跨平台的 CoreWCF
- 下一篇: MySQL优化从执行计划开始(expla