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
,但是有更好的方法吗?服务器也非常活跃。 br />
这是配置问题吗?我的记忆卡设置是否太高?
[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
#1 楼
关闭mysql的一种最巧妙的方法就是简单地运行mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
这里是为什么:依赖于套接字文件的存在。从历史上讲,回到MySQL 4.0时,套接字文件有时会莫名其妙地消失。这妨碍了标准的
/etc/init.d/mysql
正常工作。只说
mysqladmin -uroot -p -h127.0.0.1 shutdown
还不够,因为mysqld会将以
service mysql stop
身份进入的用户路由到root@127.0.0.1
如果未显式启用TCP / IP。默认情况下,mysqld将选择最小的电阻路径,并通过套接字文件将root@localhost
连接到root@127.0.0.1
。但是,如果没有套接字文件,则root@localhost
将永远不会连接。即使mysqladmin上的MySQL文档也说:
如果在连接时执行mysqladmin shutdown对于使用Unix套接字文件的本地服务器,mysqladmin等待直到服务器的进程ID文件被删除,以确保服务器已正确停止。
这就是为什么必须启用TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
回到2011年9月30日,我编写了自己的
root@localhost
版本mysqld_multi
(请参见我的文章:在同一主机上运行多个实例) )。它用作从不同端口连接到mysqld的虚拟引擎。您只需要携带自定义参数的mysqlservice
。在该脚本中,我这样发出关闭命令:注意,我使用my.cnf
和显式端口。这样,我就不再依赖套接字文件了。如果
${MYSQLD_STOP}
挂起,我一直使用127.0.0.1
作为关闭mysql的正确选择。在mysqladmin --protocol=tcp shtudown
和service mysql stop
上执行kill -9
应该是最后一种手段中的最后一种。 (是,我说了三遍)。很多时候,mysqld毫无警告地删除了mysql.sock。多年来,其他人也遇到了这个问题:
关机问题
原始帖子:http://forums.freebsd。 org / showthread.php?t = 28924
使用
mysqld
的解决方案:http://forums.freebsd.org/showpost.php?s=8d095ca69da3daf2ad4b157c8ad95f1f&p=161653&postcount=10 http://forums.cpanel.net/f354/cant-connect-local-mysql-server-through-socket-var-lib-mysql-mysql-sock-111-a-78444。 html
EPILOGUE
我已经说过这个秘密:通过mysqladmin通过TCP / IP(
mysqld_safe
)连接到mysql并发出mysqladmin shutdown
。这必须起作用,因为关闭特权位于--protocol=tcp
中,仅用于经过身份验证的关闭。当关闭Linux服务器上的mysqld时能够从Windows计算机发出远程关闭操作时,这节省了我的工作时间。UPDATE 2013-03-06 22:48 EST
如果您担心关机期间会发生什么,可以使用一种方法来控制关机时间以及将数据刷新到磁盘的方式,尤其是在缓冲池中有很多InnoDB数据的情况下,
建议#1
如果有很多脏页,可以将innodb_max_dirty_pages_pct降低到0:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
在关机前约15-30分钟进行设置。这将使mysqld尽可能少的脏页写入磁盘。
建议#2
默认情况下,innodb_fast_shutdown为1。此选项有三个值
0:InnoDB在关闭之前执行慢速关闭,完全清除和插入缓冲区合并。
1:InnoDB在关闭时跳过这些操作,这称为快速过程shutdown。
2:InnoDB刷新其日志并关闭冷启动,就好像MySQL崩溃了一样。不会丢失任何已提交的事务,但是崩溃恢复操作使下一次启动花费的时间更长。
文档进一步说:
在仍然缓冲大量数据的极端情况下,缓慢关闭可能需要几分钟甚至几小时。在MySQL主要版本之间进行升级或降级之前,请使用慢速关机技术,以便为所有数据文件做好充分准备,以防升级过程更新文件格式。
在紧急情况或故障排除情况下,使用innodb_fast_shutdown = 2,如果数据有损坏的风险,则可以绝对最快地关闭计算机。
innodb_max_dirty_pages_pct和innodb_fast_shutdown的默认值在大多数情况下应该很好。
#2 楼
听起来您的问题似乎不是关于“如何”关闭MySQL的问题,而更多是关于您为何如此缓慢地关闭MySQL的问题。在回答类似问题时,我提出了一些建议,以帮助您顺利地关闭MySQL。重新启动,这有助于减少在您请求MySQL开始关闭过程之后必须进行的活动。了解服务器中正在发生的事情,这使关机非常缓慢。如果存在可以安全中断的长时间运行的查询,则可以使用
SHOW FULL PROCESSLIST;
杀死它们。取消其他建议:将加快InnoDB关闭的速度。但是,只有在由于与执行升级无关的原因而关闭服务器时,这才是安全的。如果要关闭升级,则必须将其设置为0。
使用
KILL <thread-id>
可以正常关闭所有打开的表。如果随后的查询引用了它们,它们将被重新打开,但是此操作仍将最终减少从您请求关闭到关闭完成之间的时间,因为它会做一些早期的内务处理,更重要的是,它设置了阶段对于最后一步... innodb_fast_shutdown = 1
关闭所有打开的表并获取您当前客户端连接拥有的排他锁,该锁可防止任何其他连接写入整个服务器上的任何表。在拥有此锁之前,您不会收到FLUSH TABLES;
提示符,此时您可以发出关闭请求-但不要断开此会话的连接。在繁忙的服务器上,这些步骤应降低服务器上的活动级别,应该使事情变得更安静,并有助于使关机或重新启动更加顺利。
#3 楼
MySQL可能不是纯粹被锁定,而是在关闭时正在执行清理活动(回滚等)。如果不让它在关闭时执行所有操作,则通常必须在启动时等待。这里有一些需要注意的事情:在一个终端窗口中关闭mysql并同时查看错误日志(tail -f [yourerror.log])在另一个终端窗口中。错误日志将向您显示MySQL在做什么。
#4 楼
很遗憾听到您的经验,并希望我对类似的愚蠢MySQL场景的经验能对您有所帮助。而不是试图弄清楚如何从MySQL中终止MySQL服务。服务器,在某些情况下,您需要通过以下方式检查系统的运行状况,以确定是否存在服务滥用(假设基于CentOS / RHEL环境的概念):
/usr/bin/iostat
/usr/bin/uptime
top -c
使用以下信息确定平均系统负载和系统内消耗最大的资源。
您还需要安装
mytop
以获得有关系统正在处理的SQL语句。要安装
mytop
,只需执行以下操作: cd /root
wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
tar -zxvf /root/mytop-1.6.tar.gz
cd /root/mytop-1.6
perl Makefile.pl
make
make install
chmod 644 /usr/local/bin/mytop
vi /usr/local/bin/mytop
(使用您更喜欢)
搜索
"long|!" => $config{long_nums}
,将其注释为
#"long|!" => $config{long_nums}
,chmod 555 /usr/local/bin/mytop
与mytop搭配使用。用它来检查正在占用MySQL服务的MySQL语句并停止它们。
执行上述说明将为您提供以下功能:
诊断服务器的状态/健康状况
诊断原因瓶颈
一旦消除了瓶颈的原因,当您尝试重新启动MySQL服务时,应该会过得轻松一些。我希望您会发现上述信息对您有用。您可能应该在现代系统上使用
mytop
。#5 楼
MySQL的初始化脚本的标准实现通过SIGTERM发出信号给MySQL,并等待一定时间以使MySQL关闭。在收到SIGTERM之后,MySQL将首先停止接收新的连接,然后完成执行仍然悬而未决的查询(这可能要花一些时间,具体取决于您的工作量和并发客户端的数量),然后开始将数据刷新到磁盘(这可能需要很长时间,再次取决于您的工作量,配置,可用内存和存储引擎的选择)。完成所有数据刷新后,MySQL将释放其在初始化阶段分配的任何内存(这也可能需要一段时间,具体取决于MySQL分配的内存量),关闭所有仍打开的文件句柄,然后调用“ exit(0)”。
如果关闭请求后MySQL需要很长时间关闭,则很可能其中一个或多个阶段需要很长时间才能完成。如果有时间,我强烈建议您等待该过程完成(当您再次启动数据库实例时,这可以避免数据丢失或冗长的恢复过程)。
不幸的是,其中没有足够的信息您的问题,以便我为您的问题提出适当的解决方案。我希望这有助于理解问题。
评论
该套接字文件在Red Hat衍生产品上消失了,因为tmpwatch删除了该文件,以及/ tmp中其他所有时间早于其配置阈值的文件。
– Michael-sqlbot
13 Mar 6 '13 at 19:32
谢谢@ Michael-sqlbot最后,我需要听到某人的来信。我猜这就是为什么MySQL AB(Oracle之前,Sun之前)的某人决定向mysql.user添加SHUTDOWN特权来解决这种麻烦的原因。
– RolandoMySQLDBA
2013年3月6日19:38
在Debian或Ubuntu上,使用mysqladmin --defaults-file = / etc / mysql / debian.cnf shutdown ...该文件包含类似root的MySQL帐户的凭证。
– 0xC0000022L
16-10-26在8:14
和往常一样,@ RolandoMySQLDBA是Stack Exchange站点上最好的DBA资源之一。 6多年后,这里的出色工作对我有所帮助。
–Giacomo1968
19-09-24的3:45