Mysql中删除数据造成的碎片如何修复

Mysql中删除数据造成的碎片如何修复,第1张

我们都知道,在mysql (这里只探讨innodb) 中delete数据,并非真实删除,而是在这行数据上打了一个del的标记,所以这行占用的空间也并不会释放,但是空间可以被复用,所以期望用delete数据来释放空间的同学可以醒醒了。这样就造成了空间上的碎片,那么如果干掉这些碎片呢。

这里先说结论,alter table语句可以触发表重建,消除碎片空间。

mysql中的数据存储结构大概是下面这个样子的

而delete掉的标记会记录在头信息中。

做个实验,看看空间是否真的没有释放;

创建一张表user,并插入很多数据

查看表的文件大小

再随便插入几条

ok这里看到文件大小增加了16k,这是因为mysql的一页就是16k,所以文件大小是16k、16k的增长的。

这时候我们删除大量的数据再次查看文件大小,仍然是272k,索命,数据虽然删除,但是空间没有释放。

这里我们对主键执行一个alter table语句

再次查看文件大小

ok 文件大小明显的减少,这里说明主键的alter语句会重建表,并且释放碎片空间;

这时候我们再删除大量的数据再次查看文件大小,这里我们对普通列执行一个alter table语句

再次查看文件大小

ok 文件大小明显的减少,这里说明普通列的alter语句会重建表,并且释放碎片空间;

很多时候需要把一个从库提升为主库,但对从库和主库的数据一致性不敢保证,这时我们就可以利用 pt-table-checksum来检查主库数据的一致性,如果存在不一致的数据,我们可以利用pt-table-sync来修复这些不一致的数据。

在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。

下面通过实际的例子来解释该工具如何使用:

主库(10.8.23.209)数据:

从库(10.8.23.208)数据:

从库(10.8.23.210)数据:

很明显主备数据不一致,我们使用工具来检测下:

校验命令参数解释:

校验结果字段解释:

好了,命令以及常用参数都介绍了,一起解释下上面执行的效果,通过DIFFS 是1 就可以看出主从的表数据不一致。怎么不一致呢? 通过指定—replicate=test.checksums 参数,就说明把检查信息都写到了checksums表中。

进入备库(10.8.23.208)中查看checksums表的信息:

进入备库(10.8.23.210)中查看checksums表的信息:

通过上面找到了这些不一致的数据,如何修复呢?利用另外一个工具 pt-table-sync。

高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。接着上面的复制情况,主库和从库的aaa表数据不一致,需要修复。

参数解释:

命令介绍完了,一起解释下执行的效果:通过(--print)打印出来了修复数据的sql语句,可以手动的去从行执行,让他们数据保持一致性。那能否直接执行?当然可以,通过(--execute)

没发现任何异常,然后检查主从数据的一致性:

主库(10.8.23.209)数据:

从库(10.8.23.208)数据:

从库(10.8.23.210)数据:

OK,数据已经保持一致了。

不过建议还是--print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下。

不然直接执行了,出现问题之后不好处理。总之还是在处理之前做好数据的备份工作。

修复MYSQL数据库因断电造成的数据损坏在使用MySQL数据库的时候,都碰到过因断电造成数据库损坏的情况,大家都知道,断电或非正常关机是导致MySQL数据库出现错误最常见的原因,如何恢复MySQL数据库是大家都非常头痛的问题。目前有方法可以帮助大家恢复损坏的MySQL数据库吗?当用户出现断电造成的MySQL数据库丢失损坏时,如果能进入MySQL软件,但是提示错误信息,用户可以通过“系统维护”—“数据库压缩修复”,压缩下数据库(有些软件在“系统设置”—“系统维护”—“数据库备份恢复”中),这种方法只适合一小部分的数据库故障修复,功能性并不高。现在网络上有两种比较推荐使用的MySQL数据库恢复方法,一种方法使用MySQL(和PHP搭配之最佳组合)的check table和repair table 的sql语句,另一种方法是使用MySQL(和PHP搭配之最佳组合)提供的多个myisamchk, isamchk数据检测恢复工具。在很多用户看来,这两个方法都比较复杂,并不适合大多数的用户使用。另外,这两种方法并不能有效的恢复MySQL数据库,可能还会造成数据库被进一步损坏,造成大家无法挽回的损失。根据以上几个原因,这两种MySQL数据库恢复方法并不建议大家使用。。数据库被损坏分以下几种情况:1、严重损坏2、轻度损坏3、有些表被损坏或有些表的部分记录被损坏如何修复MYSQL数据库因断电造成的数据损坏


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8676899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存