在本教程中,我们将说明如何重建整个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文件中,我们必须优化表,如下所示 。
【单个ibdata1文件包含MySQL数据库中的所有表和索引】
推荐阅读
- Slack正在为其用户提供一种登录其他应用程序的新方法
- 大王叫我来巡山歌曲儿童版 大王叫我来巡山歌曲原唱
- 美食的俘虏泽布拉的恶魔 美食的俘虏泽布拉
- 如何快速去除身体水分 中医说体内水多
- Amazon的Alexa助手的新智能手机应用程序的承诺
- 上海长城宽带最新套餐 长城宽带网络服务有限公司
- 无线网卡支持网络唤醒吗? 电脑网络唤醒网卡设置详细步骤
- MarkLogic的同名NoSQL数据库的第9版将于今年年底上市
- 电脑c盘满了怎么清理? 教大家电脑c盘怎么格式化的方法