hhdb資料庫介紹(9-5)

恒辉信达發表於2024-11-26

備份恢復

使用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語句,計算節點不支援匯入,需手動建立使用者並賦權後匯入。

相關文章