文章转自:http://dbahacker.com/
作者:杨德华
**Google docs 查看地址** [http://docs.google.com/Doc?docid=0AR0iV03BDag2ZGRyMjI5cjdfODAxZnd6ejZ2Z3c&hl=en](http://docs.google.com/Doc?docid=0AR0iV03BDag2ZGRyMjI5cjdfODAxZnd6ejZ2Z3c&hl=en)
**pdf下载地址** [_mysqlporformanceblog_innodb_ (1)](http://dbahacker.com/wp-content/uploads/2010/06/mysqlporformanceblog_innodb_-1.pdf)
测试mysqlporformanceblog提供的减少关闭innodb时间的方法
经常发现一些MySQL镜像库的InnoDB的关闭时间会特别久,mysqlperformanceblog给出了一个不错的解决方案
**How to decrease InnoDB shutdown times **[http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/](http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/ "http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/")
**InnoDB关闭的过程解释**MySQL官方手册介绍 影响到InnoDB关闭的参数有 innodb_fast_shutdown 如果你把这个参数设置为0,InnoDB在关闭之前做一个完全净化和一个插入缓冲合并。这些操作要花几分钟时间,在极端情况下要几个小时。 如果你设置这个参数为1,InnoDB在关闭之时跳过这些操作。 默认值为1。 如果你设置这个值为2 (在Netware无此值), InnoDB将刷新它的日志然后冷关机,仿佛MySQL崩溃一样。已提交的事务不会被丢失,但在下一次启动之时会做一个崩溃恢复。 innodb_max_dirty_pages_pct 这是一个范围从0到100的整数。默认是90。InnoDB中的主线程试着从缓冲池写页面,使得脏页(没有被写的页面)的百分比不超过这个值。如果你有SUPER权限,这个百分比可以在服务器运行时按下面来改变: SET GLOBAL innodb_max_dirty_pages_pct = _value_;
100423 0:10:18 InnoDB: Starting shutdown...
100423 0:10:20 InnoDB: Shutdown completed; log sequence number 0 4000976145
100423 0:10:20 [Note] /usr/sbin/mysqld: Shutdown complete
### 测试环境
1.在一个镜像库节点进行测试,innodb_buffer_pool_size=1G
2.在一个线上节点进行测试,碰巧这个节点要进行机架更换,所以可以趁机测试一把
innodb_buffer_pool_size=12G,线上环境和镜像环境还是有点不一样,没法让Innodb_buffer_pool_pages_dirty的值少于1000,虽然是大于1000,但关闭起来还是比较快速的
**测试过程** **正常关闭的normal-shutdown.sh**
#!/bin/bash
#正常关闭innodb
log="normal-shutdown.log"
start_time=`date`
echo "start time:"$start_time > $log
mysqladmin -defaults-file=db-32-1.cnf -uxxx -pxxx ext ' grep dirty >> $log
mysqladmin -defaults-file=db-32-1.cnf -uxxx -pxxx shutdown
end_time=`date`
echo "end time:" $end_time >> $log
normal-shutdown.log 输出的日志如下
start time:2010年 06月 18日 星期五 17:21:00 CST
' Innodb_buffer_pool_pages_dirty ' 43492 '
end time: 2010年 06月 18日 星期五 17:23:10 CST
**设置****set global innodb_max_dirty_pages_pct =0的关闭方式**
首先执行 mysql -defaults-file=db-31-2.cnf -uxxx -pxxx -e" set global innodb_max_dirty_pages_pct =0" 经过了大概3分钟后 Innodb_buffer_pool_pages_dirty的值少于1000
然后执行faster-shutdown.sh,生成faster-shutdown.log
#!/bin/bash
log="faster-shutdown.log"
start_time=`date`
echo "faster shutdown start time:"$start_time >$log
mysqladmin -defaults-file=db-32-1.cnf -uxxx -pxxx ext ' grep dirty >> $log
mysqladmin -defaults-file=db-32-1.cnf -uxxx -pxxx shutdown
end_time=`date`
echo "faster shutdown end time:" $end_time >>$log
faster-shutdown.log的内容
faster shutdown start time:2010年 06月 18日 星期五 17:47:08 CST
' Innodb_buffer_pool_pages_dirty ' 569 '
faster shutdown end time: 2010年 06月 18日 星期五 17:47:12 CST
Innodb_buffer_pool_pages_dirty
The number of pages currently dirty. Added in MySQL 5.0.2.These are pages that have been modified in memory, but not on disk.
**关闭时间比较**
正常关闭 快速关闭
Innodb_buffer_pool_pages_dirty 43492 569
关闭时间 2分10秒 4秒
### 结论
日常维护中,可以使用set global innodb_max_dirty_pages_pct =0,让Innodb_buffer_pool_pages_dirty 的数值为一个较小的值,这样就可以减少在关闭mysql服务器中耗费在innodb的时间
最终达到减少影响用户的时间
参考资料
**InnoDB启动 **[**http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-start**](http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-start) ** **
**How to decrease InnoDB shutdown times **[http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/](http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/ "http://www.mysqlperformanceblog.com/2009/04/15/how-to-decrease-innodb-shutdown-times/")
**Dirty pages, fast shutdown, and write combining **[http://www.xaprb.com/blog/2010/05/25/dirty-pages-fast-shutdown-and-write-combining/](http://www.xaprb.com/blog/2010/05/25/dirty-pages-fast-shutdown-and-write-combining/) 附上mysqladmin的几个选项已经命令 `password _"new-password"`_ _将当前用户的密码改为new-password,建议new-password使用""引起来。_ `extended-status` Display the server status variables and their values.显示global status的信息,mysqladmin可以使用缩写,因此可以看到作者使用了缩写ext [`--sleep=_delay`_](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_sleep), `-i _delay`_ Execute commands repeatedly, sleeping for _`delay`_ seconds in between. The [`--count`](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_count) option determines the number of iterations. If [`--count`](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_count) is not given, [**mysqladmin**](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html "4.5.2. mysqladmin - Client for Administering a MySQL Server") executes commands indefinitely until interrupted. [](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_compress)[`--count=_N`_](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_count), `-c _N`_ The number of iterations to make for repeated command execution if the [`--sleep`](http://dev.mysql.com/doc/refman/5.1/en/mysqladmin.html#option_mysqladmin_sleep) option is given. 疑问:通过SET GLOBAL innodb_max_dirty_pages_pct = _0对于性能有什么影响,是否有实际价值 _