MySQL数据迁移相关总结

 更新时间:2021年04月29日 11:54:02   作者:MySQL技术  
这篇文章主要介绍了MySQL数据迁移的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下

前言:

在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表、某个库或某个实例。根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题。本篇文章,我们一起来看下 MySQL 数据迁移那些事儿,希望能帮助到各位。

  1.关于数据迁移

首先引用下维基百科中对数据迁移的解释:

数据迁移(data migration)是指选择、准备、提取和转换数据,并将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程。此外,验证迁移数据的完整性和退役原来旧的数据存储,也被认为是整个数据迁移过程的一部分。

数据迁移是任何系统实现、升级或集成的关键考虑因素,通常以尽可能自动化的方式执行,从而将人力资源从繁琐的任务中解放出来。

数据迁移有多种原因,包括服务器或存储设备更换、维护或升级、应用程序迁移、网站集成、灾难恢复和数据中心迁移。

对于 MySQL 数据库,也会经常碰到数据迁移的需求,比如说从测试库迁到开发库,或者从一台机器迁移到另一台机器,可能只是迁移一张表,也可能需要迁移整个数据库实例。对于不同的需求可能要采取不同的迁移方案,但总体来讲,MySQL 数据迁移方案大致可以分为物理迁移和逻辑迁移两类。

  2.迁移方案及注意点

物理迁移适用于大数据量下的整体迁移。物理迁移包括拷贝数据文件和使用 XtraBackup 备份工具两种。不同服务器之间可以采用物理迁移,我们可以在新的服务器上安装好同版本的数据库软件,创建好相同目录,建议配置文件也要和原数据库相同,然后从原数据库方拷贝来数据文件及日志文件,配置好文件组权限,之后在新服务器这边使用 mysqld 命令启动数据库。

使用物理迁移方案的优点是比较快速,但需要停机迁移并且要求 MySQL 版本及配置必须和原服务器相同,也可能引起未知问题。

相比来说,逻辑迁移适用范围更广,无论是部分迁移还是全量迁移,都可以使用逻辑迁移。逻辑迁移中使用最多的就是通过 mysqldump 等备份工具导出再导入了。

mysqldump 同样适用于不同版本不同配置之间的迁移,不过全量迁移时,笔者不建议使用 -A 参数备份全部数据库,特别是对于不同版本之间迁移,可能某些系统库稍有不同,迁移后容易出现未知问题。若使用 mysqldump 进行全量迁移,可以按照下面步骤操作:

# 原库执行 得到的创建数据库语句在新库执行 (排除系统库)
SELECT
  CONCAT( 'CREATE DATABASE IF NOT EXISTS ', '`', SCHEMA_NAME, '`', ' DEFAULT CHARACTER SET ', DEFAULT_CHARACTER_SET_NAME, ';' ) AS CreateDatabaseQuery 
FROM
  information_schema.SCHEMATA 
WHERE
  SCHEMA_NAME NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' );
  
 # 原库执行 得到的创建用户语句在新库执行 (排除系统用户)
 SELECT
  CONCAT( 'create user \'', USER, '\'@\'', HOST, '\'' ' IDENTIFIED BY PASSWORD \'', authentication_string, '\';' ) AS CreateUserQuery 
FROM
  mysql.`user` 
WHERE
  `User` NOT IN ( 'root', 'mysql.session', 'mysql.sys' );
  
# 原库执行 show grants 得到用户权限 然后逐一在新库执行 (也可以复制那几张权限表到新库)
show grants for 'testuser'@'%';

# 至此 新环境已经存在要迁移的库和用户 只是没有数据
# 原环境使用mysqldump备份除系统库外的所有库 
mysqldump  -uroot -pxxxx -R -E --single-transaction --databases db1 db2 > db.sql

# 然后导入新环境
mysql -uroot -pxxxx < db.sql

对于迁移部分库和部分表,也可以采用上方类似方案,只是备份时要按需备份,下面列举出几种常见的 mysqldump 备份场景:

# 备份单个库
mysqldump -uroot -pxxxxx -R -E --single-transactio --databases db1 > db1.sql

# 备份部分表
mysqldump -uroot -pxxxxx --single-transaction db1 tb1 tb2 > tb12.sql

