`
san_yun
  • 浏览: 2663246 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

也说快速关闭MySQL/InnoDB

 
阅读更多

原文:http://www.orczhou.com/index.php/2010/12/more-about-mysql-innodb-shutdown/

如果用的引擎是InnoDB,每次敲下mysqladmin -uroot -p shutdown关闭数据库的时候,总是很难预测这个命令会执行多久,实际经验表明,短则五秒,长则三十分钟一小时都有可能。也分享一下我的经验吧。

1. 为什么InnoDB关闭会慢?

事实上,并不是每次关闭InnoDB都很慢的。Why?InnoDB较之MyISAM,一个重要特性是InnoDB会在内存中开辟一个Buffer Pool来 存储最近访问的数据块/索引块,使得下次再次访问这个块时速度能够很快。当InnoDB对需要修改数据块的时候,会先记录修改日志,然后直接对 Buffer_Pool中的数据块的操作。记录日志是顺序写,对数据块的操作是内存操作,这让InnoDB在很多场景下有这很好的速度优势。

上面对内存块修改完成后,InnoDB就向客户端返回了。可这时实际磁盘上的数据块,还并没有被更新,我们把这样的page称为Dirty Page。在InnoDB的后台有一个专门的线程来做将内存数据块Flush到磁盘的工作。这个Flush操作就是主要影响InnoDB关闭时间的因素。在关闭MySQL/InnoDB时,所有的Dirty_Page都需要Flush,所以Dirty_Page越多,要Flush的数据块也就越多,意味着InnoDB关闭时间越长

我们可以通过下面的命令来观察Dirty Page的数量:

mysqladmin -uroot ext -i 1 |grep "Innodb_buffer_pool_pages_dirty"
2. 参数innodb_max_dirty_pages_pct

Buffer_Pool中Dirty_Page所占的数量,直接影响InnoDB的关闭时间。参数 innodb_max_dirty_pages_pct可以直接控制了Dirty_Page在Buffer_Pool中所占的比率,而且幸运的是 innodb_max_dirty_pages_pct是可以动态改变的。

所以,在关闭InnoDB之前先将innodb_max_dirty_pages_pct调小,强制数据块Flush一段时间,则能够大大缩短MySQL关闭的时间。

set global innodb_max_dirty_pages_pct=0;

一般执行了上面的命令之后,Dirty_Page的Flush仍需要一段时间,所以要稍等一会儿,再关闭MySQL才有效果。

3. 关闭前做些什么

有时候,就算你改变innodb_max_dirty_pages_pct=0,仍然不能保证InnoDB快速关闭。还有一些注意事项。

设置数据库为只读:如果数据库一直是活跃的,有连接在向里面写数据,那么Dirty Page则还可能不断的产生。

如果是备库,在innodb_max_dirty_pages_pct设置成0的同时,最好先stop slave:这个很关键,而且对关闭时间影响也会很大。第一,主动stop slave后,MySQL在关闭时,需要停止的线程其实是更少了的。第二,如果slave的SQL线程还在执行的话,Buffer Pool则还在活动,Dirty Page也可能还会不断的增多。

一般,如果注意到了上面三点:

set global innodb_max_dirty_pages_pct=0
set global read_only=1
stop slave

关闭数据库,就会很快了。如果你把上面三步做完,然后观察Dirty Page的数量,当数量很少时,再执行命令关库,这样总能保证以较快的速度完成关库命令。

4. 一个注意事项

这里需要注意的是,你不需等到Dirty Page的数量到零,才开始关闭MySQL。因为有时候,即使已经没有活动的会话时,InnoDB的Insert Buffer的合并仍然会产生一些Dirty Page,所以这时你可能会发现,等了很久很久很久Dirty Page的数量仍然大于零。

其实这时,你已经可以快速的关闭数据库了。我怎么判断这种情况呢?这时我们可以通过InnoDB的LSN来判断,下面是SHOW InnoDB Status里面获取的信息:

Log sequence number 814 3121743145 Log flushed up to 814 3121092043 Last checkpoint at 814 2826361389

这里看到,当前的LSN是814 3121743145,最后一个检查点在814 2826361389,也就是说两者相差了3121743145-2826361389=295381756,那么意味着InnoDB还有很多Dirty Page需要Flush。

下面是另一个库的LSN信息:

Log sequence number 0 1519256161 Log flushed up to 0 1519256161 Last checkpoint at 0 1519256161

可以看到,这里的Dirty Page都已经Flush了,那么关闭InnoDB也就很快了。

一般,并不需要等到最后检查点和当前LSN相等才关闭,两者只要相差不多(<1000)关闭起来就很快了。

5. 最后再罗嗦一下

我这个人写博客很罗嗦的,各位看官在忍耐一下吧。

其实,像上面这样折腾,整个关库的过程有可能并不比你直接执行mysqladmin -uroot shutdown快,但是执行上面的步骤,会让你清楚关库到底与多久,可以让你的关库命令能够在一个可以预期的时间内完成。简单的说,会让关库的时间心里有个底。

当你希望一切都心里有底的时候,那你就需要注意上面提到的一些细节。

参考文档

1. How to decrease InnoDB shutdown times

2. 测试快速关闭innodb的方法

3. MySQL/InnoDB Manual

分享到:
评论

相关推荐

    MySQL+InnoDB存储引擎的一些参数.doc

    MySQL的InnoDB存储引擎是其最常用的事务处理引擎,它与Oracle数据库有着共通的设计理念。InnoDB存储引擎支持ACID事务、行级锁定、外键约束等特性,使其成为处理高并发和复杂事务场景的理想选择。在配置和管理InnoDB...

    MYSQL-innodb性能优化学习总结.pdf

    MySQL-InnoDB性能优化是数据库管理中的重要环节,它直接影响到系统的响应速度、并发处理能力和数据安全性。以下是对一些关键参数的详细解读: 1. **innodb_buffer_pool_size**:这是InnoDB存储引擎缓存数据和索引的...

    使用innodb_force_recovery解决MySQL崩溃无法重启问题

    在设置这个参数后,应该尽快备份或导出所有重要数据,然后关闭MySQL服务,修复底层问题,最后清除`innodb_force_recovery`,按照常规流程重新启动数据库。如果可能,最好在测试环境中先验证这种方法,避免在生产环境...

    详解MySQL下InnoDB引擎中的Memcached插件

    总的来说,InnoDB Memcached插件为MySQL带来了一种混合型的数据访问模式,它既保持了SQL的强一致性和事务处理能力,又提供了类似NoSQL的简单API和高性能。这使得开发人员能够根据应用需求灵活选择数据存取方式,同时...

    MySQL禁用InnoDB引擎的方法

    MySQL数据库系统支持多种存储引擎,其中InnoDB和MyISAM是最常见的两种。InnoDB以其事务处理、行级锁定以及外键支持而闻名,适合于处理大量数据并需要高并发读写的情况。MyISAM则以快速查询和较小的磁盘空间占用著称...

    MySQLjsnm-InnoDBccyq_InnoDB_MYSQL_

    MySQL数据库是世界上最受欢迎的关系型数据库管理系统之一,而InnoDB存储引擎是其最常用的事务处理引擎。InnoDB以其强大的性能、高可用性和数据一致性保障而备受赞誉。本资料集"MySQLjsnm-InnoDBccyq_InnoDB_MYSQL_...

    MySQL不支持InnoDB的解决方法

    MySQL是世界上最受欢迎的关系型...总的来说,解决MySQL不支持InnoDB的问题通常涉及到检查配置、重启服务和可能的文件清理。理解不同存储引擎的特性也有助于根据业务需求做出明智的决策,以充分利用MySQL的性能优势。

    Mysql小版本升级指南

    2. **关闭InnoDB快速关闭选项**: 如果你的MySQL实例使用InnoDB存储引擎,你应该在升级前关闭`innodb_fast_shutdown`选项。这可以确保在关闭数据库时进行完整的InnoDB数据和事务清理,避免潜在的数据不一致。 3. *...

    第三十七章:Mysql全量备份及增量备份1

    Xtrabackup是一个开源的热备份工具,它可以对InnoDB和XtraDB存储引擎的MySQL数据库进行无锁备份。相比传统的冷备份,Xtrabackup能在不中断服务的情况下完成全量和增量备份,提高了备份效率,降低了业务影响。使用...

    mysql的安装和使用

    MySQL是一种广泛使用的开源关系型数据库...总的来说,掌握MySQL的安装和基础使用,不仅是数据库管理的基础,也是进行任何涉及MySQL数据库项目开发的前提。通过实践和不断的学习,可以提高对MySQL的深入理解和应用能力。

    MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析

    1. **关闭MySQL服务**:在对InnoDB表空间进行任何更改之前,首先需要停止MySQL服务。 2. **编辑my.cnf配置文件**:打开MySQL的配置文件`my.cnf`,查找`innodb_data_file_path`配置项。 - 如果`my.cnf`配置为`innodb...

    MySQL 5.1官方简体中文参考手册

    MySQL如何打开和关闭表 7.4.10. 在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的...

    一键部署mysql 5-7版本

    本教程将详述如何一键部署MySQL 5-7版本,帮助你快速搭建数据库环境。 1. **安装前准备** 在开始安装之前,确保你的系统已更新到最新状态,并关闭所有防火墙和安全软件,以防安装过程中遇到权限问题。同时,检查...

    取消MYSQL_VERSION为固定参数_MySQL启动、关闭与恢复参数介绍.doc

    设置为1,仅刷新部分脏页到磁盘,这是默认值,快速关闭;设置为2,则跳过所有清理,但可能导致下次启动时进行恢复操作。 如果MySQL非正常关闭,例如通过`kill`命令或服务器意外重启,下次启动时InnoDB存储引擎会...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    01-MySQL启动与关闭深入知识及原理.avi 02-登录MySQL知识深入讲解.avi 03-学会使用MySQL数据库的帮助.avi 04-修改mysql密码多方法实战及注意-排错.avi 05-找回丢失的mysql密码实战.avi 06-多实例找回丢失的mysql密码...

    mysql数据库my.cnf配置文件

    也就是说,如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中, # 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 # 另外,这值...

    MySQL InnoDB MRR优化指南

    总的来说,MySQL InnoDB的MRR优化是数据库管理员和开发者优化查询性能的一个重要工具。正确理解和应用MRR,结合其他优化策略,如索引选择、查询结构优化等,可以显著提升系统整体的查询效率。在实际工作中,应密切...

    mysql性能调优参数

    本文将总结 MySQL 性能调优参数,涵盖 Innodb 相关参数、连接参数、缓存参数、日志参数等多方面,帮助读者快速了解和掌握 MySQL 性能调优的方法。 Innodb 相关参数 1. Innodb_open_files:这个参数限制 Innodb 能...

    MySQL数据库引擎快速指导

    总的来说,MySQL数据库引擎的选择是一项关键决策,需要根据应用的性质、并发性需求、事务处理需求以及对数据完整性和持久性的要求来综合考虑。正确选择和利用引擎特性,能极大地提升数据库系统的效能和稳定性。

Global site tag (gtag.js) - Google Analytics