首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地杀死MySQL?

问如何正确地杀死MySQL?
EN

Database Administration用户
提问于 2013-03-06 05:28:02
回答 3查看 97.7K关注 0票数 33

我安装了CentOS 64位,安装了CPanel,我使用:

代码语言:javascript
复制
service mysql stop

它只是不停地滴答作响,从来没有停止过。在日志中,它只发布了很多:

130303 17:42:38 [Warning] /usr/sbin/mysqld: Forcing close of thread

在err.log文件中,我看到了许多这样的内容:

[Warning] /usr/sbin/mysqld: Forcing close of thread

它曾经是即时的。知道为什么要这样做吗?怎么解决?

现在我必须做killall -9 mysql,但是有更好的方法吗?

服务器也非常活跃。

这是配置问题吗?我的记忆设置太高了吗?

代码语言:javascript
复制
[mysqld]
default-storage-engine=MyISAM
local-infile=0
symbolic-links=0
skip-networking
max_connections = 500
max_user_connections = 20
key_buffer = 512M
myisam_sort_buffer_size = 64M
join_buffer_size = 64M
read_buffer_size = 12M
sort_buffer_size = 12M
read_rnd_buffer_size = 12M
table_cache = 2048
thread_cache_size = 16K
wait_timeout = 30
connect_timeout = 15
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 64M
query_cache_type = 1
low_priority_updates=1
concurrent_insert=ALWAYS
log-error=/var/log/mysql/error.log
tmpdir=/home/mysqltmp
myisam_repair_threads=4
[mysqld_safe]
open_files_limit = 8192
log-error=/var/log/mysql/error.log

[mysqldump]
quick
max_allowed_packet = 512M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M
EN

回答 3

Database Administration用户

发布于 2013-03-07 00:43:33

这听起来好像你的问题不是关于“如何”关闭MySQL,而是更多关于为什么你的关闭速度这么慢。

在我对类似问题的回答中,我为顺利重新启动提供了一些建议,这有助于减少在请求MySQL开始停堆过程之后必须发生的活动量。

如果您不是SHOW FULL PROCESSLIST;的频繁用户,这就是第1项,因为您需要了解服务器中发生了什么,从而使关闭变得如此缓慢。如果有长期运行的查询是安全的中断,你可以用KILL <thread-id>杀死他们。

重述其他建议:

设置全局变量innodb_fast_shutdown = 1 (默认)将加快InnoDB的关机部分。但是,只有当您出于与执行升级无关的原因关闭服务器时,这才是安全的。如果要关闭以进行升级,则必须将其设置为0。

使用FLUSH TABLES;优雅地关闭所有打开的表。如果被后续查询引用,它们将被重新打开,但此操作最终仍应减少从请求关机到关闭完成时间之间的时间,因为它做了一些早期的内务工作,更重要的是它为最后一步奠定了基础.

FLUSH TABLES WITH READ LOCK;关闭所有打开的表,并获得当前客户端连接所拥有的独占锁,该锁阻止任何其他连接写入整个服务器上的任何表。在拥有此锁之前,您将无法获得mysql>提示符,此时您可以发出关机请求--但不要断开与此会话的连接。

在繁忙的服务器上,这些步骤应该减少服务器上的活动级别,使事情变得更加安静,并有助于使关闭或重新启动更加顺利。

票数 6
EN

Database Administration用户

发布于 2013-03-07 13:27:50

很可能MySQL不是纯粹的锁定,而是在进行清理活动(回滚等等)。当关闭的时候。如果在关闭时不让它完成所有这些,那么启动时通常需要等待。

下面是要查看的内容:在一个终端窗口中关闭mysql,而在另一个终端窗口中查看错误日志(tail -f yourerror.log)。错误日志将显示MySQL正在做什么。

票数 2
EN

Database Administration用户

发布于 2013-03-06 13:20:43

MySQL init脚本的标准实现使用SIGTERM向MySQL发出信号,并等待一定的时间使MySQL关闭。

MySQL接收到SIGTERM后,将首先停止接收新的连接,然后完成执行任何仍然挂起的查询(这可能需要一段时间,取决于您的工作负载和并发客户端的数量),然后开始将数据刷新到磁盘(这可能需要很长时间,同样取决于您的工作负载、配置、可用内存和存储引擎选择)。在完成所有数据刷新之后,MySQL将释放它在初始化阶段分配的任何内存(这也需要一段时间,取决于MySQL分配的内存量),关闭所有仍然打开的文件句柄,然后调用"exit(0)“。

如果关闭MySQL的请求需要很长时间才能关闭,则很可能需要很长时间才能完成这一阶段。如果您有时间,我强烈建议您等待进程完成(这将避免数据丢失或长时间恢复过程时再次启动数据库实例)。

不幸的是,你的问题中没有足够的信息让我为你的问题提出适当的解决方案。我希望这有助于理解这一问题。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/36102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档