首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DROP数据库上的事务回滚

问DROP数据库上的事务回滚
EN

Database Administration用户
提问于 2013-07-18 14:29:56
回答 3查看 17.5K关注 0票数 4

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

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

我已经用表测试过它,但是我没有足够大的数据库来测试它:

代码语言:javascript
复制
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (8.57 sec)

mysql> DELETE FROM t1;

另一次MySQL会话:

代码语言:javascript
复制
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)

回到第一届会议

代码语言:javascript
复制
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)
EN

回答 3

Database Administration用户

发布于 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;的措施。您还应该安排在暂存服务器上定期恢复备份,以确保数据是一致的。

票数 5
EN

Database Administration用户

发布于 2013-07-18 15:06:17

有几个SQL语句不能使用ROLLBACK,因为MySQL隐式提交了这些语句,例如:

创建/更改/删除数据库

创建/ALTER / DROP /重命名/截断表

创建/删除索引

创建/删除事件

创建/删除函数

创建/删除过程

对于这样的语句,不管您是否使用显式提交,只要执行它,语句就会隐式地进行提交。

票数 4
EN

Database Administration用户

发布于 2013-07-19 05:23:14

  • DROP命令从数据库中删除一个表。所有表的行、索引和特权也将被删除。不会触发DML触发器。无法回滚操作。
  • 您可以使用二进制日志实时恢复,这可以在有害的SQL执行之前恢复数据。
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/46599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档