无法正确终止并退出大型插入查询

无法正确终止并退出大型插入查询

我有一个很大的插入语句,需要很长时间才能完成,所以我终止了它,但它只是停留在进程列表中,状态为已终止,然后我无法正确重新启动 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 意外死亡,则任何尚未写入磁盘的排队行都将丢失。

http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

相关内容