Ibdata 用法和建议?

Abd*_*naf 5 mysql innodb ibdata

我有一个生产服务器

2011年11月5日ibdata大小为100G。大约3个月就增加到200G,所以它的大小刚刚增加了一倍。所以它是一个巨大的数据。目前lvm是251G。

我几乎所有的表都带有 Innodb。我没有在每个表中使用 innodb。我在lvm上有我的idbata。所以我应该增加多少以备将来使用..?

或任何其他处理场景的最佳方式。

Rol*_*DBA 6

您需要尽快停止使用 InnoDB(关闭innodb_file_per_table)和 LVM 快照。原因如下:

我有一个使用 MySQL 作为数据库的监控系统。它也关闭了 innodb_file_per_table。在 6 个月的时间里,它增长到 1.3TB。

我雇主的公司不能因为这个监控系统而停机。

我试图为这个怪物数据库创建一个 Slave。我将 /var/lib/mysql 的 rsync 运行到从服务器。它的第一遍花了 42 小时(这不是打字错误,1 天 18 小时)。第二遍耗时 84 小时(3 天 12 小时),仅完成了 15%(复制了 220GB)。如您所见,我放弃了第二个 rsync。

问题源于 ibdata1 为 1.3TB。

当 innodb_file_per_table 关闭时,ibdata1 里面有什么?

  • 表数据页
  • 表索引页
  • 表元数据(表空间ID管理)
  • MVCC 数据(用于事务隔离、ACID 合规性)

在写入繁重的环境中,这四种类型的所有记录都被读取和/或写入。rsync 经历了一场噩梦,试图让 ibdata1 合并到足以将更改写入从服务器。根据我的高级 Linux 工程师同行的说法,LVM 快照不会有更好的表现。

您唯一的办法是开始使用 innodb_file_per_table。

为了让您进一步了解此需求,请运行此查询(您应该需要 5-10 分钟)

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)

使用 InnoDB 的总数,将其与 ibdata1 的大小进行比较。你会发现可能会有一些少 30GB 的差异。我在我的监控系统中对 ibdata1 进行了查询,并且只有 27GB 的表元数据和新的 MVCC 信息。该文件将始终保持稳定增长。

您可以执行以下操作:将所有 InnoDB 转换为使用 innodb_file_per_table。我在 StackOverflow 上写了一篇关于如何做到这一点的帖子。您不仅可以将 easch 表存在于单独的文件中,还可以将 ibdata1 的增长率保持在最低限度。

更新 2012-02-22 13:00 美国东部时间

在执行 InnoDB 的 CleanUp 时,请确保消除多个 ibdata 文件的制作。您的设置应该是默认值:

[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
Run Code Online (Sandbox Code Playgroud)