设为首页 收藏本站
查看: 675|回复: 0

[经验分享] mysql innodb 数据预热

[复制链接]

尚未签到

发表于 2018-9-28 09:40:36 | 显示全部楼层 |阅读模式
  高负荷mysql数据库突然崩溃之后,在一段时间内,特别是高峰期,整个应用感觉非常卡!
  这个时候就需要我们对mysql进行预热了!
  因为mysql热点数据都在innodb buffer pool中,如果mysql突然关闭,buffer pool被清空!所有数据都需要从硬盘加载至内存中的buffer pool,当需要某个数据时,才从硬盘拿取,导致速度异常慢!这个时候,我们可以将一些数据手动加载至buffer pool,称为人为预热!
  当然,还有一种方式,在mysql正常关闭的时候,将内存中的buffer pool备份值硬盘!在下次开启时,将该备份导入至buffer pool!这是5.6的快速预热特性!前提是正常关闭,如果是突然关闭或者kill -9关闭,就需要手动预热了!
  简单讲一下几个版本的预热方式!
  5.0
  最简单的,只需要在information_schema.tables依次做一次count统计即可!
  SELECT table_name FROM INFORMATION_SCHEMA.TABLES
  select count(1) from table_name;
  然后SHOW STATSU 查看buffer pool中free页,即Innodb_buffer_pool_pages_free参数是否减少!
  5.1
  对于5.1来说,5.0的方法已经不适用了!
  当时我们还是可以结合information_schema.tables!用动态sql以及游标组装出select * from db.tables limit 1,写一个预热存储过程!(也可以通过shell/python脚本来写!)
  提供一个存储预热存储过程!

  •   DELIMITER $$
  •   USE `mysql`$$
  •   DROPPROCEDURE IF EXISTS `Proc_MySQL_Warmup`$$
  •   CREATE DEFINER=`root`@`%` PROCEDURE `Proc_MySQL_Warmup`(
  •   )
  •   COMMENT '预热mysql存储过程'
  •   BEGIN
  •   #############################################################
  •   #1.先从information_schema.tables中找出所有表
  •   #2.利用游标进行获取
  •   #3.动态语句组装sql
  •   #4.依次执行select * from db.tables limit 1;
  •   #############################################################
  •   # 宣告游标变量
  •   DECLARE p_c INTDEFAULT 0;
  •   # 宣告db.table变量
  •   DECLARE p_table VARCHAR(1024);
  •   # 宣告游标
  •   DECLARE cur1 CURSORFOR
  •   SELECT CONCAT(TABLE_SCHEMA,".",table_name) FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE';
  •   # 如果获得'02000'状态,则表示游标已经获取到最后一个,将p_c变量置为NULL
  •   DECLARECONTINUE HANDLER FOR SQLSTATE '02000'SET p_c = NULL;
  •   # 开启游标
  •   OPEN cur1;
  •   # 在开启循环之前,获取第一个值
  •   FETCH cur1 INTO p_Table;
  •   WHILE (p_c ISNOTNULL) DO
  •   # 打印上一个游标值
  •   # select p_Table;
  •   SET @p_Table= p_Table;
  •   # 进行动态语句执行
  •   SET @SQL=CONCAT("select *  from   ",p_Table, " limit 1 ");
  •   PREPARE smtm FROM @SQL;
  •   EXECUTE smtm ;
  •   DEALLOCATEPREPARE smtm;
  •   FETCH cur1 INTO p_Table;
  •   END WHILE;
  •   END$$
  •   DELIMITER ;
  有的时候上面这种该方法不管用,还是得用select count(1) from table_name;
  5.5
  和5.1类似的操作
  5.6
  如果是正常关闭,可以使用5.6的快速预热备份!
  你只需在my.cnf里,加入如下:
  innodb_buffer_pool_dump_at_shutdown = 1
  解释:在关闭时把热数据dump到本地磁盘。
  innodb_buffer_pool_dump_now = 1
  解释:采用手工方式把热数据dump到本地磁盘。
  innodb_buffer_pool_load_at_startup = 1
  解释:在启动时把热数据加载到内存。
  innodb_buffer_pool_load_now = 1
  解释:采用手工方式把热数据加载到内存。
  在关闭MySQL时,会把内存中的热数据保存在磁盘里ib_buffer_pool文件中,位于数据目录下。
  如果是异常关闭,就只能用5.1的手动预热方法了!
  预热后,查看innodb_buffer_pool是不是变化较大
  SHOW GLOBAL STATUS LIKE '%innodb_buffer%';
  Innodb_buffer_pool_pages_data和Innodb_buffer_pool_pages_free是否变化较大!
  MyISAM预热
  有专用命令进行预热
  LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
  将t1的全部索引加入cache,t2出子叶以外的索引加入缓冲
  还可以对分区进行缓冲
  LOAD INDEX INTO CACHE pt PARTITION (p1, p3);
  具体可以参考http://dev.mysql.com/doc/refman/5.5/en/load-index.html
  预热之后可以查看key_buffer_size中缓冲区使用情况
  查看Key_blocks_unused和Key_blocks_used变化情况



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-603100-1-1.html 上篇帖子: mysql meb备份与恢复 下篇帖子: MySQL外键应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表