代码之家  ›  专栏  ›  技术社区  ›  Josh K

终止mysqld进程

  •  5
  • Josh K  · 技术社区  · 15 年前

    我有一张80万排的桌子。我跑了一辆 update users set hash = SHA1(CONCAT({about eight fields})) where 1;

    现在我有一个悬而未决的续集专业进程,我不确定的 mysqld 过程。

    这是两个问题:

    1. 假设您必须更新这样的表。什么是更快/更可靠的更新方法 没有写一个单独的脚本 .

    我刚和phpMyAdmin核实了一下 出现 好像查询已完成。我仍然有续集专业使用100%我的核心,虽然。。。

    2 回复  |  直到 13 年前
        1
  •  5
  •   tadman    14 年前

    如果您使用的是InnoDB,它有事务日志作为恢复和回滚的后盾,那么您可以避免很多问题,特别是在非生产环境中。

    终止renegade查询的最简单方法是使用MySQL shell作为根用户:

    SHOW PROCESSLIST;
    

    这将为您提供当前连接的列表以及每个连接的进程ID。要终止任何给定的查询(如数字19),请使用:

    KILL 19;
    

    通常这将撤消并回滚查询。在某些情况下,这是不够的,您可能不得不强制退出MySQL服务器进程 kill -9 . 在大多数情况下,您应该能够立即重新启动服务器,数据库将处于最后一个完全提交的状态。

        2
  •  1
  •   Richard Simões    15 年前

    要获取线程ID(它将显示查询):

    mysqladmin proc
    

    mysqladmin kill [id]
    

    除非您使用innodb,否则最终会得到一个部分更新的表,但您应该没事。 Details

    在更新或删除操作期间, 在每次更新或 已删除行。如果设置了kill标志, 您没有使用事务 更改不会回滚。

    至于第二个问题,如果不允许一个人编写单独的脚本(比如限制更新),那么没有更好的方法来更新表。