如何:清理mysql InnoDB存储引擎?
是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据如何:清理mysql InnoDB存储引擎?,mysql,innodb,Mysql,Innodb,是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据 还是每次都必须重建一个新的数据库?InnoDB引擎不存储已删除的数据。插入和删除行时,InnoDB存储文件中会保留未使用的空间。随着时间的推移,总体空间不会减少,但随着时间的推移,“已删除和已释放”空间将被DB服务器自动重新使用 您可以通过手动重新组织表来进一步优化和管理引擎使用的空间。为此,请使用mysqldump转储受影响表中的数据,删除表,重新启动mysql服务,然后从转储文件中重新创建表。以下是有关InnoDB的更
还是每次都必须重建一个新的数据库?InnoDB引擎不存储已删除的数据。插入和删除行时,InnoDB存储文件中会保留未使用的空间。随着时间的推移,总体空间不会减少,但随着时间的推移,“已删除和已释放”空间将被DB服务器自动重新使用
您可以通过手动重新组织表来进一步优化和管理引擎使用的空间。为此,请使用mysqldump转储受影响表中的数据,删除表,重新启动mysql服务,然后从转储文件中重新创建表。以下是有关InnoDB的更完整答案。这是一个有点漫长的过程,但值得付出努力 请记住,
/var/lib/mysql/ibdata1
是InnoDB基础设施中最繁忙的文件。它通常包含六种类型的信息:
- 表数据
- 表索引
- 资料
- 回滚段
- 撤消空间
- 表元数据(数据字典)
- 双写缓冲区(后台写入以防止依赖操作系统缓存)
- 插入缓冲区(管理对非唯一二级索引的更改)
- 见
ibdata
文件,希望获得更好的磁盘空间管理和性能,但这种想法是错误的
我能跑吗?
不幸的是,对存储在共享表空间文件ibdata1
中的InnoDB表运行时会做两件事:
- 使表的数据和索引在
ibdata1
- 使
增长,因为连续的数据和索引页被附加到ibdata1
ibdata1
ibdata1
中分离出来,并独立管理它们
我能和你一起跑步吗?
假设您要添加到/etc/my.cnf(my.ini)
。然后你能在所有InnoDB表上运行吗
好消息:在启用的情况下运行时,将为该表生成一个.ibd
文件。例如,如果您的tablemydb.mytable
的datadir为/var/lib/mysql
,它将生成以下内容:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
.ibd
将包含该表的数据页和索引页。太好了
坏消息:您所做的只是从生活在ibdata
中提取mydb.mytable
的数据页和索引页。每个表(包括mydb.mytable
)的数据字典条目仍保留在数据字典中(请参阅)此时您不能简单地删除ibdata1
请注意,ibdata1
根本没有收缩
InnoDB基础设施清理
要一次性收缩ibdata1
,必须执行以下操作:
mysqldump
)到.sql
文本文件中(下面使用SQLData.sql
)mysql
和information\u schema
)警告:作为预防措施,请运行此脚本以确保您拥有所有用户授权:
mkdir /var/lib/mysql_grants
cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
chown -R mysql:mysql /var/lib/mysql_grants
设置全局innodb\u fast\u shutdown=0代码>(这将完全清除ib_logfile0
和ib_logfile1
中的所有剩余事务更改)
/etc/my.cnf
(或Windows上的my.ini
)
(旁注:无论您为innodb\u buffer\u pool\u size
设置了什么,请确保innodb\u log\u file\u size
为innodb\u buffer\u pool\u size
的25%
另外:innodb\u flush\u method=O\u DIRECT
在Windows上不可用)ibdata*
和ibu日志文件*
,您可以选择删除/var/lib/mysql
中的所有文件夹,但/var/lib/mysql/mysql
除外ibdata1
[10MB默认值]和ib_logfile0
和ib_logfile1
)SQLData.sql
ibdata1
仍将增长,但只包含表元数据,因为每个InnoDB表都将存在于ibdata1
之外ibdata1
将不再包含其他表的InnoDB数据和索引
例如,假设您有一个名为mydb.mytable
的InnoDB表。如果查看/var/lib/mysql/mydb
,您将看到代表该表的两个文件:
(存储引擎标题)mytable.frm
(表数据和索引)mytable.ibd
/etc/my.cnf
中的innodb\u file\u per\u table
选项,您可以运行优化表mydb.mytable
,文件/var/lib/mysql/mydb/mytable.ibd
将实际收缩
在MySQL DBA的职业生涯中,我已经做过很多次了。事实上,在我第一次这样做时,我将50GBibdata1
文件压缩到只有500MB
试试看。如果你对此有进一步的问题,尽管问。相信我;这将在短期和长期内起作用
警告
在第6步,如果mysql因为删除了mysql
schema begin而无法重新启动,请回顾第2步。您创建了mysql
模式的物理副本。您可以按如下方式还原它:
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql
返回步骤6并继续
更新日期2013-06-04 11:13美国东部时间
关于设置为中的25%
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql