MySQL5.7 如何通过逻辑备份迁移到GreatSQL及注意事项

 更新时间:2024年06月07日 16:19:19   作者:GreatSQL  
在将数据库从MySQL 5.7迁移到GreatSQL8.0.32时,由于数据量较小且关注安全性,决定使用mysqldump执行逻辑备份,并将数据导入GreatSQL,这篇文章主要介绍了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` (
......

​​​​​​​三、问题解决

1、可以初始化一个新的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

​​​​​​​2、导入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中。

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区GiteeGitHubBilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

到此这篇关于MySQL5.7 通过逻辑备份迁移到GreatSQL注意事项的文章就介绍到这了,更多相关MySQL5.7逻辑备份迁移到GreatSQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL存储过程的异常处理方法

    MySQL存储过程的异常处理方法

    这篇文章主要介绍了MySQL存储过程的异常处理方法,可实现有效调试MySQL存储过程处理结果的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • mysql全文搜索 sql命令的写法

    mysql全文搜索 sql命令的写法

    首先,大家先去下载一份dvbbs.php beta1的代码,解压后先抛开php代码,找出你的mysql手册,如果没有手册那么就直接看下面的实例操作吧!
    2011-01-01
  • Mysql InnoDB聚簇索引二级索引联合索引特点

    Mysql InnoDB聚簇索引二级索引联合索引特点

    这篇文章主要为大家介绍了Mysql InnoDB聚簇索引二级索引联合索引特点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • MySQL索引的一些常见面试题大全(2022年)

    MySQL索引的一些常见面试题大全(2022年)

    索引(Index)是帮助MySQL高效获取数据的数据结构,是对表中一列或多列值进行排序的结构,下面这篇文章主要给大家介绍了关于MySQL索引的一些常见面试题,文中介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • MySQL 数据库两台主机同步实战(linux)

    MySQL 数据库两台主机同步实战(linux)

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。
    2009-04-04
  • MySQL DATE_SUB()函数的实现示例

    MySQL DATE_SUB()函数的实现示例

    本文主要介绍了MySQL DATE_SUB() 函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • MySQL中varchar类型的字段默认值设置方式

    MySQL中varchar类型的字段默认值设置方式

    这篇文章主要介绍了MySQL中varchar类型的字段默认值设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Mysql如何优化查询速度

    Mysql如何优化查询速度

    这篇文章主要介绍了Mysql如何优化查询速度问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql数据库批量复制单条数据记录

    mysql数据库批量复制单条数据记录

    在开发数据库应用时,批量操作是一项常见的需求,无论是数据迁移、备份还是更新,理解如何在MySQL中批量复制单条数据都至关重要,本文将深入探讨这一过程,并提供代码示例,帮助你更好地理解这一概念
    2025-02-02
  • MySQL优化GROUP BY方案

    MySQL优化GROUP BY方案

    满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有)。在某些情况中,MySQL能够做得更好,即通过索引访问而不用创建临时表。
    2014-07-07

最新评论