![无法正确终止并退出大型插入查询](https://linux22.com/image/539006/%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E7%BB%88%E6%AD%A2%E5%B9%B6%E9%80%80%E5%87%BA%E5%A4%A7%E5%9E%8B%E6%8F%92%E5%85%A5%E6%9F%A5%E8%AF%A2.png)
我有一个很大的插入语句,需要很长时间才能完成,所以我终止了它,但它只是停留在进程列表中,状态为已终止,然后我无法正确重新启动 mysql。我必须重新启动。每次都会发生这种情况。请参阅下面的日志跟踪。我该如何处理这种情况?
mysql>显示进程列表; +----+------+--------------------+-----------+---------+---------+--------+-----------------------------------------------------------------------------------------------------------------+ | ID | 用户 | 主机 | 数据库 | 命令 | 时间 | 状态 | 信息 | +----+------+--------------------+-----------+---------+--------+--------+-----------------------------------------------------------------------------------------------------------------+ | | 6 | 根 | 127.0.0.1:49971 | xxxxxx | 已杀死 | 826 | 更新 | 将忽略插入 xxxxxx.xxxxxxs_tmp2 (xxxxxx,重新拍摄) 值 ('xxx.xxx',1),('0- | | 7 | root | localhost | xxxxxx | 查询 | 0 | NULL | 显示进程列表 | +----+------+--------------------+-----------+---------+---------+--------+-----------------------------------------------------------------------------------------------------------------+ 每组 3 行(0.01 秒) mysql>退出 再见 [root@x-xxx-x-xx ~]# 重启 mysqld 服务 mysqld:无法识别的服务 [root@x-xxx-x-xx ~]# 重启mysql服务 关闭 MySQL................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ 错误! 错误!无法停止正在运行的服务器,因此拒绝尝试启动。 [root@x-xxx-x-xx ~]# 服务 mysql 状态 成功!MySQL 正在运行(4465) [root@x-xxx-x-xx ~]# mysql -u root -xxxxx 错误 2002 (HY000):无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)
我猜这是因为它试图回滚它插入的所有行。对吗?这是 mysql 错误日志:
110209 19:59:33 [注意] 事件调度程序:清除队列。0 个事件 110209 19:59:34 InnoDB:正在开始关闭... 110209 20:09:15 mysqld_safe 使用来自 /var/lib/mysql 的数据库启动 mysqld 守护进程 110209 20:09:16 [警告] 如果 --log_slow_queries 不是 \,则选项 --log-slow-admin-statements、--log-queries-not-using-indexes 和 --log-slow-slave-statements 无效 放 110209 20:09:16 [注意] 插件‘FEDERATED’已被禁用。 InnoDB:InnoDB内存堆已禁用 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数 InnoDB:压缩表使用 zlib 1.2.3 110209 20:09:16 InnoDB:使用 Linux 原生 AIO 110209 20:09:16 InnoDB:初始化缓冲池,大小 = 6.0G 110209 20:09:17 InnoDB:缓冲池初始化完成 110209 20:09:17 InnoDB:支持的最高文件格式是 Barracuda。 110209 20:09:19 InnoDB:1.1.4 已启动;日志序列号 16772431917 110209 20:09:20 [警告] --skip-name-resolve 模式下忽略“proxies_priv”条目“@ root@xx-xxx-xx-xx”。 110209 20:09:20 [注意] 事件调度程序:已加载 0 个事件 110209 20:09:20 [注意] /usr/sbin/mysqld:已准备好连接。 版本:'5.5.8' 套接字:'/var/lib/mysql/mysql.sock' 端口:3306 MySQL 社区服务器(GPL) 110209 20:13:47 mysqld_safe 使用 /var/lib/mysql 中的数据库启动 mysqld 守护进程 110209 21:07:07 mysqld_safe 使用来自 /var/lib/mysql 的数据库启动 mysqld 守护进程 110209 21:07:08 [警告] 如果 --log_slow_queries 不是 \,则选项 --log-slow-admin-statements、--log-queries-not-using-indexes 和 --log-slow-slave-statements 无效 放 110209 21:07:08 [注意] 插件‘FEDERATED’已被禁用。 InnoDB:InnoDB内存堆已禁用 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数 InnoDB:压缩表使用 zlib 1.2.3 110209 21:07:08 InnoDB:使用 Linux 原生 AIO 110209 21:07:08 InnoDB:初始化缓冲池,大小 = 6.0G 110209 21:07:09 InnoDB:缓冲池初始化完成 110209 21:07:10 InnoDB:支持的最高文件格式是 Barracuda。 InnoDB:日志扫描已超过检查点 lsn 16798669157 110209 21:07:11 InnoDB:数据库未正常关闭! InnoDB:开始崩溃恢复。 InnoDB:从 .ibd 文件读取表空间信息... InnoDB:从双写中恢复可能半写的数据页 InnoDB:缓冲区... InnoDB:正在进行恢复:扫描至日志序列号 16803911680 InnoDB:正在进行恢复:扫描至日志序列号 16809154560 InnoDB:正在进行恢复:扫描至日志序列号 16813133382 InnoDB:1 个事务必须回滚或清理 InnoDB:总共有 219970 行操作需要撤消 InnoDB:Trx id 计数器为 1400 110209 21:07:20 InnoDB:开始将一批日志记录应用到数据库…… InnoDB:进度百分比:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5\ 0 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 InnoDB:应用批次完成 InnoDB:在后台启动未提交事务的回滚 110209 21:13:34 InnoDB: 回滚 ID 为 1200 的 trx,需要撤消 219970 行 InnoDB:进度百分比:1110209 21:13:34 InnoDB:1.1.4 已启动;日志序列号 16813133382 2110209 21:13:34 [警告] --skip-name-resolve 模式下忽略“proxies_priv”条目“@ root@xx-xxx-xx-xx”。 3 4110209 21:13:35 [注意] 事件调度程序:已加载 0 个事件 110209 21:13:35 [注意] /usr/sbin/mysqld:已准备好连接。 版本:'5.5.8' 套接字:'/var/lib/mysql/mysql.sock' 端口:3306 MySQL 社区服务器(GPL) 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
答案1
如果您使用的是 MySQL 5.5,请尝试使用延迟插入而不是插入。
使用 KILL 时,会为该线程设置一个线程特定的终止标志。在大多数情况下,线程可能需要一些时间才能终止,因为仅在特定时间间隔检查终止标志:[...]
INSERT DELAYED 线程快速刷新(插入)内存中的所有行然后终止。
http://dev.mysql.com/doc/refman/5.5/en/kill.html
排队的行只保存在内存中,直到它们被插入到表中。这意味着,如果您强制终止 mysqld(例如,使用 kill -9)或 mysqld 意外死亡,则任何尚未写入磁盘的排队行都将丢失。