1. 程式人生 > >阿里雲RDS(mysql)異機全量增量恢復

阿里雲RDS(mysql)異機全量增量恢復

使用阿里雲的RDS服務(也就是MySQL資料庫)時,有時需要將其資料取出後拿到別的機器上使用,這就需要進行RDS的異機恢復。

說明:本文恢復使用的機器環境為CentOS 6.5 x64。

1. 獲取備份下載地址

RDS控制檯 -> 備份恢復 -> 資料備份,選擇需要下載的備份集,點選“下載”。


點選“複製外網地址” 來獲取備份的外網下載地址。


日誌備份的地址在RDS控制檯 -> 備份恢復 -> 日誌備份 獲取:


這裡一定要注意BINLOG所在例項編號與前一步下載的全量備份的例項編號要一致。

2. 通過 wget 工具下載

使用 wget 工具進行下載,注意 URL 需要以英文單引號引起。下載全量資料庫備份,注意目標檔案一定要是.tar.gz型別:

wget -c 'http://rdsbak-bjc.oss-cn-beijing-c.aliyuncs.com/custins1510101/hins1653857_data_20161129032359.tar.gz?OSSAccessKeyId=c9gzsqpauj3duw5whwdv40hb&Expires=1480579143&Signature=qyghsYvXP39Xv%2FNaxLAH%2F164dT4%3D' -O mysql-1129.tar.gz

# -c 引數使 wget 工具在連線中斷的時候嘗試斷點續傳。
# -O 引數將下載的結果儲存為指定的檔案(建議使用 URL 中包含的檔名)。

下載日誌檔案,目標檔案要是.tar型別:

wget -c 'http://rdslog-bj.oss-cn-beijing.aliyuncs.com/custinsxxxx/hostinsxxxx/mysql-bin.001150.tar?OSSAccessKeyId=cxxzsxxxx&Expires=9999999&Signature=QxxxxxEwD' -O mysql-bin.001150.tar


3. 解壓備份檔案

解壓備份檔案:
bash rds_backup_extract -f /home/mysql/backup/hins575175_xtra_20150429091224.tar.gz -C /home/mysql/data

如下圖:


查詢解壓後生成的檔案,其中藍色字型的目錄檔案為備份生成時 RDS 存在的資料庫


4. 恢復資料檔案

解壓備份檔案前,要先安裝好 Percona-XtraBackup 工具,最好不要用RPM方式安裝,太容易報錯。然後執行下面的命令:
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data


這一步最後如果看到類似如下輸出,顯示 completed OK,表示執行成功:

5. 配置檔案修改

由於存在的版本問題,請將解壓檔案 backup-my.cnf 中的 innodb_fast_checksum、innodb_page_size 、innodb_log_block_size 註釋掉,如下圖:


6. 修改檔案屬主

修改檔案屬主,並檢查檔案所屬為mysql使用者。
chown -R mysql:mysql /home/mysql/data

7.啟動mysqld程序並且登入驗證

啟動mysqld程序,並驗證啟動成功
mysqld_safe --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &


8.客戶端登入mysql驗證


 注意:
 恢復完成後,表 mysql.user 中是不包含 RDS 中建立的使用者,需要新建。
 新建使用者前請執行如下 SQL:
delete from mysql.db where user<>'root' and char_length(user)>0;
delete from mysql.tables_priv where user<>'root' and char_length(user)>0;
flush privileges;

因為軟體限制,目前恢復只支援 Linux 下進行。Linux下恢復的資料檔案,無論 Windows、Linux 作業系統,MySQL 都可以正常使用。

9.建立可以遠端登入的 root 賬號

mysql -uroot -P3306 -h127.0.0.1
mysql> grant all privileges on *.* to [email protected]'%' identified by 'root';
mysql> flush privileges;

10.確定需要增量應用 binlog 的起止點

#到在備份集解壓目錄下

cat xtrabackup_binlog_info
mysql-bin.000688531167

# mysql-bin.000688 是應用的起始 binlog 檔案, 531167 是開始位點(start position)

從控制檯下載相同 “備份所在例項編號” 的恢復所需 binlog 檔案。在本例中,增量恢復涉及到 mysql-bin.000688,mysql-bin.000689 檔案。下載後使用 tar 命令解壓:

$ tar xvpf mysql-bin.000688.tar 

$ tar xvpf mysql-bin.000689.tar 


通過 mysqlbinlog 命令分析 mysql-bin.000689 檔案內容,確定增量恢復到的時間點。

mysqlbinlog -v --base64-output=decode-rows mysql-bin.000689 > 689.log
vi 689.log
# 請使用者自行根據情況確定要恢復到的時間

11.確定時間點後,進行增量恢復。

mysqlbinlog mysql-bin.000688 mysql-bin.000689 --start-position=531167  --stop-datetime="16-05-16 18:05:03" | mysql -uroot -pyour_password -P3306 -hyour_host_ip

# -p 引數和 your_password 間不要有空格, your_password 請自行替換為實際密碼
# -h 引數後請指定非 127.0.0.1 的主機 IP

# mysqlbinlog 命令格式: 
# mysqlbinlog binlog_file1 binlog_file2 ... binlog_filen --start-position=xxxx  --stop-datetime="YY-mm-dd hh:mm:ss" | mysql -uroot -pyour_password -Pmysql_port -hyour_host_ip

# mysqlbinlog 其他可以使用的引數
# --database db_name 指定僅增量恢復指定資料庫 db_name 的資料
# --start-position 指定開始恢復的 binlog 位點,該位點應存在於指定的第一個 binlog 檔案。
# --stop-position 指定恢復到的 binlog 位點,該位點應存在於指定的最後一個 binlog 檔案。
# --start-datetime 指定開始恢復的時間點(從第一個等於或大於該時間點的 binlog 事件開始)。
# 以本地時間時區為準,格式為 MySQL 可以接受的時間格式,比如"2016-05-16 08:01:05" 或 "16-05-16 08:01:05"。
# --stop-datetime 指定停止恢復的時間點(在第一個等於或大於該時間點的 binlog 事件停止)。
# 以本地時間時區為準,格式為 MySQL 可以接受的時間格式,比如"2016-05-16 08:01:05" 或 "16-05-16 08:01:05"。

待 binlog 應用完畢後,增量恢復完成。