我已从 mysql 中删除数据库,但未释放存储空间

Nav*_*vid 1 mysql innodb delete storage amazon-rds

我已经从 amazon RDS 上的 mysql 中删除了多个数据库(架构),但没有释放存储空间,我还应该做些什么来释放存储空间?

我有一个总存储量为 15GB 的 mysql 数据库。添加多个数据库(从另一个 mysql 数据库复制)并删除它们后,可用的可用存储空间为 0。我不能简单地删除 RDS 实例,因为此实例上还有另一个我需要它的数据库。但我 100% 确定数据库没有使用 15GB 的存储空间。

我已经在其他线程上阅读过这个问题,但大多数解决方案都在谈论删除所有数据并关闭服务器,因为数据库一直在使用,我无法这样做。

Rol*_*DBA 5

您可能会发现这令人惊讶,但是 ibdata1 内部发生了很多小事务。我在 1 月 14 日写了这篇文章:AWS RDS 显示写入操作数/秒大幅增长,尽管数据库连接数很少?

尽管 MySQL 5.6默认启用了innodb_file_per_table,但 ibdata1 可以增长的唯一方法是拥有大量事务。如果你看这张图:

InnoDB 架构

您将看到 ibdata1 有 1023 个回滚段,用于支持MVCC事务隔离。在大量写入的数据库环境中,ibdata1 可以增长。我之前在我的旧帖子中讨论过这个问题,即使设置了 innodb_file_per_table,Innodb ibdata1 文件如何增长 5 倍?

在那篇文章中,我提到了以下几点:

根据mysqlperformanceblog.com's Reasons for runaway main Innodb Tablespace

  • 大量交易变化
  • 超长交易
  • 滞后清洗螺纹

因此,如果您选择的数字太小,我希望 ibdata1 超过您当前的磁盘分配。

顺便说一句,ibdata1 和事务日志实际上位于何处?

当你运行时,show variables like 'innodb%home_dir';你会发现这两个文件夹

  • /rdsdbdata/db/innodb
  • /rdsdbdata/log/innodb

你不能轻易地进入它并扩展它。

为了确保您在数据库中没有任何东西,请运行以下查询:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Run Code Online (Sandbox Code Playgroud)

如果你一无所获,那你就可以合理地断言我刚刚说的话。否则,请删除您的数据。

您可能还想检查二进制日志。只需运行以下其中一项:

SHOW BINARY LOGS;
SHOW MASTER STATUS;
Run Code Online (Sandbox Code Playgroud)

您可能有权也可能没有权利清除它们。亚马逊可能不希望您接触它们,因为它们控制二进制日志记录是为了在云中启动只读从站。

建议

  • 为 RDS 实例分配更多磁盘空间(如果可能)。
  • 您可能需要切换到更高的服务器模型,然后再进行迁移。
  • 远离RDS,切换到EC2,在那里你可以对一切进行微观管理,但你必须承担监控MySQL实例的责任。
  • 在您做任何事情(切换服务器模型、迁移到另一个 RDS 实例、迁移到 EC2 等)之前,请联系 Amazon 了解任何定价。