備份恢復
使用mysqldump備份
mysqldump - 資料庫備份程式
計算節點支援mysqldump功能,用法同MySQL一樣。
使用mysqldump從計算節點匯出資料時,要求指定新增如下引數:
--set-gtid-purged=OFF --no-tablespaces --skip-triggers --single-transaction --default-character-set=utf8mb4 --complete-insert --compact --skip-tz-utc [--replace|--insert-ignore] [--hex-blob] [--where=xxx]
使用mysqldump匯出資料,再匯入計算節點時,要求新增如下引數:
--no-defaults --no-tablespaces --complete-insert --default-character-set=utf8mb4 --hex-blob --master-data=2 --no-create-db --set-gtid-purged=OFF --single-transaction --skip-add-locks --skip-disable-keys --skip-triggers --skip-tz-utc [--replace|--insert-ignore] [--no-create-info|--no-data] [--where=xxx] --databases xxx
注意
default-character-set引數的值請根據實際情況填寫,例如utf8或utf8mb4等。
若未使用指定引數,可能會出現時間差的問題,以及對於部分不支援的功能命令會報錯。
使用二進位制日誌(增量)恢復
mysqlbinlog - 處理二進位制日誌檔案的實用程式
計算節點支援mysqlbinlog命令,mysqlbinlog命令能夠解析binlog檔案用於同步增量資料,從而減少了將單機資料遷移至計算節點時的停機時間。使用mysqlbinlog連線遠端例項獲取binlog檔案並解析出其中的SQL語句,然後交由計算節點執行,從而將某個資料庫的增量資料匯入到計算節點某個邏輯庫下。首先,登入到管理埠(預設埠為3325),執行dbremapping命令新增資料庫對映關係,關於dbremapping命令用法,請參考計算節點管理命令文件。
dbremapping @@add@期望被匯入的資料庫名:邏輯庫名
然後使用mysqlbinlog語句執行選中部分的binlog中SQL語句,要求使用如下語法與引數:
mysqlbinlog -R -h主機名 -P埠號 -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=資料庫名 --start-position=binlog起始位置 binlog檔名 | mysql -u使用者名稱 -p密碼 -h伺服器 -P服務埠 -c --show-warnings=false
注意
--to-last-log可替換為--stop-position,指定binlog終止位置而非執行到最新的binlog位置。此命令需要跟遠端連線的例項同版本。
例如希望將192.168.200.77:3306中的物理庫db01匯入計算節點192.168.210.30中的邏輯庫logicdb01:
1.先至192.168.210.30登入到管理埠3325,執行:
dbremapping @@add@db01:logicdb01
2.然後在192.168.210.30伺服器上執行如下命令:
mysqlbinlog -R -h 192.168.200.77 -P3306 -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=db01 --start-position=0 mysql-bin.000009 | mysql -uroot -proot --h192.168.210.30 --P3323 -c -A
mysqldump與mysqlbinlog的實際應用
此小節將展示如何在實際應用場景中,結合mysqldump的完整備份與mysqlbinlog的增量備份,將資料從源端單機資料庫中遷移到HHDB Server中。
注意
整個操作過程中,不建議在資料遷移的源端或計算節點執行任何的DDL、引數變更等等非常規的操作動作。由於單執行緒操作且受網路延遲制約,此方式追資料的執行速度會慢於儲存節點複製的執行速度,因此不保證計算節點的執行速度能夠滿足實時追上的要求,有可能存在資料延遲不斷增大的現象,此時需要尋找業務低谷重試,或者另外規劃方案。
場景描述:希望將源端192.168.210.45:3309(該例項為有生產資料的普通儲存節點)中的物理庫db01匯入計算節點192.168.210.32中的邏輯庫logicdb01,參考步驟如下:
1.使用mysqldump從資料遷移的源端(即192.168.210.45:3309)匯出表結構,在192.168.210.45伺服器上執行如下命令(必須新增如下引數):
mysqldump --no-defaults -h127.0.0.1 -P3309 -uhotdb_datasource -photdb_datasource **--no-data** --skip-triggers --set-gtid-purged=OFF --no-tablespaces --single-transaction --default-character-set=utf8mb4 --hex-blob --no-create-db --skip-add-locks --skip-disable-keys --skip-tz-utc --databases db01 >db01.sql
2.將表結構的SQL檔案上傳至計算節點所在伺服器,即192.168.210.32後,登入到計算節點上執行如下命令,匯入表結構成功:
source /root/db01.sql
3.使用mysqldump從資料遷移的源端(即192.168.210.45:3309)匯出表資料,在192.168.210.45伺服器上執行如下命令(必須新增如下引數):
mysqldump --no-defaults -h127.0.0.1 -P3309 -uhotdb_datasource -photdb_datasource **--no-create-info** --skip-triggers --set-gtid-purged=OFF --no-tablespaces --single-transaction --default-character-set=utf8mb4 --hex-blob --master-data=2 --no-create-db --skip-add-locks --skip-disable-keys --skip-tz-utc --databases db01 >db01-1.sql
4.開啟表資料的匯出檔案,檢視當前binlog位置,如下顯示則binlog位置為2410,binlog檔案為mysql-bin.000076:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000076', MASTER_LOG_POS=2410;
5.將表資料的SQL檔案上傳至計算節點所在伺服器,即192.168.210.32後,登入到計算節點上執行如下命令,匯入表資料成功:
source /root/db01.sql
特別注意,如果使用了外來鍵,需要額外執行以下命令:
set foreign_key_checks=0
source /root/db01.sql
執行過程中,應密切關注是否出現警告或錯誤,否則可能會出現資料會不一致的問題。
提示
如果業務資料沒有資料亂碼問題,可以考慮split切分檔案,並行匯入計算節點以加快處理速度。
6.使用mysqlbinlog做增量資料同步。若源端資料庫名與計算節點的邏輯庫名不相同,則需要在管理埠先新增資料庫對映關係,例如:
dbremapping @@add@db01:logicdb01
然後到計算節點(192.168.210.32)所在伺服器上執行如下命令,binlog開始位置為第四步記錄的位置(此例子中為2410,binlog檔案為mysql-bin.000076):
mysqlbinlog -R -h192.168.210.45 -P3309 -uhotdb_datasource -photdb_datasource -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=db01 **--start-position=2410 mysql-bin.000076** | mysql -uroot -proot --h192.168.210.32 --P3323 -c -A
為了加快追資料的速度,建議執行mysqlbinlog命令的伺服器就是計算節點所在伺服器,這樣節省了命令列客戶端執行SQL時SQL和ok包透過網路來回的時間開銷,可以極大提高計算節點單執行緒執行SQL的速度。
7.核對資料同步的正確性:此時需要進行必要的短時停服,中斷業務系統向資料庫的寫入操作。透過人工在源端執行一條特殊資料後檢視該條資料是否已經同步。等到確認計算節點已經追完最新資料後,停止mysqlbinlog命令,若需要的話,取消資料庫名稱對映。
提示
可以在源端都執行如下命令後,將執行結果中出現的SQL語句複製後,在源端和計算節點都執行一遍,檢視執行結果是否一致來大致地判斷資料是否一致;
use xxx # 邏輯庫名
set session group_concat_max_len=1048576;
set @mytablename='xxx'; # 表名
set @mydbname=database();
select concat('select sum(crc32(concat(ifnull(',group_concat(column_name separator ','NULL'),ifnull('),','NULL')))) as sum from ',table_name,';') as sqltext from information_schema.columns where table_schema=@mydbname and table_name=@mytablename G
若執行結果一致,則表資料大機率一致。
例如在源端(192.168.200.77)儲存節點中執行如下:
mysql> use db01
Database changed
mysql> set session group_concat_max_len=1048576;
Query OK, 0 rows affected (0.00 sec)
mysql> set @mytablename='table02';
Query OK, 0 rows affected (0.00 sec)
mysql> set @mydbname=database();
Query OK, 0 rows affected (0.00 sec)
mysql> select concat('select sum(crc32(concat(ifnull(',group_concat(column_name separator ',\'NULL\'),ifnull('),',\'NULL\')))) as sum from ',table_name,';') as sqltext from information_schema.columns where table_schema=@mydbname and table_name=@mytablename \G
*************************** 1. row ***************************
sqltext: select sum(crc32(concat(ifnull(id,'NULL'),ifnull(name,'NULL')))) as sum from table02;
1 row in set (0.00 sec)
msyql> select sum(crc32(concat(ifnull(id,'NULL'),ifnull(name,'NULL')))) as sum from table02;
+------------+
| sum |
+------------+
| 1812521567 |
+------------+
1 row in set (0.00 sec)
其結果(1812521567)與在計算節點執行結果一致,則table02表資料大機率一致。
使用mydumper備份/myloader恢復
mydumper備份
計算節點支援mydumper多執行緒備份工具,前提需要在server.xml中新增引數並執行動態載入:
<property name="skipFTWRLAndUnlockTables">1</property><!--對FTWRL語句的響應方式的開關-->
使用mydumper從計算節點匯出資料前,先建立備份檔案存放目錄,執行命令可參考如下:
mkdir -p /usr/local/mydumper
mydumper -h 192.168.210.130 -P 3323 -u root -p root -G -E -R -t 4 -c -o --hex-blob /usr/local/mydumper
推薦使用v0.13.1-1以上版本,否則無法支援--hex-blob引數,blob型別的表資料可能會錯誤。
備份完成後,在對應存放目錄下可見備份檔案格式如下:
更多詳細引數請參考mydumper --help
myloader恢復
使用myloader恢復資料,執行命令參考如下:
myloader -u root -p root -P 33236 -h 192.168.210.130 -B hotdb -d /usr/local/mydumper
更多詳細引數請參考myloader --help
使用mysqlpump備份
mysqlpump備份
計算節點支援mysqlpump功能,用法同MySQL一樣。前提需要在server.xml中新增引數並執行動態載入:
<property name="skipFTWRLAndUnlockTables">1</property><!--對FTWRL語句的響應方式的開關-->
使用mysqlpump從計算節點匯出資料時,要求指定新增如下引數:
--set-gtid-purged=OFF --skip-triggers --single-transaction --default-character-set=utf8mb4 --complete-insert --skip-tz-utc [--default-parallelism=xxx] [--replace|--insert-ignore] [--hex-blob] [--add-drop-user] [--users] [--exclude-databases|--exclude-tables] [--include-databases|--include-tables]
注意
1、default-character-set引數的值按實際情況填寫,如utf8、utf8mb4等。
2、若未使用指定引數,可能會出現時間差的問題,以及對於部分不支援的功能命令會報錯。
3、透過mysqlpump匯出的createuser語句,計算節點不支援匯入,需手動建立使用者並賦權後匯入。