如何停止正在进行的回滚。我杀死了一个运行时间很长的进程INTO table1 SELECT * FROM table2语句。我想提交已经存在的内容,但由于它正在回滚,所以无法提交。一旦我杀死了长时间运行的进程,回滚就会自动发生。这是一个MySQL数据库。
fnvucqvd1#
你可以试试这个https://dba.stackexchange.com/questions/5654/internal-reason-for-killing-process-taking-up-long-time-in-mysql您可以杀死mysqld进程并将innodb_force_recovery设置为3,以在不回滚的情况下启动数据库,然后DROP导致失控回滚的表。
zz2j4svz2#
你必须先停止mysql(在使用mysqldump进行完全备份之前:)
systemctl stop mysql
字符串
如果无法停止,请使用f4过滤器关闭htop中的所有MySQL进程,并尝试停止MySQL
在MySQL配置文件中的行下方设置停止后
innodb_force_recovery = 1
型最后启动MySQL
kkbh8khc3#
注意,停止mysql将启动对任何未提交事务的回滚日志的处理;'mysqladmin shutdown'命令的超时时间可能比回滚所需的时间少得多,因此您可能会进入服务器无法通过init script / systemd服务或mysqladmin命令启动或停止的状态(就像我一样)。不要用'-9'/'-KILL'(SIGKILL)杀死服务器,除非数据丢失是可以的(你要删除并重新创建数据库)-要有耐心!:-)在Linux上:
[root@host]# kill -TERM `pidof mysqld`
字符串将启动服务器的关闭,而无需连接到其数据库连接套接字。下面是一个脚本,它将显示回滚日志处理的进度:
[root@host]# log_len=$(wc -l /var/log/mysql/error.log); [root@host]# while sleep 10; do tail -n +$log_len /var/log/mysql/error.log | egrep '^ROLLING BACK.*undo log entries'| tail -n 1; log_len=$(wc -l /var/log/mysql/error.log); done ROLLING BACK 875593 lock struct(s), heap size 100792760, 3022415 row lock(s), undo log entries 841038 ROLLING BACK 875575 lock struct(s), heap size 100792760, 3020756 row lock(s), undo log entries 839380 ...
型因此,我的DB+机器的速度大约是每秒100个日志条目,非常慢,但比损坏DB要好。
3条答案
按热度按时间fnvucqvd1#
你可以试试这个
https://dba.stackexchange.com/questions/5654/internal-reason-for-killing-process-taking-up-long-time-in-mysql
您可以杀死mysqld进程并将innodb_force_recovery设置为3,以在不回滚的情况下启动数据库,然后DROP导致失控回滚的表。
zz2j4svz2#
你必须先停止mysql(在使用mysqldump进行完全备份之前:)
字符串
如果无法停止,请使用f4过滤器关闭htop中的所有MySQL进程,并尝试停止MySQL
在MySQL配置文件中的行下方设置停止后
型
最后启动MySQL
kkbh8khc3#
注意,停止mysql将启动对任何未提交事务的回滚日志的处理;'mysqladmin shutdown'命令的超时时间可能比回滚所需的时间少得多,因此您可能会进入服务器无法通过init script / systemd服务或mysqladmin命令启动或停止的状态(就像我一样)。
不要用'-9'/'-KILL'(SIGKILL)杀死服务器,除非数据丢失是可以的(你要删除并重新创建数据库)-要有耐心!:-)
在Linux上:
字符串
将启动服务器的关闭,而无需连接到其数据库连接套接字。
下面是一个脚本,它将显示回滚日志处理的进度:
型
因此,我的DB+机器的速度大约是每秒100个日志条目,非常慢,但比损坏DB要好。