MySQL-MariaDB迁移到MySQL注意事项

记一次将MariaDB的数据迁移到MySQL的任务记录
迁移数据库的版本:
MariaDB:10.1.13
MySQL:5.7.36-log

1、刚开始使用mysqldump在MariaDB进行的全备

[root@suz-mysql-66-122 ~]# mysqldump -uroot -p12345 -A --skip-lock-tables --single-transaction --master-data=2 --flush-logs --hex-blob --triggers --routines --events > /data/full_`date +%F`.sql

2、之后在MySQL中进行的恢复

[root@suz-mysql-66-123 ~]# mysql -uroot -S /tmp/mysql.sock < 20_133_full_2023-05-10.sql
ERROR 1728 (HY000) at line 989: Cannot load from mysql.proc. The table is probably corrupted
当恢复到mysql.proc这张表的时候出现了报错,至此进程终断,未恢复的数据库及mysql库中未未恢复的表不再进行(包括user表)

网上查了一下,原因是MariaDB的mysql.proc和MySQL的mysql.proc表结构不一样(这是一张关于存储过程的表)
通过对比表结构发现,MySQL的proc表的definer字段长度是93,MariaDB的该字段长度是141
此外,'sql_mode'字段的取值范围也不相同

3、修改mysql.proc表结构

mysql> set @@session.sql_mode='';
mysql> alter table mysql.proc modify column definer char(93);
mysql> alter table proc modify column sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH');

4、继续导入未导入数据库

将未导入的数据库从全备中分离出来
[root@suz-mysql-66-123 ~]# sed -n '/^-- Current Database: `testdb`/,/^-- Current Database: `/p' 20_133_full_2023-05-10.sql > testdb.sql
[root@suz-mysql-66-123 ~]# mysql -uroot -S /tmp/mysql.sock < testdb.sql
此前需要关闭sql_mode,不然还是会报错

5、数据恢复成功,但新问题又来了

新建、删除用户的时候发现不能成功,报错说是插入数据和列数不匹配,对比后发现两者user表结构也不相同,头大了... ...
又从新的相同版本MySQL中导出整个mysql库进行恢复,flush privileges; 刷新下权限,之后当然所有的用户都没了,但是可以新建用户了。
后续不知道会不会产生其他新的问题了,持续关注中... ...

6、总结

如果迁移的数据库不多,那么就单独备份数据库出来,不要-A全备
[root@suz-mysql-66-123 ~]# mysqldump -uroot -pxxxxxx -B testdb1 testdb2 > /tmp/testdb.sql
恢复前数据库中先关闭:set global sql_mode=''; 不然会报错
[root@suz-mysql-66-123 ~]# mysql -uroot -S /tmp/mysql.sock < testdb.sql

第一次迁移MariaDB到MySQL,可能还有更好的方法,只是还没有了解到,有待提高。

posted @ 2023-05-12 15:17  Enzo_Ocean  阅读(187)  评论(0编辑  收藏  举报