mysql - 你能回滚状态为 'committing alter table to storage engine' 的查询吗

标签 mysql mariadb innodb

我们有一个包含 7000 万行的 InnoDB 表,我们一直在尝试运行 alter table 语句来修改和添加几列。查询似乎已经更改了表,现在处于“将更改表提交给存储引擎”的状态。

START TRANSACTION;
ALTER TABLE table
  MODIFY COLUMN column1 int(11) NOT NULL DEFAULT 0,
  MODIFY COLUMN column2 tinyint(1) NOT NULL DEFAULT 1,
  ADD COLUMN column3 int(11),
  ADD COLUMN column4 int(11) NOT NULL DEFAULT 1,
  ADD COLUMN column5 varchar(255);
COMMIT;

这已经整夜运行,目前是 19 点。我们没有启用性能模式,因此无法查看预计完成时间。我关心的是查询在做什么,以及查询是否会在被终止时回滚。我看到其他问题与在复制到 tmp 表或等待表锁定时卡住的查询有关。但是,我找不到任何关于在提交更改表时被卡住的信息。

在这种状态下杀死查询是否安全,如果查询被杀死,它会回滚成功吗?

服务器正在运行 MariaDB 10.2

最佳答案

来自documentation :

Some statements cannot be rolled back. In general, these include data definition language (DDL) statements, such as those that create or drop databases, those that create, drop, or alter tables or stored routines.

You should design your transactions not to include such statements. If you issue a statement early in a transaction that cannot be rolled back, and then another statement later fails, the full effect of the transaction cannot be rolled back in such cases by issuing a ROLLBACK statement.

关于mysql - 你能回滚状态为 'committing alter table to storage engine' 的查询吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49131991/

相关文章:

mysql - 使用 LIKE 条件用 sql 搜索德语字符

sql - 对同一列使用多个条件进行计数

mysql - JPQL 中的成员未转换为 SQL 存在子句

mysql - 如何在innodb中实现隐式行级锁定?

MYSQL 按月选择结果计数

mysql - RethinkDb 查询两个日期列之间的当前日期时间

mysql - 如何将经常访问的数据放入数据库中的 "quick access"区域

mysql - 在 MySQL 中使用 InnoDB 进行全文搜索

PHP 在不创建文件的情况下处理 blob

php - mysql_num_rows 不起作用