# 排查某些表
mysqldump -uroot -pxxxxx db1 --ignore-table=db1.tb1 --ignore-table=db1.tb2 > db1.sql

# 只备份结构或数据
mysqldump -uroot -pxxxxx testdb --no-data > testdb_jiegou.sql
mysqldump -uroot -pxxxxx testdb --no-create-info > testdb_data.sql

总得来说,使用 mysqldump 方案更加灵活,为了快速迁移,我们应该尽量减少备份内容,比如说排除无用的日志表。对于一些大表,我们也可以采用单独迁移的方案,比方说,db1 中的 tb1 表特别大,我们可以在备份时先排除 tb1,对于大表 tb1 ,可以使用 LOAD DATA 方式或舍弃再导入表空间的方式来迁移。

数据迁移过程中,可能会遇到各种错误,一步步去解决即可。建议在新库创建好用户并授予好权限后再迁移,这样可以避免出现视图及函数导入错误,因为视图及函数有个定义者的概念。新环境执行导入时,最好使用 root 等具有 SUPER 权限的管理员用户,也可以避免一些因权限产生的问题。

迁移完成后,对于新环境,我们还应该再次进行检查,比如表的个数是否相同,随机抽查几张表,数据是否相同、是否有乱码等。只有确定无误才大功告成。

总结:

本篇文章介绍了 MySQL 数据库数据迁移相关方案及注意点,总结如下思维导图:

以上就是MySQL数据迁移相关总结的详细内容,更多关于MySQL数据迁移的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL获取当前时间、年月与年月日实例代码

    MySQL获取当前时间、年月与年月日实例代码

    日期和时间函数部分也是我们日常工作中使用频率比较高的一部分,下面这篇文章主要给大家介绍了关于MySQL获取当前时间、年月与年月日的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Mysql数据库group by原理详解

    Mysql数据库group by原理详解

    这篇文章主要为大家介绍了Mysql数据库group by的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • mysql查询表是否被锁的方法

    mysql查询表是否被锁的方法

    在本篇文章里小编给大家分享的是关于mysql查询表是否被锁的方法,有需要的朋友们可以参考下。
    2020-10-10
  • MySQL 全文索引使用指南

    MySQL 全文索引使用指南

    在 MySQL 中,我们经常使用 WHERE 条件用于进行值的相等比较、范围过滤。然而,我们也会使用关键字进行搜索,这个基于搜索值与其他值的相关性来进行过滤。MySQL全文检索即用于这种场景。本篇将介绍如何使用全文检索。
    2021-05-05
  • 数据库报错:Unknown column 'xxx' in 'where clause'问题的解决过程

    数据库报错:Unknown column 'xxx' in 

    但凡写过sql语句的人估计都曾经碰到过类似于Unknown column ‘xxx’ in ‘where clause’的问题,这篇文章主要给大家介绍了关于数据库报错:Unknown column 'xxx' in 'where clause'问题的解决过程,需要的朋友可以参考下
    2023-03-03
  • MySQL用limit方式实现分页的实例方法

    MySQL用limit方式实现分页的实例方法

    在本篇文章中小编给大家整理了一篇关于MySQL用limit方式实现分页的实例方法,有需要的朋友们可以参考学习下。
    2020-01-01
  • MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解

    MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解

    在MySQL中可以使用IF()、IFNULL()、NULLIF()、ISNULL()函数进行流程的控制。本文就详细的介绍这几种方法,感兴趣的可以了解一下
    2021-06-06
  • MySQL教程数据定义语言DDL示例详解

    MySQL教程数据定义语言DDL示例详解

    这篇文章主要为大家介绍了MySQL教程中什么是数据定义语言DDL的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • mysql存储过程之case语句用法实例详解

    mysql存储过程之case语句用法实例详解

    这篇文章主要介绍了mysql存储过程之case语句用法,结合实例形式详细分析了mysql存储过程中case语句的相关功能、原理与使用技巧,需要的朋友可以参考下
    2019-12-12
  • Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    个人建议,数据库字符集尽量使用 utf8(HTML页面对应的是utf-8),以使你的数据能很顺利的实现迁移
    2011-10-10

最新评论