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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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,如需转载请自行联系原作者


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
1月前
|
存储 负载均衡 安全
高效管理大型数据库:分片与复制的策略与实践
在当今数据驱动的世界中,管理和优化大型数据库系统是每个企业的关键任务。特别是在面对数据量迅速增长的情况下,如何确保系统的高可用性和性能成为重要挑战。本文探讨了两种核心技术——分片(Sharding)和复制(Replication),以及它们在实际应用中的策略与实践。通过对比这两种技术的优缺点,并结合具体案例分析,本文旨在为数据库管理员和开发者提供一套高效管理大型数据库的综合方案。
|
7天前
|
监控 数据库 数据安全/隐私保护
数据库管理策略
数据库管理策略
18 2
|
11天前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与实践
随着微服务架构的普及,如何高效管理和优化数据库访问成为了关键挑战。本文探讨了在微服务环境中优化数据库访问的策略,包括数据库分片、缓存机制、异步处理等技术手段。通过深入分析实际案例和最佳实践,本文旨在为开发者提供实际可行的解决方案,以提升系统性能和可扩展性。
|
1月前
|
关系型数据库 MySQL 大数据
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
|
1月前
|
SQL 数据可视化 关系型数据库
成功解决7版本的数据库导入 8版本数据库脚本报错问题
您提供的链接是一篇关于如何解决在MySQL数据库中导入脚本时出现版本兼容性问题的博客文章。文章中提到,如果在MySQL 5.7之前的版本中使用utf8mb4_0900_ai_ci排序规则,会遇到"Unknown collation"错误。解决办法包括升级MySQL版本到8.0或更高,或者更改排序规则为utf8mb4_general_ci或utf8mb4_unicode_ci,并提供了修改SQL脚本的示例。 如果您需要更详细的信息或有其他问题,请告诉我。
|
1月前
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
42 2
|
1月前
|
存储 SQL 数据库
OceanBase数据库的分区策略
【8月更文挑战第13天】OceanBase数据库的分区策略
124 5
|
1月前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
150 2
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB 数据库迁移工具与策略
【8月更文第27天】随着业务的增长和技术的发展,企业常常需要对现有的数据库进行升级或迁移以适应新的需求。阿里云提供的 PolarDB 是一款高性能的关系型数据库服务,支持 MySQL、PostgreSQL 和 Oracle 三种存储引擎。本文将介绍如何利用 PolarDB 提供的迁移工具来高效地完成数据迁移工作,并探讨在迁移过程中需要注意的关键点。
54 0