本文介紹了通過mysqldump工具將PolarDB-X數據導入導出的幾種常見場景和詳細操作步驟。

PolarDB-X支持MySQL官方數據導出工具mysqldump。mysqldump命令的詳細說明請參見MySQL 官方文檔
說明 mysqldump適合小數據量(低于1000萬)的離線導入導出。如果需要完成更大數據量或者實時的數據遷移任務,建議使用DTS。

mysqldump工具介紹

mysqldump能夠導出表結構信息和表內數據,并轉化成SQL語句的格式方便用戶直接導入,SQL語法如下:

DROP TABLE IF EXISTS `table_name`;
CREATE TABLE `table_name` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    ...
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`id`);
INSERT INTO `table_name` VALUES (...),(...),...;
INSERT INTO `table_name` VALUES (...),(...),...;
...

mysqldump工具導出數據的命令使用方式舉例:

mysqldump -h ip -P port -u user -pPassword --default-character-set=char-set --net_buffer_length=10240 --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset  [--hex-blob] [--no-data] database [table1 table2 table3...] > dump.sql

mysqldump的參數說明可通過mysqldump --help命令查看或查詢MySQL 官方文檔,常用參數說明如下,請根據實際情況輸入:

參數名說明
ipPolarDB-X實例的IP。
portPolarDB-X實例的端口。
userPolarDB-X的用戶名。
passwordPolarDB-X的密碼,注意前面有個-p,之間沒有空格。
char-set指定的編碼。
--hex-blob使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使用本選項。影響的字段類型包括BINARY、VARBINARY、BLOB。
--no-data不導出數據。
table指定導出某個表。默認導出該數據庫所有的表。
--no-create-info不導出建表信息。
--net_buffer_length傳輸緩沖區大小。影響Insert語句的長度,默認值1046528。
導出的SQL語句格式文件,有兩種方法導入數據庫中:
  • SOURCE語句導入數據
    1. 登錄數據庫。
      mysql -h ip -P port -u user -pPassword --default-character-set=char-set 
    2. 通過source語句執行文件中的sql語句導入數據。
      source dump.sql
  • MySQL命令導入數據
    mysql -h ip -P port -u user -pPassword --default-character-set=char-set< /yourpath/dump.sql

下面從不同場景介紹mysqldump工具的使用實例。

PolarDB-X和MySQL之間數據傳輸時不推薦導出表結構,因為PolarDB-X包含分庫分表功能,CREATE TABLE(DRDS模式)中的拆分函數等與MySQL不兼容,不兼容的關鍵字包括:
  • DBPARTITION BY hash(partition_key)
  • TBPARTITION BY hash(partition_key)
  • TBPARTITIONS N
  • BROADCAST

如果導出表結構,需在導出的SQL語句文件中修改建表語句,才能正確導入。所以推薦只導出表內數據,手動登錄數據庫進行建表操作,然后再導入數據。

場景一:從MySQL導入到PolarDB-X

從MySQL導入數據到PolarDB-X,請按照以下步驟進行操作。

  1. 從MySQL中導出數據到文件。

    輸入以下命令,從MySQL中導出表內數據(不推薦導出表結構),假設導出文件為dump.sql。

    mysqldump -h ip -P port -u user -pPassword --default-character-set=char-set --net_buffer_length=204800 --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset --hex-blob database [table1 table2 table3...] > dump.sql
  2. 登錄PolarDB-X,手動建立目標表,關于PolarDB-X建表語句的語法請參見CREATE TABLE(DRDS模式)。如果未加--no-create-info參數,導出的dump.sql文件中包含MySQL端的建表語句,也可在文件中修改建表語句。
  3. 導入數據文件到PolarDB-X中。您可以通過如下兩種方式導入數據文件到PolarDB-X
    • 通過mysql -h ip -P port -u user -pPassword --default-character-set=char-set命令登錄目標PolarDB-X,執行source /yourpath/dump.sql命令將數據導入到目標PolarDB-X
    • 直接通過mysql -h ip -P port -u user -pPassword --default-character-set=char-set< /yourpath/dump.sql命令將數據導入到目標PolarDB-X
    說明
    • 上述兩個命令中default-character-set要設置成實際的數據編碼。如果是Windows平臺,source命令指定的文件路徑需要對分隔符轉義。
    • 第一種方式會把所有的步驟回顯到屏幕上,速度略慢,但是可以觀察導入過程。
    • 導入時由于某些PolarDB-X和MySQL實現上的不同,可能會報錯,錯誤信息類似ERROR 1231 (HY000): [a29ef6461c00000][10.117.207.130:3306][****]Variable @saved_cs_client can't be set to the value of @@character_set_client。此類錯誤信息并不影響導入數據的正確性。

