mysql遷移之巨大數據量快速遷移方案-增量備份及恢復
--chenjianwen
一、前言:
當mysql庫的大小達到幾十個G或者上百G,遷移起來是一件非常費事的事情,業務中斷,導出導入耗費大量的時間;所以,需要考慮怎么去節省時間的問題。
二、方案:
1.全備數據,備份后得到新的 binlog 日志文件
2.將全備得到得 sql 大數據文件導入新庫中【期間消耗大量時間】
3.通過現在的 新的 binlog 日志文件 獲取期間增量的數據 mysql-000166.sql
4.將 mysql-000166.sql 直接導入到新庫中
5.修改業務連接mysql配置,啟動服務
三、優點
1.大大減少了導入新庫所需要的時間,相當於減少了業務中斷的時間
四、詳細實施步驟
1.全備數據庫#!/bin/bash###用於遷服前導出數據庫,並導入新的目標數據庫。放到遷移目標ip執行,減少sql文件傳輸時間
MY_PATH=$(cd `dirname $0`; pwd) cd $MY_PATH _start_time=`date +%F_%T` ip="192.168.1.30" #源服務器內網ip pub_ip="xxxx" #源服務器外網ip port=3306 time mysql -h${ip} -P${port} -uroot -pxxxx -e 'show databases;' | grep -Ev "Database|information_schema|mysql|performance_schema" | grep -v "^test$" | xargs mysqldump -uroot -pxxxx -h${ip} -P${port} --single-transaction --master-data=2 --flush-logs -BRE --set-gtid-purged=OFF --events > ./${pub_ip}_mysql.sql #time mysqldump -uroot -pxxxx -h${ip} -P${port} --single-transaction --master-data=2 --flush-logs -BRE --set-gtid-purged=OFF --events zombie108 > ./zombie108_mysql.sql if [ $? == 0 ];thentime mysql -h127.0.0.1 -P3306 -uroot -pxxx < ./${pub_ip}_mysql.sql mysql-000166.sql fi _end_time=`date +%F_%T` echo "start_time:${_start_time}" echo "end_time:${_end_time}"
注釋:
--single-transaction:獲取到innodb的一致性快照備份,不鎖表
--flush-logs:刷新binlog日志
-B:導出多個數據庫
-R:導出存儲過程以及自定義函數
-E:導出事件
--set-gtid-purged=OFF:關閉gtid復制
2.制定正式遷移時間,停止業務,獲取新增的binlog文件,將binglog轉換成sql【建議盡量在一兩天內完成,避免新增的binlog過大】
mysqlbinlog mysql-bin.000166 > mysql-bin.000166.sql
3.將 mysql-000166.sql 直接導入到新庫中
time mysql -h127.0.0.1 -P3306 -uroot -pxxx < ./mysql-000166.sql
4.修改業務連接mysql配置,啟動服