baihe7pm 发表于 2025-8-21 14:28:36

greatsql 通过gh-ost工具修改表结构测试

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

3 测试记录请见附件。


yejr 发表于 2025-8-21 14:32:56

看日志提示发生了死锁,详见下面
2025-08-21 13:41:58 ERROR Error 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
...
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 测试日志请见附件。

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的错误日志,发现以下内容
2025-08-21T07:45:19.248685-00:00 1 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.

...

2025-08-21T07:54:55.669314-00:00 18 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 Asession 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,此问题也已提交到研发同学。
页: [1]
查看完整版本: greatsql 通过gh-ost工具修改表结构测试