GreatSQL社区

搜索

[待回复] greatsql 通过gh-ost工具修改表结构测试

160 7 2025-8-21 14:28
请老师帮忙看下问题:
1 greatsql 版本:8.0.32-27和8.0.32-25 通过gh-ost工具 修改表结构失败。
2 mysql 版本:8.0.36 通过gh-ost工具 修改表结构成功。

3 测试记录请见附件。


测试记录.zip

3.74 KB, 下载次数: 0, 下载积分: 金币 -1

测试记录

全部回复(7)
yejr 2025-8-21 14:32:56
看日志提示发生了死锁,详见下面
  1. 2025-08-21 13:41:58 ERROR Error 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
  2. ...
  3. 2025-08-21 13:42:02 ERROR Error 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
复制代码



请先检查在执行时有些事务锁没释放或同时还有其他事务在进行,及时提交或回滚这些事务。
baihe7pm 2025-8-21 15:33:49
yejr 发表于 2025-8-21 14:32
看日志提示发生了死锁,详见下面

测试的时候,只有gh-ost工具执行命令,并无其他程序操作表wxq.t2.
并且测试percona版本也可以正常执行。
baihe7pm 2025-8-21 15:35:59
yejr 发表于 2025-8-21 14:32
看日志提示发生了死锁,详见下面

测试的时候,只有gh-ost工具执行命令,并无其他程序操作表wxq.t2.
并且测试percona版本也可以正常执行。
percona 版本:8.0.40-31 Percona Server 测试日志请见附件。

gh-ost-psmysql-8.0.40-3-Percona-server-测试记录.zip

3.86 KB, 下载次数: 0, 下载积分: 金币 -1

percona

yejr 2025-8-21 15:41:34
baihe7pm 发表于 2025-8-21 15:35
测试的时候,只有gh-ost工具执行命令,并无其他程序操作表wxq.t2.
并且测试percona版本也可以正常执行。
...

GreatSQL、MySQL、Percona三个数据库使用的my.cnf是同一份吗,尤其是表锁、行锁等待时间设置一样的吗,主要以下俩参数

- lock_wait_timeout
- innodb_lock_wait_timeout
yejr 2025-8-21 16:13:34
yejr 发表于 2025-8-21 15:41
GreatSQL、MySQL、Percona三个数据库使用的my.cnf是同一份吗,尤其是表锁、行锁等待时间设置一样的吗,主 ...

另外,测试期间反复执行 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 看看活跃事务,确认是否有其他原因产生锁美释放
yejr 2025-8-21 16:43:49
经过查看GreatSQL的错误日志,发现以下内容
  1. 2025-08-21T07:45:19.248685-00:00 1 [Warning] [MY-012128] [InnoDB] posix_fallocate(): Failed to preallocate data for file ./#innodb_temp/temp_1.ibt, desired size 81920 Operating system error number 22 - Invalid argument. Check that the disk is not full or a disk quota exceeded. Make sure the file system supports this function. Refer to your operating system documentation for operating system error code information.

  2. ...

  3. 2025-08-21T07:54:55.669314-00:00 18 [Warning] [MY-012128] [InnoDB] posix_fallocate(): Failed to preallocate data for file ./wxq/_t2_del.ibd, desired size 114688 Operating system error number 22 - Invalid argument. Check that the disk is not full or a disk quota exceeded. Make sure the file system supports this function. Refer to your operating system documentation for operating system error code information.
复制代码


怀疑是测试环境的底层物理I/O设备或文件系统出问题了,请再次确认
yejr 2025-8-24 11:19:51
从GreatSQL 8.0.32-25版本开始,增加了个新特性:非阻塞式DDL(参考 https://greatsql.cn/docs/8.0.32- ... onblocking-ddl.html),它修改了MDL锁的一些行为模式,会导致执行gh-ost时有些DDL SQL行为引发了死锁。

模拟死锁过程如下
session A
session B
START TRANSACTION;
START TRANSACTION;
LOCK TABLES t2 WRITE, _t2_del WRITE;
RENAME TABLE t2 TO _t2_del, _t2_gho TO t2;
-- 被session A阻塞
DROP TABLE IF EXISTS _t2_del;
-- 原生MySQL/Percona/<=GreatSQL 8.0.32-24版本执行成功
-- GreatSQL 8.0.32-25开始,报告死锁失败

暂时还没找到更彻底的解决办法,可以先用pt-osc工具代替gh-ost,此问题也已提交到研发同学。
baihe7pm

1

主题

0

博客

4

贡献

新手上路

Rank: 1

积分
7

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-9-8 04:39 , Processed in 0.024655 second(s), 22 queries , Redis On.
快速回复 返回顶部 返回列表