删除 MySQL ibdata1,无需转储和恢复现有的正确数据库

删除 MySQL ibdata1,无需转储和恢复现有的正确数据库

我的 MySQL 服务器包含两个 100+ GB 的大数据库。一个创建时带有innodb_file_per_table,另一个没有。没有的那个已被转储,准备重新加载。但是,ibdata1 文件仍然很大,我没有足够的可用空间。在这种情况下,通常的建议是转储并删除每个数据库,停止 MySQL,然后删除 ibdata1 和事务日志,然后重新加载数据库。

我的具体问题是:我可以保留创建的数据库吗innodb_file_per_table?或者当我删除 ibdata1 时它们会被销毁,即使它们的所有文件都是分开的?

我不能让这个数据库离线以转储并重新加载它。而且由于它已经正确制作了每个表的单独文件,因此感觉没什么用。

答案1

我的具体问题是:我可以保留创建的数据库吗innodb_file_per_table?或者当我删除 ibdata1 时它们会被销毁,即使它们的所有文件都是分开的?

单片机ibdata1包含一些系统范围的数据。如果您尝试手动删除它而不先删除所有现有数据库,则可能会丢失数据。
(有办法从这种情况中恢复,但为什么要让自己陷入这种境地?按照您收到的说明转储全部您的数据库,重建 MySQL 安装,然后重新加载它们。这是安全的选择。)

我无法承受让该数据库脱机以转储并重新加载它。

你必须负担得起。这只是一次停电 - 安排好并实现它。
我们的常驻 MySQL 专家确认,这是唯一(安全)的缩减方法ibdata1在这些问题上,我尊重他的专业意见。

(我还建议您在安排停机时间之前,先阅读该答案中链接的他的其他帖子。由于您将不得不采用停机时间,因此您最好尽可能多地清除潜在问题...)

答案2

如果你正在运行 MySQL 5.6,你可以利用一项新功能可传输表空间

如果你没有运行 5.6,你可以使用 innobackupex 工具Percona Xtrabackup..这需要使用 XtraDB(Percona 修改的 InnoDB 引擎,Percona Server 的一部分)。 导入和导出单个表

如果你没有运行 5.6,并且无法运行 Percona Server

答案3

如果由于选择至关重要而需要启动数据库,并且您有快速存储(例如 ec2 上的 iops 卷),则最大限度减少停机时间的一种方法是停止 mysql,通过数据目录 rsync 到快速卷,然后以只读方式重新启动主机。

然后您就有时间进行转储/导入等,同时您的旧主服务器选择 qrys。一旦转储/导入完成,并且第二个框准备好进行写入,只需在您的应用层代码中切换到它即可。

如果您的主服务器需要一直写入,那么您就不能使用这个。如果您有专用的从服务器,您可以锁定主服务器,修复从服务器并提升为主服务器。

相关内容