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)
在您给出的上面的示例中,是DML(数据操作语言)DELETE
的一部分。对于默认的 REPEATABLE READ 事务隔离级别,表中的所有行都在回滚段中可用(请参阅回滚段和撤消空间),以便计数查询可以拥有要计数的行的时间点快照。t1
DROP DATABASE
是DDL(数据定义语言)而不是DML。MySQL 没有适当的回滚机制DROP DATABASE;
。事实上,这些机制是以操作系统为中心的。
在DROP DATABASE
操作过程中,您将在进程列表中看到在删除文件(头文件+其他存储引擎相关文件(例如,,,等))Checking permissions...
之前验证每个表的文件权限。数据库将在数据库中的每个表上经历大量的 MUTEX 调用。这涉及到在删除表之前关闭数据库中每个表的打开文件句柄。在此期间,没有任何桌子可用。.frm
.ibd
.MYD
.MYI
一旦发出DROP DATABASE;
,请不要杀死它。即使你这样做了,这也是一个不可逆的原子操作。对于 InnoDB,这包括否认系统表空间 (ibdata1) 和该数据库内的表对该数据库的任何了解。
您应该配置备份(XtraBackup、mysqldump、二进制日志、LVM 快照)作为针对DROP DATABASE;
. 您还应该安排定期恢复临时服务器上的备份,以确保数据一致。
归档时间: |
|
查看次数: |
18042 次 |
最近记录: |