SQL误删数据后的紧急停止_杀掉当前会话进程终止删除

1次阅读

立刻停止正在执行的 DELETE 语句需按数据库类型操作:MySQL 用 KILL pid(pid 来自 SHOW PROCESSLIST 中 Command 为 Query 且 State 为 Sending data 或 Updating 的会话);PostgreSQL 用 pg_terminate_backend(pid)(pid 来自 SELECT pid, query FROM pg_stat_activity WHERE state = ‘active’),禁用 pg_cancel_backend();SQL Server 用 KILL spid(spid 来自 SELECT session_id, status, command FROM sys.dm_exec_requests WHERE command = ‘DELETE’)。

SQL 误删数据后的紧急停止_杀掉当前会话进程终止删除

怎么立刻停止正在执行的 DELETE 语句

SQL 误删数据后,如果 DELETE 还在运行(尤其没加 WHERE 或条件写错),第一反应不是查备份,而是先掐断它——否则删得越多,恢复越难。

关键看数据库类型:MySQL 和 PostgreSQL 处理方式完全不同,不能混用命令。

  • MySQL 中用 KILL <code>pid 终止会话,pid 来自 SHOW PROCESSLIST,注意必须是 Command 列为 QueryStateSending dataUpdating 的那条
  • PostgreSQL 中用 pg_terminate_backend(<code>pid),pid 来自 SELECT pid, query FROM pg_stat_activity WHERE state = 'active';别用 pg_cancel_backend(),它只中断查询,对已开始的 DELETE 事务可能无效
  • SQL Server 要用 KILL <code>spidspidSELECT session_id, status, command FROM sys.dm_exec_requests WHERE command = 'DELETE'

误删后事务还没提交,能回滚吗

能,但前提是:你没执行 COMMIT,也没自动提交(比如 MySQL 默认 autocommit=1 就危险)。

常见误区是以为“只要没点确定就没事”,其实很多客户端或 ORM 默认开启 autocommit,一执行 DELETE 就立刻落盘。

  • MySQL 检查:SELECT @@autocommit,如果是 1,那 DELETE 执行完就不可逆了,ROLLBACK 无效
  • PostgreSQL 默认 autocommit 关闭,只要还在同一事务块(没 COMMITEND),ROLLBACK 就能撤回整条 DELETE
  • 别依赖 START TRANSACTION 后再删——如果你根本没手动开事务,那默认就是单语句事务

杀掉进程后数据还在吗

不一定。杀进程只是中止执行,不等于撤销修改。

取决于事务是否已写入磁盘、是否刷到 redo log / WAL、以及数据库崩溃恢复机制。简单说:

  • MySQL InnoDB:如果 DELETE 已写入 redo log 并刷盘(innodb_flush_log_at_trx_commit = 1),即使 kill 掉,重启后仍可能重做,数据照样丢
  • PostgreSQL:WAL 已写入的部分无法靠 kill 回退,ROLLBACK 必须在事务内执行才有效
  • 真正安全的“撤回”只有两种:事务内 ROLLBACK,或从备份 + binlog/WAL 恢复

为什么 SHOW PROCESSLIST 看不到正在删的会话

要么它已经执行完了(删完才被你发现),要么它根本不在活跃状态里——比如被锁住卡在 waiting for table metadata lock,或者用了连接池,实际执行者不是你看到的那个 pid

更常见的是权限问题:SHOW PROCESSLIST 只显示当前用户自己的会话,除非你有 SUPERPROCESS 权限。

  • MySQL 检查权限:SHOW GRANTS,确认有没有 PROCESS;没有的话,SHOW PROCESSLIST 只返回空或极少数行
  • PostgreSQL 需要 pg_read_all_stats 角色才能查全量 pg_stat_activity
  • 别只盯着“Time”列数值大的——DELETE 卡住常表现为 State = 'idle in transaction',但实际早就在删了
事情说清了就结束。最麻烦的情况是:autocommit 开着 + 进程已结束 + 没开 binlog/WAL 归档——这时候,连“杀”都来不及,只剩 restore。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-20发表,共计1797字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources