关系数据库MySQL版

使用mysqldump迁移MySQL数据

2024-06-13 07:52:23

前期准备

          准备能够远程连接关系数据库MySQL的机器。

          通过弹性云服务器连接关系数据库MySQL,需要创建一台弹性云服务器。

          通过公网地址连接关系数据库MySQL,需要将关系数据库MySQL绑定公网地址。

          关系数据库MySQL实例设置白名单。

          在准备的弹性云服务器或其他可访问关系数据库MySQL的设备上,安装MySQL客户端。

          创建关系数据库MySQL账号。

²  说明

弹性云服务器或可访问关系数据库MySQL的设备需要安装和关系数据库MySQL相同版本的数据库客户端。(如果不相同则只能够向后兼容,例如用5.7版本的mysqldump来导出5.5版本的数据库数据)

适用场景

          mysqldump迁移复杂,且需要停止源数据库的应用程序,建议数据量小的场景下使用。

          数据量大的场景下建议优先使用DTS迁移数据。

导出数据

需要先对源数据库进行导出,才能将其迁移到关系数据库MySQL。

1.        登录源数据库。

2.        使用mysqldump导出自建数据库的表结构和数据,命令如下:

²  说明

          数据库迁移为离线迁移,您需要停止使用源数据库的应用程序。

          下文中的自建数据库用户需要具备相关的操作权限。

          若使用的mysqldump低于5.6版本,需要去掉“--set-gtid-purged=OFF”。

mysqldump -h <自建数据库地址> -u <自建数据库用户> -p --database <自建数据库> --opt --default-character-set=utf8 --hex-blob --single-transaction --set-gtid-purged=OFF --skip-triggers --skip-events --no-create-routines > /tmp/<自建数据库名>_data.sql

示例:

mysqldump -h xxx -u root -p --databases test --opt --default-character-set=utf8 --hex-blob --single-transaction --set-gtid-purged=OFF --skip-triggers --skip-events --skip-routines > /tmp/test_data.sql

3.        使用mysqldump导出自建数据库的触发器、事件、存储过程和函数,命令如下:

²  说明

如果源数据库中没有使用触发器、事件、存储过程和函数,可跳过此步骤。

mysqldump -h <自建数据库地址> -u <自建数据库用户> -p --database <自建数据库> --opt --default-character-set=utf8 --hex-blob --single-transaction --set-gtid-purged=OFF --no-create-info --no-data --routines --events | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > /tmp/<自建数据库名>_trigger.sql

示例:

mysqldump -h xxx -u root -p --databases test --opt --default-character-set=utf8 --hex-blob --single-transaction --set-gtid-purged=OFF --no-create-info --no-data --routines --events | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > /tmp/test_trigger.sql

导入数据

使用适当的客户端,通过可连接关系数据库MySQL的设备,将上一步中导出的SQL文件导入到关系数据库MySQL的设备中,本例导出的SQL文件路径为/tmp。

²  说明

如果源数据库包含触发器、存储过程、函数或事件,则需要设置目标数据库参数log_bin_trust_function_creators=ON。

1.        登录已准备的弹性云服务器,或可访问关系数据库MySQL的设备。

2.        客户端连接关系数据库MySQL实例,将导出的两个文件上传到实例上。

3.        导入数据到关系数据库MySQL,命令如下:

mysql -h <关系数据库MySQL实例地址> -P <关系数据库MySQL实例端口号> -u<关系数据库MySQL实例账号> -p < /tmp/<自建数据库>_data.sql
 mysql -h <关系数据库MySQL实例地址> -P <关系数据库MySQL实例端口号> -u<关系数据库MySQL实例账号> -p < /tmp/<自建数据库>_trigger.sql

示例:

mysql -h xxx -P xxx -uroot -p < /tmp/test_data.sql
 mysql -h xxx -P xxx -uroot -p < /tmp/test_trigger.sql

4.        导入成功后,登录关系数据库MySQL中查看数据是否正常。

常见问题

          Q:ERROR 1273 (HY000) at line xx: Unknown collation: 'utf8mb4_0900_ai_ci'报错怎么解决?
A:可能是源数据库使用了与目标数据库不兼容的字符集,将utf8mb4_unicode_ci替换为utf8_general_ci、utf8mb4替换为utf8即可。

          Q:ERROR 1046 (3D000) at line xx: No database selected报错怎么解决?
A:可能是将单表导出的数据再进行导入,建议指定待导入的数据库(test_db),示例: mysql -h xxx -P xxx -uroot -p test_db < /tmp/test_data.sql。


UGtI4oxyxaK4