【问题标题】:MySQL InnoDB: how to completely flush all remaining transactional changesMySQL InnoDB:如何完全刷新所有剩余的事务更改
【发布时间】:2013-11-09 21:43:22
【问题描述】:

我不得不终止一个更改表(复制到 tmp 表)进程,因为我的服务器磁盘空间不足。我的 ibdata 文件现在 40 GB 大,只剩下 8 GB 磁盘空间(不,我不能添加磁盘空间 atm 也不能使用 ram 磁盘,因为服务器只有 8 GB ram)。

据我了解,即使我杀死了 alter table 进程,一旦有足够的可用磁盘空间,MySQL 也会尝试完成它。

根据“show status like '%tmp%';”有 0 个 tmp 表和 5 个 tmp 文件。

根据“SHOW ENGINE INNODB STATUS;”只有一个“事务 0,未启动”条目(以及一些文件 I/O 条目)。

根据信息架构,我的表大约是。 20 GB,我的 ibdata 文件是 40 GB(我在这个数据库上只有一个 InnoDB 表)。

有没有办法刷新所有挂起的更改和/或删除所有 tmp 表(甚至显示状态也没有列出)?

我还想知道为什么我的 innodb_buffer_pool_size 设置为 8 GB(在 8 GB 内存服务器上)。我没有更改任何 InnoDB 设置,我的 my.cnf 文件中实际上没有任何设置,所以这似乎是一些默认值?

谢谢:拉斯

【问题讨论】:

    标签: mysql ubuntu-12.04 innodb


    【解决方案1】:

    你是对的,即使你杀死了ALTER TABLE,它仍然会继续尝试创建表的新副本,并且只有在完成该步骤后,该操作才会被“杀死”。没有办法中断它,在 mysqld 进程上没有kill -9。请注意,如果磁盘空间不足,它将产生错误。我想它会在那个时候中止ALTER TABLE,清理临时表,然后完成。

    至于您关于刷新更改的问题,没有命令可以刷新ALTER TABLE 正在完成的工作。对于其他类型的更改,如果您set global innodb_fast_shutdown=0 然后关闭 mysqld,这将刷新缓冲池中的所有脏页,清除回滚段中的所有垃圾,并合并更改缓冲区中的所有挂起索引更改。但这对ALTER TABLE 没有任何作用。我相信结果会是关机等到ALTER TABLE完成。

    关于缓冲池的问题,default innodb_buffer_pool_size 是 128MB,如果您不指定其他值。您必须在配置文件中将其设置为 8GB。请注意,Ubuntu 支持一个目录 /etc/mysql/conf.d 驻留多个配置文件,并且可以在这些配置文件中的任何中进行设置。


    您可能有一个很大的 ibdata1 文件,而 nothing 占用了额外的空间。

    当 MySQL 完成临时表时,它们会被清理,但它可能在使用时增加了 ibdata1 文件的大小。 MySQL 不会收缩 ibdata1 文件,但它会将分配的空间重用于以后的数据。

    是的,缩小 ibdata1 的唯一方法是转储所有 InnoDB 数据,关闭 mysqld,物理 rm ibdata1 文件,然后启动 mysqld,然后重新导入转储数据。 This has been a major inconvenience for MySQL users for many years.

    在您导入数据之前,建议启用innodb_file_per_table,这样您以后就不会遇到这个困难。 MySQL 仍然需要一个用于全局 InnoDB 数据的 ibdata1,但它应该保持较小。并且无论何时您删除或更改任何 InnoDB 表(临时或非临时),它都会回收一些磁盘空间。这实际上在 MySQL 5.6 中默认启用。


    mysqld 在几个地方寻找一个 my.cnf:

    1. /var/lib/mysql/my.cnf(数据目录)
    2. /usr/my.cnf(基础目录)
    3. /etc/my.cnf

    因此,请检查那些位置是否有另一个 my.cnf 具有 innodb_buffer_pool_size=8G 的神秘设置。

    有关 MySQL 如何找到 my.cnf 的更多详细信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/option-files.html

    【讨论】:

    • /etc/mysql/conf.d/ 只包含一个 mysqld_safe_syslog.cnf 和 etc/mysql/ 只是一个 debian.cnf 文件……这三个文件中没有一个 InnoDB 设置。因此,减少 ibdata 大小的唯一选择是删除该 innodb 表并导入转储?我有一种奇怪的感觉,那个 ibdata 文件中有一些 20 GB 的 tmp 表数据......
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多