天天看點

使用者指南—資料導入和導出—使用mysqldump導入導出資料

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工具導出資料的指令使用方式舉例:

shell> 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 官方文檔

,常用參數說明如下,請根據實際情況輸入:

參數名 說明
ip PolarDB-X執行個體的IP。
port PolarDB-X執行個體的端口。
user PolarDB-X的使用者名。
password PolarDB-X的密碼,注意前面有個-p,之間沒有空格。
char-set 指定的編碼。
--hex-blob 使用十六進制格式導出二進制字元串字段。如果有二進制資料就必須使用本選項。影響的字段類型包括BINARY、VARBINARY、BLOB。
--no-data 不導出資料。
table 指定導出某個表。預設導出該資料庫所有的表。
--no-create-info 不導出建表資訊
--net_buffer_length 傳輸緩沖區大小。影響Insert語句的長度,預設值1046528。

導出的SQL語句格式檔案,有兩種方法導入資料庫中:

  • SOURCE語句導入資料
## 1.登入資料庫
shell> mysql -h ip -P port -u user -pPassword --default-character-set=char-set 
## 2.通過source語句執行檔案中的sql語句導入資料
mysql> source dump.sql      
  • mysql指令導入資料
shell> mysql -h ip -P port -u user -pPassword --default-character-set=char-set< /yourpath/dump.sql      

下面從不同場景介紹mysqldump工具的使用執行個體。

PolarDB-X和MySQL之間資料傳輸時不推薦導出表結構,因為PolarDB-X包含分庫分表功能,

CREATE TABLE

中的拆分函數等與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      
  1. 登入PolarDB-X,手動建立目标表,關于PolarDB-X建表語句的文法請參見 。如果未加--no-create-info參數,導出的dump.sql檔案中包含MySQL端的建表語句,也可在檔案中進行修改建表語句。
  2. 導入資料檔案到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

    • 上述兩個指令中

      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對象。
  1. Sequence指令詳情請參見 Sequence

場景三:從PolarDB-X導出資料到MySQL

從PolarDB-X導出資料到MySQL,和在PolarDB-X之間互相導入資料的過程類似,也分為以下幾個步驟。

  1. 登入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`);      
  1. 需去掉MySQL不相容的拆分函數語句,改成:
CREATE TABLE `table_name` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    ...
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;