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

  • 发布时间:2016-01-13 13:53 | 作者:yc | 来源:互联网 | 浏览:1200 次
  • 记一次因磁盘块默认保留策略导致的数据库导入失败问题

    迩来开拓职员要新测验一个功用,需求用到出产情况中的数据库(出产库版别: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的体系表空间永远不会减小,并且数据库中所有的数据库实例都邑同享体系表空间,会致使这个文件会越来越大年夜,乃至于耗尽磁盘空间

    例如举个实践的比方:

    650) this.width=650;" title="image" style="border-right-width:0px;border-bottom-width:0px;border-top-width:0px;" border="0" alt="image" src="/html/uploads/allimg/160113/1354156458-0.jpg" width="555" height="67" />

    650) this.width=650;" title="image" style="border-right-width:0px;border-bottom-width:0px;border-top-width:0px;" border="0" alt="image" src="/html/uploads/allimg/160113/1354153264-1.jpg" width="555" height="66" />

    上图等于出产库和测验库的比方,出产库的ibdata1文件现已达到了90GB,测验库的ibdata1文件也不甘示弱,达到了71GB

    以下详细说说此功课的颠末

    出产库的磁盘为SSD磁盘,功能仍是不错的,逐日早上4点都稀有据库备份脚本对出产库备份(mysqldump出sql并压缩成zip文件)因而要将出产库的库同步到测验库的话只需求将备份文件用scp指令颠末内网地址传输到测验库,将zip文件解压出来,颠末nohup指令后台导入即可

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354152923-2.jpg" height="209" />

    但随即发明疑问不妙本来监控体系早就报警说磁盘空间短缺20%,一贯没介意,后来发明磁盘空间直接应用率100%了

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354151T3-3.jpg" height="211" />

    可是发明分明总空间有99GB而运用94GB,而运用率却是100%,那5GB“不翼而飞”了?经排查,香港马会资料官方网声明先扫除磁盘毁坏身分,后来断定为原先是一个默许的体系掩护计谋

    此计谋的英文描画如下:

    Reserving some number of filesystem blocks for use byprivilegedprocessesis 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等体系

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354155952-4.jpg" height="164" />

    dumpe2fs /dev/xvdb1 |grep -i "block coun"

    awk 'BEGIN{print / }' ,bc器械做浮点数除法时有疑问,主张运用awk

    #0.05 --> 5% Reserved block count --> refer to 'man 8 tune2fs' and option '-m'

    经图上核算正好是5%!已然这是默许计谋,不管是默许仍是不默许的,都能够调剂,然后用tune2fs调剂一下,如下图所示:

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354153H7-5.jpg" height="354" />

    这么那5GB空间就能够运用了,然后拔除一些运用日志持续实行法度榜样后发明仍是有疑问

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354152095-6.jpg" height="310" />

    从头实行mysql导入指令后发明磁盘空间很快又被用尽了,赶忙撤销导入指令

    650) this.width=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/135415NC-7.jpg" height="469" />

    记一次因磁盘块默认保留策略导致的数据库导入失败问题650) this.widGPI老虎机th=650;" title="2015-10-23_" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" border="0" alt="2015-10-23_" src="/html/uploads/allimg/160113/1354151U9-9.jpg" height="471" />

    此刻才起头注重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--

    这篇文章出自 “通讯,我的独爱” 博客,请必须保存此出处http://dgd2010.blog.51cto.com//

  • 相关内容

友情链接: