1. 程式人生 > 資料庫 >Redis資料匯入匯出以及資料遷移的4種方法詳解

Redis資料匯入匯出以及資料遷移的4種方法詳解

1、aof 匯入方式。

因為這種方式比較簡單,所以我就先介紹它。

分兩步來實現,第一步先讓源 Redis 生成 AOF 資料檔案。

# 清空上文目標例項全部資料
redis-cli -h 目標RedisIP -a password flushall
# 源例項開啟 aof 功能,將在 dir 目錄下生成 appendonly.aof 檔案
redis-cli -h 源RedisIP -a password config set appendonly yes

dir 目錄,可以通過 config get dir 目錄獲得。

config get dir
# 比如我的 Mac 上執行上面的命令後,返回如下內容
1) "dir"
2) "/usr/local/var/db/redis"

通過上面的命令,我們可以看到我本地的 dir 目錄是:/usr/local/var/db/redis。

現在我們來做第二步操作,讓目標 Redis 例項匯入 aof 資料。

# 將 appendonly.aof 檔案放在當前路徑下
redis-cli -h 目標RedisIp -a password --pipe < appendonly.aof
# 源例項關閉 aof 功能
redis-cli -h 源RedisIp -a password config set appendonly no

上面的第一個命令,執行後,如果出現以下內容,則表示匯入 aof 資料成功。

All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0,replies: 5

我這裡是測試,資料比較少,所以提示有 5 個匯入成功了。

AOF 的缺點也很明顯,就是速度慢,並且如果內容多的話,檔案也比較大。而且開啟 AOF 後,QPS 會比 RDB 模式寫的 QPS 低。還有就是 AOF 是一個定時任務,可能會出現資料丟失的情況。

2、通過我的 xttblog_redis_mv.sh 指令碼來實現。

我的指令碼內容如下:

#!/bin/bash

#redis 源ip
src_ip=192.168.1.4
#redis 源port
src_port=6379

#redis 目的ip
dest_ip=127.0.0.1
#redis 目的port
dest_port=6389

#要遷移的key字首
key_prefix=

i=1

redis-cli -h $src_ip -p $src_port -a password keys "${key_prefix}*" | while read key
do
  redis-cli -h $dest_ip -p $dest_port -a password del $key
  redis-cli -h $src_ip -p $src_port -a password --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $dest_ip -p $dest_port -a password -x restore $key 0
  echo "$i migrate key $key"
  ((i++))
done

大家在使用的時候,只需要替換 IP 即可。

這個指令碼同樣有一個問題就是使用了 keys *,然後一個一個遍歷,如果是生產環境,不建議這樣使用!當然我的指令碼也是可以再進行優化的!

3、使用 redis-dump 工具。

Redis-Dump 是一個用於 Redis 資料匯入 / 匯出的工具,是基於 Ruby 實現的,可以方便的進行 redis 的資料備份。這個工具需要先安裝,以我的 Mac 為例,安裝教程如下:

# 沒安裝 ruby 的話,先安裝 ruby
brew install ruby
# 移除 gem 自帶源
gem sources --remove https://rubygems.org/ 
# 新增淘寶源
gem sources -a https://ruby.taobao.org/ 
# 安裝 redis-dump
gem install redis-dump -V

目前我發現,淘寶的映象已經出現 bad response Not Found 404 了,被告知映象維護站點已遷往 Ruby China 映象。

# 替換映象地址
gem sources --add http://gems.ruby-china.org/ --remove http://rubygems.org/
# 確認映象地址是否替換成功
gem sources -l
# 替換成功後再安裝 redis-dump
gem install redis-dump -V

安裝完成後,就可以使用 redis-dump 工具進行資料的匯入匯出了!

# redis-dump 匯出
redis-dump -u :password@源RedisIp:6379 > 源Redis資料檔案.json
# redis-load 匯入
cat 源Redis資料檔案.json | redis-load -u :password@目標RedisIp:6379

cat 源Redis資料檔案.json | redis-load -u :password@目標RedisIp:6379

Linux 系統或者 Window 系統也都類似,安裝 redis-dump 工具完成後直接使用 redis-dump 匯出,redis-load 匯入即可完成資料的備份與遷移。

redis-dump 工具很強大,建議大家到官網上多看看它的官方文件。

4、rdb 檔案遷移

redis-dump 麻煩就麻煩在需要進行安裝,如果我的 Redis 已經有備份機制,比如有 rdb 檔案,那麼我們直接遷移 rdb 檔案就可以達到同樣的目的。

首先,我們可以先關閉源 Redis 例項的 aof 功能。如果不關閉 aof,Redis 預設用 aof 檔案來恢復資料。

# 源例項關閉 aof 功能
redis-cli -h 源RedisIp -a password config set appendonly no

然後使用 save 命令把資料固化到 rdb 檔案中。

# 固化資料到 RDB 檔案
save

save 完成後,還是通過 config get dir 命令獲得儲存的 RDB 資料檔案位置。

接下來,我們需要殺死 redis 程序。殺掉當前 redis 的程序,否則下一步的複製 rdb 檔案,rdb 處於開啟的狀態,複製的檔案,會佔用同樣的控制代碼。

kill -9 redis
# 或者
pkill -9 redis
# 或者手段關閉 Redis 服務

然後複製源 redis 的 rdb 檔案到目標 Redis 的 dir 資料目錄,名字為你要遷移的 redis 的 rdb 檔名。

複製完成後,重啟目標 Redis 例項,資料就遷移完成了。 重啟完成後可以驗證一下資料是否成功的複製了。

更多關於Redis資料匯入匯出以及資料遷移的方法請檢視下面的相關連結