
# 使用mysqldump迁移RDS for MySQL数据
#### 迁移准备
云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。
1. 准备弹性云服务器或可通过公网访问云数据库RDS。
   - 通过弹性云服务器连接云数据库RDS实例，需要创建一台弹性云服务器。
   
   - 通过公网地址连接云数据库RDS实例，需具备以下条件。
     1. 先对云数据库RDS实例绑定公网地址，如何绑定公网地址，请参见[绑定弹性公网IP](https://support.huaweicloud.com/usermanual-rds-mysql/rds_public_accessibility.html#rds_public_accessibility__section3199593620428)。
     
     2. 保证本地设备可以访问云数据库RDS实例绑定的公网地址。
      
    
2. 在准备的弹性云服务器或可访问云数据库RDS的设备上，安装MySQL客户端，详见[5](https://support.huaweicloud.com/usermanual-rds-mysql/rds_mysql_connect_05.html#rds_mysql_connect_05__li18853175711232)。
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   该弹性云服务器或可访问云数据库RDS的设备需要安装和RDS for MySQL数据库服务端相同版本的数据库客户端，MySQL数据库或客户端会自带mysqldump和mysql工具。
   数据迁移到云数据库RDS后可能要面对更改IP的问题，为减少客户业务更改，降低迁移难度，支持更改内网IP，具体请参见[修改内网地址](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0024.html)。
   云数据库RDS的系统库mysql和sys不支持导入到RDS for MySQL实例。
   
 
#### 导出数据
要将源数据库迁移到云数据库RDS，需要先对其进行导出。
![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
- 相应导出工具需要与数据库引擎版本匹配。
- 数据库迁移为离线迁移，您需要停止使用源数据库的应用程序。
- 导出或导入数据时，请谨慎，避免因操作不当导致实例或业务异常。
 
1. 登录源数据库。
2. 使用mysqldump将表结构导出至SQL文件。
   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
   mysql数据库是云数据库RDS服务管理所必须的数据库，导出表结构时，禁止指定**--all-database**参数，否则会造成数据库故障。
   ```
   mysqldump --databases <DB_NAME> --single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u <DB_USER> -p -h <DB_ADDRESS> -P <DB_PORT> |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > <BACKUP_FILE>
   ```
   - DB_NAME为要迁移的数据库名称。
   
   - DB_USER为数据库用户。
   
   - DB_ADDRESS为数据库地址。
   
   - DB_PORT为数据库端口。
   
   - BACKUP_FILE为导出生成的文件名称*。*
   
   
   根据命令提示输入数据库密码。
   示例如下：
   ```
   mysqldump --databases rdsdb --single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u root -p -h 192.168.151.18 -P 3306 |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > dump-defs.sql
   Enter password:
   ```
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   若使用的mysqldump低于5.6版本，需要移除"--set-gtid-purged=OFF"。
   命令执行完会生成"dump-defs.sql"文件，如下：
   ```
   [rds@localhost ~]$ ll dump-defs.sql
   -rw-r-----. 1 rds rds 2714 Sep 21 08:23 dump-defs.sql
   ```
   
   
3. 使用mysqldump将数据导出至SQL文件。 
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
   mysql数据库是云数据库RDS服务管理所必须的数据库，导出数据时，禁止指定**--all-database**参数，否则会造成数据库故障。
   ```
   mysqldump --databases <DB_NAME> --single-transaction --hex-blob --set-gtid-purged=OFF --no-create-info --skip-triggers -u <DB_USER> -p -h <DB_ADDRESS> -P <DB_PORT> -r <BACKUP_FILE>
   ```
   以上命令的参数说明如[2]所示。
   根据命令提示输入数据库密码。
   示例如下：
   ```
   mysqldump --databases rdsdb --single-transaction --hex-blob --set-gtid-purged=OFF --no-create-info --skip-triggers -u root -p -h 192.168.151.18 -P 3306 -r dump-data.sql
   ```
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   若使用的mysqldump低于5.6版本，需要移除"--set-gtid-purged=OFF"。
   命令执行完会生成"dump-data.sql"文件，如下：
   ```
   [rds@localhost ~]$ ll dump-data.sql
   -rw-r-----. 1 rds rds 2714 Sep 21 08:23 dump-data.sql
   ```
   
   
 
#### 导入数据
通过弹性云服务器或可访问云数据库RDS的设备，用相应客户端连接云数据库RDS实例，将导出的SQL文件导入到云数据库RDS。
![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
如果源数据库中包含触发器、存储过程、函数或事件调用，则需确保导入前设置目标数据库参数log_bin_trust_function_creators=ON。
1. 登录已准备的弹性云服务器，或可访问云数据库RDS的设备。
2. 客户端连接云数据库RDS实例。
3. 导入表结构到云数据库RDS。 
   ```
   # mysql -f -h <RDS_ADDRESS> -P <DB_PORT> -u root -p < <BACKUP_DIR>/dump-defs.sql
   ```
   - RDS_ADDRESS为云数据库RDS实例的IP地址。
   
   - DB_PORT为当前数据库实例的端口。
   
   - BACKUP_DIR为"dump-defs.sql"所在目录。
   
   
   示例如下：
   ```
   # mysql -f -h 172.16.66.198 -P 3306 -u root -p < dump-defs.sql
   Enter password:
   ```
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   如果是将单表导出的数据（即导出的SQL是某一张表的SQL语句，不包含数据库）再进行导入，建议指定待导入的数据库（mydb），否则可能会报错"No database selected"。示例：
   ```
   # mysql -f -h 172.16.66.198 -P 3306 -u root -p mydb < dump-defs.sql
   Enter password:
   ```
   
   
4. 导入数据到云数据库RDS。 
   ```
   # mysql -f -h <RDS_ADDRESS> -P <DB_PORT> -u root -p < <BACKUP_DIR>/dump-data.sql
   ```
   - RDS_ADDRESS为云数据库RDS实例的IP地址。
   
   - DB_PORT为当前数据库实例的端口。
   
   - BACKUP_DIR为"dump-data.sql"所在目录。
   
   
   示例如下：
   ```
   # mysql -f -h 172.16.66.198 -P 3306 -u root -p < dump-data.sql
   Enter password:
   ```
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   如果是将单表导出的数据（即导出的SQL是某一张表的SQL语句，不包含数据库）再进行导入，建议指定待导入的数据库（mydb），否则可能会报错"No database selected"。示例：
   ```
   # mysql -f -h 172.16.66.198 -P 3306 -u root -p mydb < dump-data.sql
   Enter password:
   ```
   
   
5. 查看迁移结果。 
   ```
   mysql> show databases;
   ```
   示例中，名为rdsdb的数据库已经被导入了：
   ```
   mysql> show databases;
   +--------------------+
   | Database           |
   +--------------------+
   | information_schema |
   | rdsdb              |
   | mysql              |
   | performance_schema 
   | sys
   +--------------------+
   4 rows in set (0.00 sec)
   ```
   
   
 
