DROP DATABASE 上的事务回滚

HTF*_*HTF 4 mysql innodb

MySQL是否使用事务forDROP DATABASE...语句(所有表都使用InnoDB引擎)?

基本上我想知道如果我DROP DATABASE...在查询运行时终止查询是否会丢失任何数据?

我已经用表对此进行了测试并且它有效,但我没有足够大的数据库来测试它:

mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (8.57 sec)

mysql> DELETE FROM t1;
Run Code Online (Sandbox Code Playgroud)

另一个 MySQL 会话:

mysql> SHOW PROCESSLIST;
+-----+------+-----------+------+---------+------+----------+-------------------+-----------+---------------+
| Id  | User | Host      | db   | Command | Time | State    | Info              | Rows_sent | Rows_examined |
+-----+------+-----------+------+---------+------+----------+-------------------+-----------+---------------+
| 211 | root | localhost | test | Query   |    0 | init     | SHOW PROCESSLIST  |         0 |             0 |
| 242 | root | localhost | test | Query   |    4 | updating | DELETE FROM t1    |         0 |        879266 |
+-----+------+-----------+------+---------+------+----------+-------------------+-----------+---------------+
2 rows in set (0.00 sec)

mysql> KILL 242;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

返回第一届会议

mysql> SELECT COUNT(*) FROM t1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    283
Current database: test

+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (6.91 sec)
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 6

在您给出的上面的示例中,是DML(数据操作语言)DELETE的一部分。对于默认的 REPEATABLE READ 事务隔离级别,表中的所有行都在回滚段中可用(请参阅回滚段和撤消空间),以便计数查询可以拥有要计数的行的时间点快照。t1

DROP DATABASEDDL(数据定义语言)而不是DML。MySQL 没有适当的回滚机制DROP DATABASE;。事实上,这些机制是以操作系统为中心的。

DROP DATABASE操作过程中,您将在进程列表中看到在删除文件(头文件+其他存储引擎相关文件(例如,,,等))Checking permissions...之前验证每个表的文件权限。数据库将在数据库中的每个表上经历大量的 MUTEX 调用。这涉及到在删除表之前关闭数据库中每个表的打开文件句柄。在此期间,没有任何桌子可用.frm.ibd.MYD.MYI

回答您的实际问题

一旦发出DROP DATABASE;,请不要杀死它。即使你这样做了,这也是一个不可逆的原子操作。对于 InnoDB,这包括否认系统表空间 (ibdata1) 和该数据库内的表对该数据库的任何了解。

建议

您应该配置备份(XtraBackup、mysqldump、二进制日志、LVM 快照)作为针对DROP DATABASE;. 您还应该安排定期恢复临时服务器上的备份,以确保数据一致。