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;

在导入过程中有如下报错,从这里可以看出导入时有系统表被导入,并且部分系统表不支持被修改:

file

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
  1. 导入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社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

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

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

<think>好的,我现在需要回答用户关于将MySQL 5.7的数据通过物理方式迁移MySQL 8.0的方法和兼容性问题。首先,我得回顾一下用户提供的引用内容,看看里面有什么关键点需要涵盖。 根据引用[1],迁移任务配置已经完成,但需要注意MySQL 8.0和5.7之间的不兼容性,某些检查项会影响迁移,需要处理。引用[2]提到可以通过备份恢复的方式,安装或升级到MySQL 8.0。引用[3]指出在升级过程中遇到了函数不存在的错误,比如GeomFromText,这可能是因为MySQL 8.0的函数名有变化。 用户的问题集中在物理迁移方法和兼容性。物理迁移通常指的是直接复制数据文件、日志文件等,而不是使用逻辑备份mysqldump。常见的物理迁移方法包括使用Percona XtraBackup或者直接复制数据目录。不过需要注意版本兼容性。 首先,我需要确认MySQL 8.0是否支持从5.7的物理备份直接恢复。根据官方文档,通常物理备份需要源和目标版本兼容。比如,MySQL 8.0可能不支持直接复制5.7的数据文件,特别是大版本升级时,可能需要通过中间步骤,比如先升级到某个中间版本,或者使用逻辑备份。 不过引用[2]提到将备份恢复到8.0,可能是指逻辑备份。但用户明确问的是物理迁移。这时候需要区分物理和逻辑的区别。物理备份通常更快,尤其是对于大数据库,但兼容性要求更高。比如,如果MySQL 8.0的数据文件格式或内部结构有变化,直接复制可能导致问题。 根据我的知识,MySQL的大版本升级(如5.7到8.0)通常建议使用逻辑备份工具如mysqldump或mysqlpump,或者使用mysql_upgrade工具来处理数据字典的变化。而物理备份工具如XtraBackup需要支持两个版本。Percona XtraBackup 8.0支持MySQL 8.0和5.7备份恢复,但可能需要特定的步骤。 接下来,我需要检查用户提供的引用是否有关于物理迁移的具体信息。引用[1]提到迁移任务配置,但没有具体说物理还是逻辑。引用[2]提到备份恢复,但可能指逻辑备份。引用[3]中的错误是函数不存在,这可能是因为函数名在8.0中被修改或移除,例如GeomFromText在8.0中改为ST_GeomFromText,这属于语法不兼容的问题。 因此,物理迁移的步骤可能包括: 1. 确保两个版本的兼容性,检查数据字典和文件格式。 2. 使用物理备份工具(如XtraBackup)备份5.7的数据。 3. 在目标服务器安装MySQL 8.0,并确保配置兼容。 4. 恢复备份到8.0实例,并运行mysql_upgrade来处理系统表的更新。 5. 检查并处理不兼容的函数或语法问题。 但需要注意,直接复制数据文件可能在跨大版本时不支持,官方推荐使用逻辑备份或升级工具。例如,MySQL官方建议在跨大版本升级时,先进行逻辑转储,然后导入到新版本中,或者使用in-place升级方法,即先停止5.7实例,替换二进制文件为8.0,然后启动并运行mysql_upgrade。 不过用户的问题是关于物理迁移,所以需要明确是否可行。根据MySQL文档,物理备份通常要求目标版本与源版本相同或更高,但只能在特定的升级路径中使用。例如,从5.7到8.0可能需要使用in-place升级,而不是直接复制数据文件到另一个实例。如果用户希望物理迁移到新的服务器,可能需要使用XtraBackup这样的工具,支持跨版本的物理备份恢复。例如,使用XtraBackup备份5.7的数据,然后恢复到8.0的实例,但需要确保XtraBackup版本兼容两者。 另外,兼容性问题方面,需要检查以下几点: - 保留字或语法变化,比如在8.0中某些关键字可能变成保留字,导致查询失败。 - 默认身份验证插件从mysql_native_password改为caching_sha2_password,可能导致旧客户端连接问题。 - 函数或存储过程的变化,如引用[3]中的GeomFromText需要改为ST_GeomFromText。 - 系统变量的变更或弃用,比如某些配置参数在8.0中被移除或改名。 因此,在迁移后的步骤中,需要运行mysql_upgrade,检查错误日志,并进行应用程序的测试,确保兼容性。 总结回答结构: 1. 物理迁移方法:使用Percona XtraBackup或复制数据文件(但可能不推荐),步骤包括备份、安装8.0、恢复、运行mysql_upgrade。 2. 兼容性问题:函数变更、身份验证插件、保留字、配置参数等,需要检查和调整。 3. 注意事项和最佳实践:推荐逻辑备份、测试迁移、处理不兼容项等。 需要引用用户提供的引用内容,例如引用[3]提到的函数问题,引用[1]中的不兼容性检查项,引用[2]中的备份恢复方法。</think>### MySQL 5.7物理迁移数据到MySQL 8.0的方法与兼容性分析 #### 一、物理迁移方法 1. **使用Percona XtraBackup** - **备份MySQL 5.7数据**: 使用XtraBackup 2.4版本(支持MySQL 5.7)进行全量物理备份: ```bash xtrabackup --backup --target-dir=/path/to/backup ``` - **准备MySQL 8.0环境**: 安装MySQL 8.0并确保数据目录为空[^2]。 - **恢复备份MySQL 8.0**: 使用Xtrabackup 8.0版本(兼容MySQL 8.0)恢复备份: ```bash xtrabackup --copy-back --target-dir=/path/to/backup ``` - **更新系统表**: 启动MySQL 8.0实例后,运行`mysql_upgrade`更新系统表结构: ```bash mysql_upgrade -u root -p ``` 2. **直接复制数据文件(需谨慎)** - 停止MySQL 5.7服务,复制数据目录(如`/var/lib/mysql`)到MySQL 8.0服务器。 - 修改MySQL 8.0配置文件(`my.cnf`),确保参数兼容性(如`innodb_file_format`已弃用)。 - 启动MySQL 8.0并运行`mysql_upgrade`。 #### 二、兼容性注意事项 1. **函数与语法变更** - 部分函数名称或参数变化,例如`GeomFromText`需改为`ST_GeomFromText`[^3]。 - 检查存储过程、触发器中是否使用过期语法(如`GROUP BY`隐式排序已移除)。 2. **身份验证插件** MySQL 8.0默认使用`caching_sha2_password`插件。若应用程序不支持,需在用户配置中显式指定: ```sql ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; ``` 3. **系统变量与配置** - 移除参数:如`query_cache_type`在8.0中已弃用。 - 新增参数:如`innodb_dedicated_server`需根据场景调整。 4. **字符集与排序规则** MySQL 8.0默认使用`utf8mb4`和`utf8mb4_0900_ai_ci`,需确保与5.7配置一致。 #### 三、操作建议 1. **预迁移检查** - 使用MySQL Shell的`util.checkForServerUpgrade()`工具检测兼容性问题[^1]。 - 重点检查错误日志中的`Deprecation`和`Warning`信息。 2. **测试与回滚** - 在测试环境验证迁移流程,模拟真实负载。 - 保留MySQL 5.7备份,确保可快速回滚。 3. **推荐逻辑迁移** 若物理迁移风险较高,可采用逻辑备份(如`mysqldump`): ```bash mysqldump -u root -p --all-databases > backup.sql mysql -u root -p < backup.sql ``` #### 四、典型问题处理 - **错误:FUNCTION GeomFromText does not exist** 修改SQL语句为`ST_GeomFromText`,并更新应用程序代码。 - **错误:身份验证插件不兼容** 调整用户认证方式或升级客户端驱动。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值