阿里雲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)
$ 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 應用完畢後,增量恢復完成。