一、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