`
hot66hot
  • 浏览: 458971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL 研究innodb_max_purge_lag分享

阅读更多
现象:
线上数据库每个表分配一个ibdata,但是总的ibdata文件很大,超过10G,用相关工具查看,大部分空间都是undo_log

分析了db33的ibdata1的记过
Total number of page: 2398464: 2.4M的page * 16K = 38G
Insert Buffer Free List: 2659
B-tree Node: 5720
Freshly Allocated Page: 12725
Undo Log Page: 2352027
File Segment inode: 25333
可以看到绝大部分的空间,都是被undo log占用了....


分析:
undo log 过大 看来是Mysql的一个“problematic feature” 从03年到现在一直都有人抱怨这个问题。有补丁(需要自己修改源码编译),但是不知道是否可靠...
http://bugs.mysql.com/bug.php?id=57611
http://bugs.mysql.com/bug.php?id=1341
出现的原因的一个可能原因:purge 线程赶不上速度,没有即使回收不用的undo page。可以增加一些
这里面http://bugs.mysql.com/bug.php?id=45173 有人提出一些优化参考的方案:
增大innodb_io_capacity (mysq 5.0不支持 5.1才有)
设置独立的purge thread mysql 5.0不支持,5.5才有
调节 innodb_max_purge_lag 这个值表明,当purge赶不上写操作的时候,写操作delay的时间指标,我们是0,表示不等待,有可能大并发写,purge落后

查看了一下文档,结论:不推荐用innodb_max_purge_lag来实现undo log扩充的问题。
主要原因如下:
1,innodb_max_purge_lag调节参数不好设定,调整不好会强烈影响到正常insert,update的时效,得不偿失
2,innodb_max_purge_lag,有人实验证明,该参数调节影响不是很大,对delete,insert没有作用,副作用大,强烈不推荐 http://mysqldump.azundris.com/archives/81-DELETE,-innodb_max_purge_lag-and-a-case-for-PARTITIONS.html

undo log较大的原因是:
1,Mysql 每10S操作一次purge
2,每次purge mysql做多回收20 page 的undo log

如果10S之内删除,update的数据操作20 page,也就是320K的东西,就会出现purge 回收不及时的情况,就会出现undo log过大。

对应的 queue表,是删除过一次,平均queue数据长度为292 因此只要1S删除queue表超过100行,就会出现上述情况。因此只要线上大规模 delete 数据就会出现删除不干净的情况。


解决方案:
1,delete操作,脚本控制,不要一口气删除感觉,要sleep,控制在1S删除100条的速度  这个已经证明是一个非常好的方案。删除短信数据的时候,如果速度过快,ibdata显著增加,如果控速适当,该文件是根本不会增加的
2, 如果是全表删除,推荐truncate,ddl不会写undo
3, 如果是delete + where 删除的需求,也可以考虑建立新表,导入部分旧表数据+truncate 旧表的方式,
4, DAO层面支持分表操作,彻底去掉删除大表数据这种事情
分享到:
评论

相关推荐

    py_innodb_page_info工具

    《深入解析py_innodb_page_info:MySQL InnoDB存储引擎底层探索》 在数据库的世界里,MySQL的InnoDB存储引擎以其强大的事务处理能力和行级锁定机制而备受青睐。然而,对于其内部工作原理,许多开发者可能并不十分...

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

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

    py_innodb_page_info.zip

    《MySQL技术内幕-InnoDB存储引擎》是一本深入探讨MySQL数据库InnoDB存储引擎的权威书籍,而`py_innodb_page_info.zip`则是该书中提到的一个实用工具,用于分析InnoDB存储引擎的数据页信息。这个Python工具帮助我们...

    MySQL修改innodb_data_file_path参数的一些注意事项

    innodb_data_file_path用来指定innodb tablespace文件,如果我们不在My.cnf文件中指定innodb_data_home_dir和innodb_data_file_path那么默认会在datadir目录下创建ibdata1 作为innodb tablespace。 说明 在测试环境...

    py_innodb_page_info工具类 包含python2,python3两个版本

    py_innodb_page_info工具为《INNODB存储引擎》作者姜承尧写的。 该工具用来分析表空间中的各页得类型和信息,用python编写。 网上多是python2版本的,这里给出python3版本的。

    mysql 5.6 新特性-innodb

    ### MySQL 5.6 新特性-InnoDB:深入剖析 #### MySQL 5.6 版本简介及重要性 MySQL 5.6 是 MySQL 的一个重要版本,相比于之前的版本(如 MySQL 5.1 和 5.5),它在多个方面进行了显著的改进。这些改进不仅提升了...

    MySQL的Innodb引擎配置说明.txt

    内容包括: 1.MySQL的Innodb引擎配置 1.如何配置MySQL服务器的最大连接数量 2.如何配置innodb_open_files,table_open_cache,innodb_file_io_threads和innodb_buffer_pool_size,innodb_log_file_size

    MySQL Innodb 参数详解与优化实践

    如果设置为空字符串,可以在`innodb_data_file_path`中指定绝对路径。 - **应用场景**:适用于需要自定义InnoDB表空间存放位置的情况,例如分离存储以提高性能或简化管理。 ##### 2. `innodb_data_file_path` - **...

    py_innodb_page_info.py

    《Python解析MySQL InnoDB页面信息:py_innodb_page_info.py》 在数据库管理领域,深入理解存储引擎的内部工作原理对于优化查询性能和解决数据问题至关重要。MySQL的InnoDB存储引擎是广泛使用的,它提供了事务处理...

    InnoDB_Log_Structures

    - `innodb_log_files_in_group`:日志组中重做日志文件的数量。 - `innodb_log_file_size`:每个重做日志文件的大小。 - `innodb_log_files_group`:用于指定日志组。 - `innodb_flush_log_at_trx_commit`:决定日志...

    innodb_ruby-master.zip

    《MySQL分析:深入理解InnoDB》 MySQL数据库系统在当今数据存储领域占据着重要的地位,尤其在InnoDB存储引擎的支持下,它提供了事务处理、行级锁定以及外键约束等功能,使得MySQL能够满足复杂的业务需求。InnoDB是...

    py_innodb_page.tar.gz

    《深入解析MySQL Innodb页结构:py_innodb_page.tar.gz》 MySQL作为一个广泛使用的开源关系型数据库管理系统,其InnoDB存储引擎在处理事务、行级锁定等方面表现出色。InnoDB内部的数据存储机制是基于页(Page)的,...

    mysql innodb_thread_concurrency.zip

    如果你的服务器的CPU或者IO使用接受饱和,特别是偶尔出现峰值,这时候系统想在超载时能正常处理查询,那么强烈建议关注innodb_thread_concurrency

    关于MySQL innodb_autoinc_lock_mode介绍

    MySQL的InnoDB存储引擎在处理带有`auto_increment`列的表时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了插入数据时如何管理自动递增锁,从而在性能和数据安全性(主从数据一致性)之间取得平衡。 ...

    MYSQL innodb性能优化学习总结

    - **innodb_read_io_threads 和 innodb_write_io_threads**:分别用于读操作和写操作的线程数,可以根据实际情况进行调整以提升性能。 - **innodb_file_per_table**:该参数控制InnoDB是否为每个表使用独立的数据...

    浅析在线调整 innodb_buffer_pool_size

    浅析在线调整 innodb_buffer_pool_size 作者:zhou mysql版本:5.7 先介绍一下 buffer pool: 在innodb存储引擎中数据访问以page为单位,page也是innodb管理数据库的最小磁盘单位,每个page的默认大小为16KB(可以通过...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    《MySQL技术内幕_InnoDB存储引擎_姜承尧_第2版》是一本深入探讨MySQL数据库中InnoDB存储引擎的专业书籍。作者姜承尧是数据库领域的知名专家,他的这部著作详细阐述了InnoDB引擎的核心概念、设计原理以及实际操作技巧...

Global site tag (gtag.js) - Google Analytics