关闭mysql的最简单方法是简单地运行
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
原因如下:
mysql服务文件(/etc/init.d/mysql
)依赖于套接字文件的存在。从历史上讲,追溯到MySQL 4.0,套接字文件有时会莫名其妙地消失。这妨碍了service mysql stop
工作的标准。
仅仅说还不够
mysqladmin -uroot -p -h127.0.0.1 shutdown
因为mysqld的意志航线在未来一个用户作为root@127.0.0.1
对root@localhost
如果没有明确启用TCP / IP。缺省地,mysqld会选择阻力最小的路径,并连接root@127.0.0.1
到root@localhost
通过套接字文件。但是,如果没有套接字文件,root@localhost
将永远不会连接。
甚至mysqladmin上的MySQL文档都说:
如果在使用Unix套接字文件连接到本地服务器时执行mysqladmin shutdown,则mysqladmin将等待直到服务器的进程ID文件被删除,以确保服务器已正确停止。
这就是为什么必须启用TCP / IP的原因:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
回到2011年9月30日,我剧本我自己的版本mysqld_multi
叫mysqlservice
(请参见我的文章:在同一台主机上运行多个实例)。它用作从不同端口连接到mysqld的虚拟引擎。您只需要my.cnf
自定义参数即可。在该脚本中,我这样发出关闭命令:
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
}
但是什么${MYSQLD_STOP}
呢?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
请注意,我使用127.0.0.1
了一个显式端口。这样,我就不再依赖套接字文件了。
mysqladmin --protocol=tcp shtudown
如果service mysql stop
挂起,我一直作为关闭mysql的适当替代方法。这样做kill -9
的mysqld
和mysqld_safe
应该的最后的最后的最后一个度假胜地的。(是的,我说了三遍)。
很多时候,mysqld毫无警告地删除了mysql.sock。这些年来,其他人也遇到了这个问题:
结语
秘密就如我所说:使用mysqladmin通过TCP / IP(--protocol=tcp
)连接到mysql 并发出shutdown
。这必须起作用,因为关闭特权是mysql.user
专用于经过身份验证的关闭的。当我能够在关闭Linux服务器上的mysqld时从Windows计算机发出远程关闭命令时,这节省了我的工作时间。
更新2013-03-06 22:48 EST
如果您担心关闭期间发生了什么,可以使用一种方法来控制关闭时间以及将数据刷新到磁盘的方式,尤其是在缓冲池中有大量InnoDB数据的情况下
建议#1
如果您有很多脏页,可以将innodb_max_dirty_pages_pct降低为0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
在关机前大约15-30分钟进行设置。这将使mysqld最少数量的脏页写入磁盘。
建议#2
默认情况下,innodb_fast_shutdown为1。此选项有三个值
- 0:在关闭之前,InnoDB执行缓慢关闭,完全清除和插入缓冲区合并。
- 1:InnoDB在关闭时跳过这些操作,该过程称为快速关闭。
- 2:InnoDB刷新其日志并关闭冷启动,就好像MySQL崩溃了一样;不会丢失任何已提交的事务,但是崩溃恢复操作会使下次启动花费更长的时间。
文档进一步说:
缓慢关闭可能需要几分钟,甚至在仍然缓冲大量数据的极端情况下,甚至需要数小时。在MySQL主要版本之间进行升级或降级之前,请使用慢速关机技术,以便为所有数据文件做好充分准备,以防升级过程更新文件格式。
在紧急情况或故障排除情况下,使用innodb_fast_shutdown = 2可以绝对绝对最快地关闭数据,如果有损坏数据的危险。
在大多数情况下,innodb_max_dirty_pages_pct和innodb_fast_shutdown的默认值应该很好。
tmpwatch
删除,并且其中的所有其他文件的时间/tmp
早于其配置的阈值。