MySQL数据迁移相关总结


Posted in MySQL onApril 29, 2021

前言:

在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表、某个库或某个实例。根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题。本篇文章,我们一起来看下 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基础(一)
Apr 05 MySQL
MySQL分库分表与分区的入门指南
Apr 22 MySQL
MySql学习笔记之事务隔离级别详解
May 12 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
MySQL慢查询的坑
解决MySQL存储时间出现不一致的问题
Apr 28 #MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 #MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 #MySQL
MySQL Router的安装部署
MySQL Shell的介绍以及安装
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 #MySQL
You might like
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
新鲜出炉的js tips提示效果
2011/04/03 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python检测生僻字的实现方法
2016/10/23 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
电大毕业生自我鉴定
2013/11/10 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
5.12护士节活动总结
2015/02/10 职场文书
个人工作表现自我评价
2015/03/06 职场文书
小学生运动会广播
2015/08/19 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript