MySQL InnoDB : how to completely flush all remaining transactional changes

标签 mysql ubuntu-12.04 innodb

我不得不终止一个 alter table(复制到 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 ram 服务器上)。我没有更改任何 InnoDB 设置,实际上我的 my.cnf 文件中也没有,所以这似乎是一些默认值?

谢谢:拉斯

最佳答案

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

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

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


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

当 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 仍然需要一个 ibdata1 用于全局 InnoDB 数据,但它应该保持更小。任何时候您删除或更改任何 InnoDB 表(临时的或非临时的),它都会回收一些磁盘空间。这实际上在 MySQL 5.6 中默认启用。


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

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

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

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

关于MySQL InnoDB : how to completely flush all remaining transactional changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883463/

相关文章:

php - 如何修复这个准备好的语句

zsh - : 39: source: not found While installing oh-my-zsh

ubuntu - 无法正确安装 docker

audio - vlc - 不播放由 opus 库中的演示创建的 opus 文件

mysql - 手动将外键插入表时允许自由输入

mysql - 如何解决MySQL死锁

mysql - xtrabackup(innobackupex) 是否与 innodb_file_per_table (Barracuda) 一起正常工作?

mysql - 将数据从一个表复制到另一个表(历史记录),除了一个非身份列

PHP 在 session 变量中显示一行 Mysql 结果的每一列 - 刷新下一行

MySQL 将两个查询组合在一起