我安装了带有CPanel的CentOS 64位,并且使用:

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 shtudownservice 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的默认值在大多数情况下应该很好。

评论


该套接字文件在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

#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需要很长时间关闭,则很可能其中一个或多个阶段需要很长时间才能完成。如果有时间,我强烈建议您等待该过程完成(当您再次启动数据库实例时,这可以避免数据丢失或冗长的恢复过程)。

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