一、mysql关机的过程
1、发起shutdown
2、如果需要是否新建一个关闭线程shutdown thread,如果是客户端发起的关闭,就会建一个专用的关闭线程
3、mysql server不再响应新的连接请求,关闭tcp/ip网络监听,关闭unix/linux的socket等通道
4、逐渐关闭当前事务的连接/事务,空闲将理解被终止
5、mysql server进程关闭所有的线程,关闭所有的储存引擎,innodb会将buffer pool刷新到磁盘中,把当前的LSN记录到表空间中, 然后再关闭内部的所有线程
6、mysql server进程退出
二、mysql如果发送阻塞,怎么关机处理
① 连接进入mysql, mysql -uroot -p
② 检查是否设置innodb_fast_shutdown,默认是1, 允许快速关闭innodb (0,1,2)
设置为1:关闭MySQL的时候不会做清除脏页和插入缓冲区的合并操作,也不会将脏页刷新到磁盘
设置为0:会做清除脏页和插入缓冲区的合并操作,也会将脏页全部刷新到磁盘上面去,但是这个时候关闭的速度也是最慢的
设置为2:不会做清除脏页和插入缓冲区的合并操作,也不会将脏页刷新到磁盘,但是会刷新到redo log里面,再下次启动mysql的时候恢复
③ 设置innodb_max_dirty_pages_pct = 0, 让innodb把所有的脏页刷新到磁盘中
④ 设置 max_connections = 1, 不允许再有新的连接进入mysql
⑤ 关闭所有不活跃的线程,也就是说状态为slepp,而且time > 1有线程id
(root@localhost) [(none)]> select concat('kill ', id, ';') from information_schema.processlist where user = 'root';
+--------------------------+
| concat('kill ', id, ';') |
+--------------------------+
| kill 5; |
+--------------------------+
1 row in set (0.00 sec)
批量查出 kill id的记录,然后复制,放到mysql中进行kill。
⑥ show engine innodb status\G
History list length(History list length是指在回滚空间中的未清除事务数。随着事务的提交,它的值会增加;随着清除线程的运行,它的值会减小)
History list length 0 --- 低于500,也就是没有被purge的事务是不是很少
查看刷新脏页的日志记录号
Log sequence number 543329726
Log flushed up to 543329726
Pages flushed up to 543329726
Last checkpoint at 543329717
0 pending log flushes, 0 pending chkp writes
⑦ 然后执行 flush local tables操作,刷新所有的table cache,关闭已打开的表.
flush local tables 不会记录到二进制日志
⑧ 如果是slave服务器,最好先关闭IO线程,等所有的中继日志relay log都应用完了后,再关闭sql线程,如果有大事务,一定要等大事务结束后,再关sql线程
⑨ 最后执行mysqladmin shutdown