【问题标题】:How to alter a table in large mysql DataBase如何更改大型mysql数据库中的表
【发布时间】:2022-01-23 16:00:08
【问题描述】:

我有非常大的 mysql 数据库(超过 100 G),我想迁移表中的一些更改。它需要冒充我没有空间来备份这个大小,结果它会回滚所有更改。明确地说,当我想在mysql中alter表时,它会在本地磁盘中为它自己备份,并且由于我的磁盘上没有空间,它正在回滚。有没有人可以帮助解决这个问题?

【问题讨论】:

  • 说真的,只是买更多的存储空间;您的数据库将适合我手机的 RAM
  • 不可能!你会回答我的情况吗...
  • @stu 您可能将 ram 与存储混淆了
  • 请编辑您的问题以显示(作为文本,而不是图像)select version();show create table yourtablename; 的输出以及失败的确切 alter table 语句。
  • “我没有空间做备份”WTF?

标签: mysql large-data alter-table diskspace


【解决方案1】:

这取决于 ALTER 更改的类型。从 MySQL 5.6 开始,可以“就地”完成一些更改,而不使用额外的存储空间。阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html了解详情。

但是许多类型的更改(基本上是影响行存储大小的任何更改)仍然需要“表重建”,这意味着它在执行更改的过程中会生成表的副本。这需要额外的存储空间,通常与原始表的大小大致相同。 如果您的服务器没有足够的存储空间来执行此操作,那么您将无法更改表,FULL STOP。您应该在表增长到这个大小之前很久就解决这个问题。您有责任监控数据库的大小并确保您有足够的存储空间。

你在上面的cmets中说不能再增加存储空间了。

有时 InnoDB 表空间会变得“碎片化”。这意味着他们可以使用稍少的存储空间来存储相同的行。您可以使用OPTIMIZE TABLE <name>;ALTER TABLE <name> FORCE; 完成碎片整理

一种可能的策略是优化每个表,从最小的表开始,按大小顺序逐个进行。您希望您有足够的空间用于执行此操作所需的复制表,并且通过优化小表释放的任何空间都将帮助您优化中型表,依此类推。这是一个长镜头,因为您也可能没有足够的“浪费”空间来恢复以产生影响。完成此过程后,您可能仍然无法更改最大的表。不幸的是,MySQL 无法报告表的碎片,所以您只能尝试一下,看看您恢复了多少空间(如果有的话)。

之后,唯一的其他选择是从表中删除数据,直到您可以进行更改。更改仍然需要额外的存储空间,但只需要复制剩余的数据行。也就是说,如果你删除了 50% 的行,那么存储副本的表空间文件只需要大约 50% 的存储空间。

您还可以在进行更改时尝试删除表的一些索引。索引在同一个表空间中占用空间,如果您有多个索引让它们占用比数据本身更多的空间,这种情况并不少见。如果在 ALTER TABLE 语句中包含一些 DROP INDEX 操作,则生成的副本将占用更少的空间。另一方面,这些索引可能是正确查询优化所必需的,没有索引,您的应用程序将无法使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2010-11-24
    • 2017-06-26
    • 2016-02-19
    相关资源
    最近更新 更多