使用 mysqldump 工具的優點是簡單易用、容易上手,缺點是停機時間較長,因此它適用於資料量不大,或者允許停機的時間較長的情況。

背景資訊

由於 RDS 提供的關係型資料庫服務與原生的資料庫服務完全相容,所以對使用者來說,將原有資料庫遷移到 RDS 執行個體的過程,與從一個 MySQL 伺服器遷移到另外一台 MySQL 伺服器的過程基本類似。

前提條件

  • 已對RDS 執行個體設定白名單,申請外網地址,以及建立資料庫和帳號。具體可參見快速入門
  • 已購買Elastic Compute Service。

操作步驟

在正式遷移之前,需要先在本機資料庫中建立遷移帳號,並將要遷移的資料庫的讀寫權限授權給遷移帳號。

  1. 在本機資料庫中建立遷移帳號。
    CREATE USER'username'@'host' IDENTIFIED BY 'password';

    參數說明:

    • username:要建立的帳號
    • host:指定該帳號登入資料庫的主機。如果是本機使用者可以使用 localhost,如果想讓該使用者從任意主機登入,可以使用萬用字元 %
    • password:該帳號的登入密碼

    例:要建立帳號為 William,密碼為 Changme123 的帳號從任意主機登入本機資料庫,命令如下:

    CREATE USER'William'@'%' IDENTIFIED BY 'Changme123';
  2. 在本機資料庫中給遷移帳號授權。
    GRANT SELECT ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
    GRANT REPLICATION SLAVE ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

    參數說明:

    • privileges:該帳號的操作許可權,如 SELECTINSERTUPDATE 等。如果要授權該帳號所有許可權,則使用 ALL
    • databasename:資料庫名。如果要授權該帳號所有的資料庫許可權,則使用萬用字元 *
    • tablename:表名。如果要授權該帳號所有的表許可權,則使用萬用字元 *
    • username:要授權的帳號名
    • host:授權登入資料庫的主機名稱。如果是本機使用者可以使用 localhost,如果想讓該使用者從任意主機登入,可以使用萬用字元 %
    • WITH GRANT OPTION:授權該帳號能使用GRANT命令,該參數為可選

    例:授權帳號 William 對所有資料庫和表的所有許可權,並可以從任意主機登入本機資料庫,命令如下。

    GRANT ALL ON*.* TO 'William'@'%';
  3. 使用 mysqldump 的資料匯出工具,將本機資料庫資料匯出為資料檔案。
    说明 匯出期間請勿進行資料更新。本步驟僅僅匯出資料,不包括預存程序、觸發器及函數。
    mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName --skip-triggers > /tmp/dbName.sql

    參數說明:

    • localIp:本機資料庫伺服器 IP 位址
    • userName:本機資料庫的遷移帳號
    • dbName:需要遷移的資料庫名
    • /tmp/dbName.sql:備份產生的檔案名稱
  4. 使用 mysqldump 匯出預存程序、觸發器和函數。
    说明 若資料庫中沒有使用預存程序、觸發器和函數,可跳過此步驟。在匯出預存程序、觸發器和函數時,需要將 definer 去掉,以相容 RDS。
    mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/triggerProcedure.sql

    參數說明:

    • localIp:本機資料庫伺服器 IP 位址
    • userName:本機資料庫的遷移帳號
    • dbName:需要遷移的資料庫名
    • /tmp/triggerProcedure.sql:備份產生的檔案名稱
  5. 將資料檔案和預存程序檔案上傳到 ECS 上。

    本例以檔案上傳到如下路徑為例。

    /tmp/dbName.sql
    /tmp/triggerProcedure.sql
  6. 登入 ECS,將資料檔案和預存程序檔案匯入到目標 RDS 中。
    mysql -h intranet4example.mysql.rds.aliyuncs.com –u userName -p dbName < /tmp/dbName.sql
    mysql -h intranet4example.mysql.rds.aliyuncs.com -u userName -p dbName < /tmp/triggerProcedure.sql

    參數說明:

    • intranet4example.mysql.rds.aliyuncs.com:RDS 執行個體串連地址,本例以內網地址為例
    • userName:RDS 資料庫的遷移帳號
    • dbName:需要匯入的資料庫名
    • /tmp/dbName.sql:要匯入的資料檔案名
    • /tmp/triggerProcedure.sql:要匯入的預存程序檔案名稱