【问题标题】:Killing the mysqld process杀死mysqld进程
【发布时间】:2010-06-09 22:02:21
【问题描述】:
我有一个大约 800k 行的表。我跑了一个update users set hash = SHA1(CONCAT({about eight fields})) where 1;
现在我有一个挂起的 Sequel Pro 进程,我不确定 mysqld 进程。
这是两个问题:
杀死这些程序可能带来什么危害?我正在开发一个单独的数据库,所以系统上的其他数据库应该不会损坏,对吧?
假设您必须像这样更新表。 无需编写单独的脚本更快速/更可靠的更新方法。
我刚刚检查了 phpMyAdmin,它出现就好像查询完成了一样。我仍然有 Sequel Pro 使用 100% 的两个内核......
【问题讨论】:
标签:
sql
database
sql-update
mysql
【解决方案1】:
如果您使用 InnoDB,它由事务日志支持以用于恢复和回滚,那么您可以摆脱很多,尤其是在非生产环境中。
终止叛徒查询的最简单方法是以 root 用户身份使用 MySQL shell:
SHOW PROCESSLIST;
这将为您提供当前连接的列表和每个连接的进程 ID。要终止任何给定的查询,例如编号 19,请使用:
KILL 19;
通常这将撤消和回滚查询。在某些情况下,这还不够,您可能必须使用kill -9 强制退出 MySQL 服务器进程。在大多数情况下,您应该能够立即重新启动服务器,并且数据库将处于最后一次完全提交的状态。
【解决方案2】:
要获取线程 ID(它会在旁边显示查询):
mysqladmin proc
安全地终止查询线程:
mysqladmin kill [id]
除非你使用 innodb,否则你最终会得到一个部分更新的表,但你应该没问题。 Details:
在 UPDATE 或 DELETE 操作期间,
每次检查后都会检查 kill 标志
块读取和每次更新后或
删除的行。如果设置了kill标志,
该语句被中止。请注意,如果
你没有使用交易,
更改不会回滚。
至于您的第二个问题,如果不允许编写单独的脚本(例如,限制更新),没有更好的方法来更新表。