是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据?
还是我每次都必须重建一个新的数据库?
是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据?
还是我每次都必须重建一个新的数据库?
Answers:
这是有关InnoDB的更完整答案。这是一个漫长的过程,但是值得付出努力。
请记住,这/var/lib/mysql/ibdata1
是InnoDB基础架构中最繁忙的文件。它通常包含六种类型的信息:
Pictorial Representation of ibdata1
许多人创建了多个ibdata
文件,希望更好的磁盘空间管理和性能,但是这种想法是错误的。
OPTIMIZE TABLE
吗?不幸的是,OPTIMIZE TABLE
对存储在共享表空间文件ibdata1
中的InnoDB表运行有两件事:
ibdata1
ibdata1
成长,因为连续的数据和索引页被追加到ibdata1
但是,您可以从中分离表数据和表索引ibdata1
并分别进行管理。
OPTIMIZE TABLE
使用innodb_file_per_table
?假设您要添加innodb_file_per_table
到/etc/my.cnf (my.ini)
。然后可以只OPTIMIZE TABLE
在所有InnoDB表上运行吗?
好消息:启用后运行OPTIMIZE TABLE
时innodb_file_per_table
,将.ibd
为该表生成一个文件。例如,如果您的表的mydb.mytable
datadir为/var/lib/mysql
,它将产生以下结果:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
在.ibd
将包含该表的数据页和索引页。大。
坏消息:您所要做的就是mydb.mytable
从生活中提取的数据页和索引页ibdata
。每个表(包括)的数据字典条目mydb.mytable
仍保留在数据字典中(请参阅ibdata1的图形表示)。您不能在ibdata1
这一点上简单地删除!!!请注意,ibdata1
它根本没有缩小。
要ibdata1
一劳永逸地缩小,您必须执行以下操作:
将mysqldump
所有数据库(例如与)转储到.sql
文本文件中(SQLData.sql
下面使用)
删除所有数据库(mysql
和除外information_schema
)CAVEAT:为慎重起见,请运行此脚本以确保您已拥有所有用户授权:
mkdir /var/lib/mysql_grants
cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
chown -R mysql:mysql /var/lib/mysql_grants
登录到MySQL并运行SET GLOBAL innodb_fast_shutdown = 0;
(这将彻底从刷新所有剩余事务变化ib_logfile0
和ib_logfile1
)
关闭MySQL
将以下行添加到/etc/my.cnf
(或my.ini
在Windows上)
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
(旁注:无论您设置什么,请innodb_buffer_pool_size
确保innodb_log_file_size
为的25%innodb_buffer_pool_size
。
另外:innodb_flush_method=O_DIRECT
在Windows上不可用)
删除,ibdata*
并且ib_logfile*
可以选择删除中的所有文件夹/var/lib/mysql
,除了/var/lib/mysql/mysql
。
启动MySQL(这将重新ibdata1
[默认10MB]和ib_logfile0
和ib_logfile1
在每1G)。
进口 SQLData.sql
现在,ibdata1
它将继续增长,但仅包含表元数据,因为每个InnoDB表都将存在于之外ibdata1
。ibdata1
将不再包含InnoDB数据和其他表的索引。
例如,假设您有一个名为的InnoDB表mydb.mytable
。如果您查看/var/lib/mysql/mydb
,您将看到代表该表的两个文件:
mytable.frm
(存储引擎标题)mytable.ibd
(表数据和索引)使用中的innodb_file_per_table
选项/etc/my.cnf
,您可以运行OPTIMIZE TABLE mydb.mytable
,该文件/var/lib/mysql/mydb/mytable.ibd
实际上会收缩。
在我作为MySQL DBA的职业生涯中,我做了很多次。实际上,我第一次这样做是将50GB的 ibdata1
文件压缩到只有500MB!
试试看。如果对此还有其他疑问,请提出。相信我; 从短期和长期来看,这都是可行的。
在第6步,如果由于mysql
开始删除架构而导致mysql无法重新启动,请回头看第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并继续
关于在步骤5 中将innodb_log_file_size设置为innodb_buffer_pool_size的 25%,这是总括规则,这是相当老套的规则。
回顾一下July 03, 2006
,Percona有一篇不错的文章,为什么要选择适当的innodb_log_file_size。后来,Nov 21, 2008
Percona继续撰写另一篇文章,介绍如何根据峰值工作量计算适当的大小,并保持一小时的更改价值。
此后,我在DBA StackExchange中撰写了有关计算日志大小以及在其中引用这两篇Percona文章的文章。
Aug 27, 2012
:正确调整具有48GB RAM的服务器上的30GB InnoDB表Jan 17, 2013
:MySQL 5.5-Innodb-innodb_log_file_size是否高于4GB的总和?就个人而言,我仍然会遵循25%的规则进行初始设置。然后,由于可以随着生产时间的推移更准确地确定工作负载,因此您可以在维护周期内几分钟内调整日志大小。
innodb_open_tables
在必要时加注。默认值是300