记一次因磁盘块默认保留策略导致的数据库导入失败问题

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

近日开发人员要新测试一个功能,需要用到生产环境中的数据库(生产库版本:mysql-5.5.38-linux2.6-x86_64),因此需要我协调将生产库同步到测试库(测试库版本:mysql-5.5.38-linux2.6-x86_64)中。由于测试库中有很多从生产库同步过来的库,但这些库大都已经dirty了,所以不如重新同步一份。

由于这些数据库在我接手以前就已经存在了,但直到在我使用的过程中发现,此数据库存在问题,原来它并没有启用innodb_file_per_table选项(这个选项在MySQL 5.6.6以及更高版本中是默认启用的),如果此选项没有被启用,那么使用Innodb数据库类型的数据库的表中的数据和索引都是存放在系统表空间(the system tablespace)的,而系统表空间存放在ibdata_file文件(这个文件默认就是ibdata1)里。如果此选项没有启用就会导致文件系统的性能对数据库的性能产生巨大的影响,特别是当执行一些如DROP TABLE 和 TRUNCATE TABLE操作时。同时因为MySQL的系统表空间永远不会缩小,而且数据库中所有的数据库实例都会共享系统表空间,会导致这个文件会越来越大,以致于耗尽磁盘空间。

例如举个实际的例子:

image

image

上图就是生产库和测试库的例子,生产库的ibdata1文件已经达到了90GB,测试库的ibdata1文件也不甘示弱,达到了71GB。

以下详细说说此事情的经过。

生产库的磁盘为SSD磁盘,性能还是不错的,每日早上4点都有数据库备份脚本对生产库备份(mysqldump出sql并压缩成zip文件)。因此要将生产库的库同步到测试库的话只需要将备份文件用scp命令通过内网地址传输到测试库,将zip文件解压出来,通过nohup命令后台导入即可。

2015-10-23_091300

但随即发现问题不妙。原先监控系统早就报警说磁盘空间不足20%,一直没在意,后来发现磁盘空间直接利用率100%了。

2015-10-23_091046 

但是发现明明总空间有99GB而使用94GB,而使用率却是100%,那5GB“不翼而飞”了?经排查,先排除磁盘损坏原因,后来确定为原来是一个默认的系统保护策略。

此策略的英文描述如下:

Reserving some number of filesystem blocks for use by  privileged  processes  is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem.  Normally, the default percentage of reserved blocks is 5%.

翻译成中文大体如下:

此策略用于为一些特权进程(这个进程与root用户发起的进程不同,注意区分)正确执行完来避免造成文件系统碎片和为了允许系统后台程序如syslogd在非特权进程被阻止写入文件系统后能继续正常的工作,而采取的保留一些文件系统块用于专用的策略。默认保留的块数量是总数量的5%。

这个策略可用于ext2/ext3/ext4等系统。

2015-10-23_090920

dumpe2fs /dev/xvdb1 |grep -i "block coun"     
awk 'BEGIN{print 1310694 / 26213888}' ,bc工具做浮点数除法时有问题,建议使用awk。      
#0.05 --> 5% Reserved block count --> refer to 'man 8 tune2fs' and option '-m'

经图上计算恰好是5%!既然这是默认策略,不管是默认还是不默认的,都可以调整,然后用tune2fs调整一下,如下图所示:

2015-10-23_090434

这样那5GB空间就可以使用了,然后清除一些应用日志继续执行程序后发现还是有问题。

2015-10-23_091020

重新执行mysql导入命令后发现磁盘空间很快又被用尽了,赶紧取消导入命令。

2015-10-23_092045

2015-10-23_092011

此时才开始关注MySQL的ibdata问题,也就是文章刚开始提到的问题了。因此日后配置数据库时如果要使用Innodb一定要记得开启innodb_file_per_table选项。同时5%的磁盘保留策略最好不要随意更改,免得文件系统真的遭到破坏,比如碎片的产生。

再提醒一句:MySQL的系统表空间永远不会缩小,因此ibdata1这个文件会越来越大,要想降低ibdata文件的大小,决不能采用直接删除的办法,如果直接删除了,那就比较悲催了,因为Innodb引擎的原理会轻则导致数据库无法启动(意思是可以恢复),重则导致数据库数据丢失(也能找回来,但未必能100%找回来),唯一降低ibdata文件的办法就是重新安装数据库,没错,是重新安装数据库,将原先的数据库通过mysqldump导出(不要用percona-xtrabackup备份,这个工具并不是导出sql文件),数据库重新安装后,启用innodb_file_per_table选项,再用备份的SQL文件导入。上述操作显而易见还是非常麻烦的。

再额外说一些后续。

如果只有有限的机器做数据库使用,最好不同业务运行在不同的数据库服务器上。即一台机器上运行多个数据库服务器,每一个数据库服务器只运行一个数据库实例,这样做虽然繁琐,但它的好处也是显而易见的。例如一个数据库服务器损坏不会影响一批业务系统。每一个数据库实例可以很容易的对应一个从库,更好的实现HA。如果一个数据库服务器运行多个数据库实例,那么配置主从复制时会非常麻烦,因为有多个实例需要配置主从时,它的二进制文件和pos值在利用mysqldump命令逐个备份数据库时是很难确定的,除非借助percona-xtrabackup或者一些手动的办法,获取唯一的二进制文件和pos值。这种策略的设定正好在mysql的multiserver上很好的得到了体现。

tag:mysql ibdata文件,mysql innodb_file_per_table,tune2fs,磁盘保护策略,系统保留块计数

--end--




本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1705606,如需转载请自行联系原作者


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 缓存 监控
数据库优化技术:提升性能与效率的关键策略
【10月更文挑战第15天】数据库优化技术:提升性能与效率的关键策略
99 8
|
2月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
503 0
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
21天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
1月前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
47 3
|
1月前
|
消息中间件 数据库 云计算
微服务架构下的数据库事务管理策略####
在微服务架构中,传统的单体应用被拆分为多个独立的服务单元,每个服务维护自己的数据库实例。这种设计提高了系统的可扩展性和灵活性,但同时也带来了分布式环境下事务管理的复杂性。本文探讨了微服务架构下数据库事务的挑战,并深入分析了几种主流的事务管理策略,包括Saga模式、两阶段提交(2PC)以及基于消息的最终一致性方案,旨在为开发者提供一套适应不同业务场景的事务处理框架。 ####
|
1月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
31 5
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
283 1
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
828 2