MySQL dump进行5.6迁移升级到5.7踩过的坑

测试库机器主板出现问题总是重启,于是安排了Oracle和MySQL都迁移到新的机器上,Oracle迁移用Rman导出导入就行了,注意要导出archive log和control file,没啥难度。MySQL老的测试机上用的是5.6版本NDB引擎,新的测试机上搭建的5.7的单节点数据,遇到一些坑,记录下避免以后再犯傻。

 

由于老的机器用的5.6是NDB,新的是单节点的innodb,所以在迁移的时候要考虑存储引擎的设定。既然选择单节点5.7 innodb,那意味着我即将放弃NDB,所以在用MySQLdump导出数据的时候,我需要将结构种NDB改成innodb。

 

MySQLdump是MySQL自带的一个数据库导出工具,功能涵盖了数据高速导入导出、结构高速导入导出。即可以用来进行高速的数据库迁移,也可以用来进行数据导入。

操作命令很简单,mysqldump +参数

一般情况就是:

mysqldump -uroot -p --database 数据库名 > 导文件

以上语句是数据库结构和数据一起导出

如果我不指定数据库,即不加--database参数,那就是默认全部数据库及其数据导出,这里有点需要注意的,很多帖子只简单的描述了这里的命令,但是这里有个常用的细微差别判断:

mysqldump如果我要导出一个数据库,写法有两种:

一:
mysqldump -uroot -p --database A > /data/a.sql

二:
mysqldump -uroot -p A > /data/a.sql

这两种写法都能把A库的结构和数据导出来成为sql文件,但是第二种导出的数据库结构种有create database语句,二第一种是没有的,这种差别能产生什么影响呢,如果我是全新的库,全新的MySQL进行数据迁移,我肯定是需要create database语句进行数据库创建的,但是如果这次导出的目的是准备进行数据库恢复,且数据库种已经建好库了,你需要导入到指定的库中时,就不需要create创库动作的发生,这时候加个--database语句导出的数据就没有create database动作。

 

如果导出的时候只想要导出结构而不想导出数据,在命令种加个 -d 参数,即代表不要数据,例如:

mysqldump -uroot -p -d A > /data/a.sql

 同理只要数据不要结构,-t 参数:

mysqldump -uroot -p -t A > /data/a.sql

官网有很多参数可以选择,其他的就不举例了

 对于单库来说,可以指定参数导出指定的表,或者指定不要哪些表,具体可以参考官网参数介绍,虽然对于表级可以指定不要的表,但是在库级别来说,没有参数可以指定不要的库,所以对于几百个库的实例想去掉一些库导出,只有写脚本筛选,脚本很简单,网上有的。

 

导入的话可以在两个地方操作,一是shell脚本用mysqldump命令、二是在mysql里面用source命令

例:

shell:

mysqldump -uroot -p < /data/a.sql


mysql:
source /data/a.sql

现在开始纪录自己遇到的坑之后的经验:

1、数据库迁移升级强烈建议结构和文件分开导出,否则如果有报错,根本不能解耦的独立解决,切记,特别是数据量超大的情况

2、MySQL 5.6升到5.7,系统表结构有变化,特别是系统的user用户表,结构不是一样的,所以对于系统库,需要导入完成后用mysql_upgrade进行升级

升级命令:

mysql_upgrade -u root -p  -S mysql.sock文件 --force

3、如果说5.6的root密码和新的5.7root密码不一致,在导入数据前请多开一个窗口链接5.7,因为导入系统库会覆盖掉当前的系统库,如果密码不一致可能会登陆不上,一旦发生某一以外报错,之前没有多开一个链接窗口,会导致连接不上而无法排查。

4、upgrade后只要确认user表有数据,可以不用重启数据库,当然也可以重启进行排查验证,不要只导入结构后就去验证user表,因为你没有数据,且已经覆盖了原表,root用户都被清掉了,所以要记得导入user数据,再去验证,否则之后连登陆mysql都实现不了

5、如果不进行upgrade,创建用户会报错用户无法创建的错误

6、建议系统库作为一个单独的库进行数据导入,因为在大量数据的情况下,无法保证导出的书籍文件绝对正常,针对系统级的库独立的保证数据正常能够确保数据库基本的正常使用

7、如果是一个机器上安装了两个MySQL实列,比如我这边安装了8.0和5.7,用的是二进制安装,配置了不同的my.cnf和data目录等,启动命令的时候如果乱改参数报错了,记得最好的方法是重新初始化数据库,用mysqld --initialize 如果指定了my.cnf要加上defaults-file参数指向my.cnf

8、初始化二进制安装的数据库时,需要指向data目录,socket文件、my.cnf文件、log、binlog文件等,这些都可以配置在my.cnf中,如果配置了,只需要指定my.cnf即可,如果没有配置,那就要手打命令了。记得每次初始化都需要清空data相关目录下的所有文件。建立的data 、log 、binlog文件夹mysql需要有权限

9、默认的mysqldump导出数据库时只默认打开的触发器导出、存过和event都没有默认打开,需要在导出的时候指定打开参数

打开:
--events:转储事件计划程序事件

--routines:转储存储过程和函数

--triggers:转储表的触发器

明确禁用:
--skip-events
--skip-routines
--skip-triggers

10、记得监控error-log日志文件,MySQL一举一动都会打日志,日志文件路径可以在my.cnf中配置参数和指定 

11、改存储引擎,可以在单独导出的结构中用文本工具批量替换,MySQL没有导出命令指定导出的存储引擎模式

12、mysqld在初始化后启动的时候,加上--user=mysql的参数,5.7的user是mysql,如果是二进制且改了默认my.cnf的,还要指定--defaulfs-file参数

你可能感兴趣的:(MYSQL)