MySQL5.7 通过逻辑备份迁移到GreatSQL注意事项
一、背景概述
在将数据库从MySQL 5.7迁移到GreatSQL8.0.32时,由于数据量较小且关注安全性,决定使用mysqldump执行逻辑备份,并将数据导入GreatSQL。但在备份时采用了备份全库(--all-databases)的方式,在导入GreatSQL后,修改用户密码时出现错误。这是因为mysqldump备份时包括了mysql系统库,而MySQL 5.7中的mysql系统库采用了MyISAM存储引擎,而GreatSQL的mysql系统库采用了InnoDB存储引擎。因此,在导入数据后,部分系统表被覆盖,导致了错误的出现。
二丶问题复现
1.部署2个实例
部署MySQL 5.7与GreatSQL 8.0.32,具体步骤省略
2.MySQL 创建测试数据
通过sysbench创建10张表
$ sysbench lua/oltp_read_write.lua --mysql-db=sysbench --mysql-host=192.168.1.162 --mysql-port=6003 --mysql-user=root --mysql-password=greatsql --tables=10 --table_size=5000 --report-interval=2 --threads=10 --time=600 --mysql-ignore-errors=all prepare
3.MySQL 创建测试用户
mysql> create user test1@'%' identified by 'greatsql'; Query OK, 0 rows affected (0.01 sec) mysql> grant all on *.* to test1@'%'; Query OK, 0 rows affected (0.01 sec)
4.MySQL进行全库备份
$ /mysql57/svr/mysql/bin/mysqldump -uroot -pgreatsql -h192.168.1.162 -P6003 --single-transaction --set-gtid-purged=OFF --all-databases > all.sql
5.GreatSQL导入备份数据
greatsql> source all.sql;
在导入过程中有如下报错,从这里可以看出导入时有系统表被导入,并且部分系统表不支持被修改:
6.GreatSQL执行修改用户密码操作
greatsql> alter user test1@'%' identified by 'abc123'; ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
此时报错违反了 GTID 的一致性,由于导入数据后有部分MySQL库下的系统表被修改成了MyISAM存储引擎,并且修改用户密码会涉及多张系统表的更新,在一个 SQL 语句中既对非事务表进行了更新操作,又对事务表进行了更新操作,这违反了 GTID 的一致性规则。
7.GreatSQL执行查看库表信息的操作
当执行刷新权限的操作后,执行下面的SQL时也会报错
greatsql> flush privileges; Query OK, 0 rows affected, 11 warnings (0.00 sec) greatsql> show tables; ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist greatsql> show databases; ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
mysql.infoschema
用户是MySQL8.0中引入的,mysql.infoschema
用户是MySQL数据库的系统用户,用来管理和访问系统自带实例information_schema;导入MySQL系统库后,user表被覆盖为MySQL5.7的user表,此用户不存在,因此在刷新权限后访问元数据信息时报错;
8.查看mysqldump备份了哪些系统表
$ grep 'CREATE TABLE ' all.sql ...... CREATE TABLE `innodb_index_stats` ( CREATE TABLE `innodb_table_stats` ( CREATE TABLE `ndb_binlog_index` ( CREATE TABLE `plugin` ( CREATE TABLE `proc` ( CREATE TABLE `procs_priv` ( CREATE TABLE `proxies_priv` ( CREATE TABLE `server_cost` ( CREATE TABLE `servers` ( CREATE TABLE IF NOT EXISTS `slave_master_info` ( CREATE TABLE IF NOT EXISTS `slave_relay_log_info` ( CREATE TABLE `slave_worker_info` ( CREATE TABLE `tables_priv` ( CREATE TABLE `time_zone` ( CREATE TABLE `time_zone_leap_second` ( CREATE TABLE `time_zone_name` ( CREATE TABLE `time_zone_transition` ( CREATE TABLE `time_zone_transition_type` ( CREATE TABLE `user` ( CREATE TABLE IF NOT EXISTS `general_log` ( CREATE TABLE IF NOT EXISTS `slow_log` ( ......
三、问题解决
- 可以初始化一个新的GreatSQL实例,备份这个新的GreatSQL实例的MySQL系统库
$ /greatsql/svr/mysql/bin/mysqldump -uroot -pgreatdb -h127.0.0.1 -P6001 --single-transaction --set-gtid-purged=OFF -B mysql > mysql.sql
- 导入mysql系统库的备份文件到GreatSQL实例中
greatsql> source mysql.sql;
3.导入完成后,刷新权限
greatsql> flush privileges; Query OK, 0 rows affected (0.01 sec)
4.执行创建用户测试
greatsql> create user test1@'%' identified by 'greatsql'; Query OK, 0 rows affected (0.01 sec) greatsql> grant all on *.* to test1@'%'; Query OK, 0 rows affected (0.01 sec)
5.执行 show 操作
greatsql> show databases; +--------------------+ * Database * +--------------------+ * information_schema * * mysql * * performance_schema * * sys * * sys_audit * * sysbench * * test * +--------------------+ 7 rows in set (0.01 sec) greatsql> show tables; +----------------+ * Tables_in_test * +----------------+ * test * +----------------+ 1 row in set (0.01 sec)
四、总结
1.在从MySQL5.7向GreatSQL或者MySQL8.0 通过逻辑备份迁移时,不要备份系统库mysql,避免发生问题;
2.用户及权限可以单独进行备份然后导入到GreatSQL或者MySQL8.0中。
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
警惕“付费购买 iPhone 灵动岛截图”骗局
新型骗局——“付费购买 iPhone 灵动岛截图”近日引发热议。 这种骗局大致情况如下: 首先骗子会假装是正常买家,并声称支付5-10元购买带有灵动岛设计的iPhone屏幕截图。 联系上卖家后,骗子会要求在卖家的手机登录自己的 Apple ID 后再进行截图,理由是“以证明是自己的手机”。 一旦卖家按照要求登录了买家的 Apple ID,买家会立刻远程锁机,然后要求卖家向自己转账,才能解锁手机。 苹果官方客服对此表示,用户不应在设置中登录他人的 Apple ID,并应妥善保管自己的 Apple ID 和密码。如果设备已经被锁住,用户可以联系苹果客服并提供购买设备的凭证,苹果官方有专门的部门可以帮忙尝试处理。同时,苹果官方也提醒用户面对打钱解锁的要求时,切记不要照做。 延伸阅读:新型 Apple ID 诈骗:开启双重认证仍被钓鱼
- 下一篇
一文搞懂5种内存溢出案例,内含完整源码
本文分享自华为云社区《10分钟搞懂各种内存溢出案例!!(含完整源码,建议收藏)》,作者:冰 河。 作为程序员,多多少少都会遇到一些内存溢出的场景,如果你还没遇到,说明你工作的年限可能比较短,或者你根本就是个假程序员!哈哈,开个玩笑。今天,我们就以Java代码的方式来列举几个典型的内存溢出案例,希望大家在日常工作中,尽量避免写这些low水平的代码。 我们先来看看今天要介绍哪些内存溢出案例,冰河这里总结了一张图,如下所示。 定义主类结构 首先,我们创建一个名称为BlowUpJVM的类,之后所有的案例实验都是基于这个类进行。如下所示。 public class BlowUpJVM { } 栈深度溢出 public static void testStackOverFlow(){ BlowUpJVM.testStackOverFlow(); } 栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。 永久代内存溢出 public static void testPergemOutOfMemory1(){ //方法一失败 List<String&...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境