32 mysql linux mysql-5.5 shutdown
我安装了 CPanel 的 CentOS 64 位,我使用:
service mysql stop
Run Code Online (Sandbox Code Playgroud)
它只是不停地滴答作响,似乎永远不会停止。在日志中,它只是发布了很多:
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但有更好的方法吗?
服务器也非常非常活跃。
这是配置问题吗?我的内存设置太高了吗?
[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
Run Code Online (Sandbox Code Playgroud)
Rol*_*DBA 39
关闭 mysql 的最巧妙方法就是运行
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Run Code Online (Sandbox Code Playgroud)
原因如下:
mysql 服务文件 ( /etc/init.d/mysql) 依赖于套接字文件的存在。从历史上看,回到 MySQL 4.0,套接字文件有时会莫名其妙地消失。这妨碍了标准service mysql stop的工作。
这还不够说
mysqladmin -uroot -p -h127.0.0.1 shutdown
Run Code Online (Sandbox Code Playgroud)
因为mysqld的意志航线在未来一个用户作为root@127.0.0.1对root@localhost如果没有明确启用TCP / IP。缺省地,mysqld会选择阻力最小的路径,并连接root@127.0.0.1到root@localhost通过套接字文件。然而,如果没有套接字文件,root@localhost将永远连接不上。
如果在使用 Unix 套接字文件连接到本地服务器时执行 mysqladmin shutdown,mysqladmin 会等待直到服务器的进程 ID 文件被删除,以确保服务器已正确停止。
这就是为什么必须启用 TCP/IP 的原因:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Run Code Online (Sandbox Code Playgroud)
回到 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
}
Run Code Online (Sandbox Code Playgroud)
但什么是${MYSQLD_STOP}?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Run Code Online (Sandbox Code Playgroud)
请注意我使用127.0.0.1了一个显式端口。这样,我不依赖于套接字文件。
mysqladmin --protocol=tcp shtudown如果service mysql stop挂起,我一直用作关闭 mysql 的正确替代方法。这样做kill -9的mysqld和mysqld_safe应该的最后的最后的最后一个度假胜地的。(是的,我最后说了三遍)。
很多时候,mysqld在没有警告的情况下删除了mysql.sock。这些年来,其他人也遇到过这个问题:
mysqladmin shutdown:http : //forums.freebsd.org/showpost.php?s=8d095ca69da3daf2ad4b157c8ad95f1f&p=161653&postcount=10秘诀正如我所说:使用mysqladmin通过 TCP/IP ( --protocol=tcp)连接到 mysql并发出shutdown. 这有可能的工作,因为关机的权限是在mysql.user通过身份验证的停机的唯一目的。当我在 Linux 服务器上关闭 mysqld 时能够从我的 Windows 机器发出远程关闭命令时,这节省了我的工作日几次。
如果您担心关闭期间发生了什么,有一种方法可以操作关闭时间和数据刷新到磁盘的方式,尤其是当您在缓冲池中有大量 InnoDB 数据时
如果你有很多脏页,你可以将innodb_max_dirty_pages_pct降低到 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Run Code Online (Sandbox Code Playgroud)
在关机前大约 15-30 分钟设置此项。这将给 mysqld 尽可能少的脏页写入磁盘。
默认情况下,innodb_fast_shutdown是 1。这个选项有三个值
文档进一步说明了这一点:
在仍然缓冲大量数据的极端情况下,缓慢关闭可能需要几分钟甚至几小时。在 MySQL 主要版本之间升级或降级之前使用慢速关机技术,以便在升级过程更新文件格式的情况下,所有数据文件都已做好充分准备。
在紧急情况或故障排除情况下使用 innodb_fast_shutdown=2,以在数据有损坏风险时获得绝对最快的关机速度。
在大多数情况下,innodb_max_dirty_pages_pct 和 innodb_fast_shutdown 的默认值应该没问题。
听起来好像您的问题不是关于“如何”关闭 MySQL,而是关于为什么您的关闭如此缓慢。
在我对类似问题的回答中,我提供了一些平滑重启的建议,这有助于减少在您请求 MySQL 开始关闭过程后必须发生的活动量。
如果您不是SHOW FULL PROCESSLIST;第 1 项的频繁用户,因为您需要了解服务器中发生的事情导致关闭如此缓慢。如果有可以安全中断的长时间运行的查询,您可以使用KILL <thread-id>.
回顾其他建议:
设置全局变量innodb_fast_shutdown = 1(默认)将加速 InnoDB 部分的关闭。但是,这仅在您出于与执行升级无关的原因关闭服务器时才安全。如果您要关闭升级,则必须将其设置为 0。
使用FLUSH TABLES;优雅地关闭所有打开的表。如果后续查询引用它们,它们将被重新打开,但此操作仍应最终减少您请求关闭和关闭完成之间经过的时间,因为它会进行一些早期的内务处理,更重要的是它设置了阶段最后一步……
FLUSH TABLES WITH READ LOCK;关闭所有打开的表并获得当前客户端连接拥有的排他锁,以防止任何其他连接写入整个服务器上的任何表。mysql>在您拥有此锁之前,您不会收到提示,此时您可以发出关闭请求——但不要断开与此会话的连接。
在繁忙的服务器上,这些步骤应该减少服务器上的活动水平,应该让事情变得更安静,并且应该有助于更顺利地关闭或重新启动。
| 归档时间: |
|
| 查看次数: |
94366 次 |
| 最近记录: |