場景二:從一個PolarDB-X導入到另一個PolarDB-X

假設您之前有一個測試環境的PolarDB-X,測試完畢以后,需要把測試過程中的一些表結構和數據導入到生產環境的PolarDB-X中,那么可以按照以下步驟進行操作。

  1. 從源PolarDB-X中導出數據到文本文件。請參見場景一步驟一。
  2. 導入數據文件到PolarDB-X。請參見場景一步驟三。
  3. 手動創建Sequence對象。
    mysqldump并不會導出PolarDB-X中的Sequence對象,所以如果在源PolarDB-X中使用了Sequence對象,并且需要在目標PolarDB-X中繼續使用相同的Sequence對象,則需要手動在目標PolarDB-X中創建同名的Sequence的對象。具體步驟如下:
    1. 在源PolarDB-X上執行SHOW SEQUENCES,獲取當前PolarDB-X中Sequence對象的狀態。
    2. 在目標PolarDB-X數據庫上通過CREATE SEQUENCE命令創建新的Sequence對象。

    Sequence命令詳情請參見Sequence

場景三:從PolarDB-X導出數據到MySQL

PolarDB-X導出數據到MySQL,和在PolarDB-X之間相互導入數據的過程類似,也分為以下幾個步驟。
  1. 從源PolarDB-X中導出數據到文本文件。請參見場景一步驟一。
  2. 登錄MySQL,手動創建目標表。如果導出數據包含建表語句,則需要在導出文件中修改建表語句,刪除PolarDB-X中不兼容MySQL的關鍵字等信息。

    例如PolarDB-X中的某個拆分表:

    CREATE TABLE `table_name` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        ...
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

    需去掉MySQL不兼容的拆分函數語句,改成:

    CREATE TABLE `table_name` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        ...
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
  3. 導入數據文件到PolarDB-X。請參見場景一步驟三。

FAQ

  1. 問題:使用--all-databases導出所有庫失敗,沒有任何數據輸出,但是單獨指定庫可以導出。

    原因:mysqldump在所有庫導出時,會先嘗試去找到名為mysql的系統庫,但是PolarDB-X不存在名為mysql的系統庫,因此導出失敗。

    解決方法:在PolarDB-X中創建一個庫名為mysql的空庫即可,但是導入時也會導入一個空的名為mysql的庫;避免使用--all-databases一次性導出所有庫,而是指定庫導出。

  2. 問題:mysqldump報錯when trying to dump tablespace

    原因PolarDB-X沒有tablespace(表空間)的概念。

    解決方法:mysqldump加入參數--no-tablespaces

  3. 問題:mysqldump報錯SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-bucket-specified"') FROM information_schema.COLUMN_STATISTICS ...

    原因:查詢列統計信息時,因不兼容的JSON格式報錯。

    解決方法:mysqldump加入參數--column-statistics=0,跳過導出統計信息。

  4. 問題:mysqldump報錯Couldn't execute 'SHOW TRIGGERS ...'

    原因PolarDB-X不支持triggers(觸發器)。

    解決方法:mysqldump加入參數--skip-triggers

  5. 問題:無主鍵表導入時,報錯Duplicate entry '0' for key 'PRIMARY'

    原因:Dump出的文件中設置了NO_AUTO_VALUE_ON_ZERO的sql_mode,導致主鍵沖突。

    解決方法:將dump出來文件中設置sql_mode中的NO_AUTO_VALUE_ON_ZERO字段刪掉。