单个ibdata1文件包含MySQL数据库中的所有表和索引
在本教程中,我们将说明如何重建整个MySQL数据库,以及如何将较大的MySQL系统表空间文件分解为较小的单个MySQL表文件。在MySQL中,当您使用InnoDB时,所有表和索引都存储在MySQL系统表空间下。MySQL系统表空间是ibdata1,位于/ var / lib / mysql下
单个ibdata1文件包含MySQL数据库中的所有表和索引。因此,如果您的数据库很大,那么该文件的大小将非常大。
MySQL的ibdata1
1.大MySQL(和MariaDB)系统表空间
默认的大型MySQL系统表空间方法存在一个主要缺点。
以这种情况为例:您已经将价值100GB的数据上传到MySQL中的多个表中。
现在,ibdata1文件大小将超过100GB。
几天后,您从所有这些表中删除了大约50GB的数据。ibdata1文件大小不会减少到50GB +以上,它仍将保持在100GB +以上。
问题是,从ibdata1文件删除50GB数据后,您将无法回收那些未使用的空间。有一种方法可以做到,但是太复杂了(在下面解释),并且涉及到关闭MySQL数据库。
在上述情况下,稍后向表中添加价值10GB的数据时,ibdata1文件大小不会增加到110GB,而是保持在100GB。因为,该文件在上述50GB的已删除数据中仍具有未使用的空间。
因此,如何避免将所有表和索引存储在单个ibdata1文件中?而是分别存储在多个表文件中?
2.将新表(和索引)作为单独的文件
从现在开始,当您创建新的MySQL表时,将获得单个文件。
在此示例中,我创建了一个名为employee的新表,并向其中上载了大约20GB的数据。
这里将发生两件事:
首先,它将在/ var / lib / mysql目录下创建一个数据库名称为“ thegeekstuff”的子目录。
其次,在该数据库目录名称下(即thegeekstuff目录下),您将看到正在创建单个文件EMPLOYEE.IBD。该文件的大小将是您仅上传到该表的数据的大小。在这种情况下,由于我们将价值20GB的数据上传到该表中,因此EMPLOYEE.IBD文件大小约为20GB,如下所示。
3.设置innodb_file_per_table参数
为此,您应在/etc/my.cnf文件中的“ mysqld”部分下使用innodb_file_per_table参数,如下所示:
注意:如果您使用的是MySQL 5.6.6(或MariaDB)及更高版本,则以上为默认设置。
在此示例中,在CentOS 6上,从yum存储库安装时获得的默认MySQL仍为5.1.73,如下所示。
因此,在这种情况下,我们应该在my.cnf文件中设置innodb_file_per_table。
每当您对my.cnf进行任何更改时,都应重新启动MariaDB MySQL数据库。
4.从ibdata1中提取现有表
接下来,如果要将现有表从ibdata1提取到它自己的单独文件中,则必须优化该表。
假设您在thegeekstuff数据库下有一个名为Benefits的表。该收益表是在我们在my.cnf中设置innodb_file_per_table之前创建的。
因此,收益表仍将位于ibdata1文件下。要将其从ibdata1中移出到它自己的IBD文件中,我们必须优化表,如下所示。