MySQL是否对DROP DATABASE...语句使用事务(所有表都使用InnoDB引擎)?
基本上,我想知道如果我在DROP DATABASE...查询运行时关闭它,是否会丢失任何数据?
我已经用表测试过它,但是我没有足够大的数据库来测试它:
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (8.57 sec)
mysql> DELETE FROM t1;另一次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)回到第一届会议
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)发布于 2013-07-18 15:09:15
在上面给出的示例中,DELETE是DML (数据操纵语言)的一部分。对于可重复读取的默认事务隔离级别,t1表中的所有行都可以在回滚段(查看回滚段和撤消空间)中使用,以便计数查询可以有要计数的行的实时快照。
DROP DATABASE是数据定义语言而不是DML。没有MySQL机制用于回滚DROP DATABASE;。事实上,这些机制都以操作系统为中心。
在DROP DATABASE操作期间,您将在处理列表中看到Checking permissions...,以便在删除文件(.frm头文件+其他与存储引擎相关的文件(如.ibd、.MYD、.MYI等)之前验证每个表的文件权限)。数据库将体验对数据库中的每个表进行大量MUTEX调用。这包括在删除表之前关闭数据库中每个表的打开文件句柄。在此期间,没有任何表格可用。
的回答
一旦你发布了DROP DATABASE;,请不要杀死它。即使你这样做了,这也是一个不可逆转的原子操作。对于InnoDB,这包括否认系统表空间(ibdata1)中的数据库知识和数据库中的表。
您应该将备份(XtraBackup、mysqldump、二进制日志、LVM快照)配置为预防DROP DATABASE;的措施。您还应该安排在暂存服务器上定期恢复备份,以确保数据是一致的。
发布于 2013-07-18 15:06:17
有几个SQL语句不能使用ROLLBACK,因为MySQL隐式提交了这些语句,例如:
创建/更改/删除数据库
创建/ALTER / DROP /重命名/截断表
创建/删除索引
创建/删除事件
创建/删除函数
创建/删除过程
对于这样的语句,不管您是否使用显式提交,只要执行它,语句就会隐式地进行提交。
发布于 2013-07-19 05:23:14
DROP命令从数据库中删除一个表。所有表的行、索引和特权也将被删除。不会触发DML触发器。无法回滚操作。https://dba.stackexchange.com/questions/46599
复制相似问题