我不得不终止一个 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:
- /var/lib/mysql/my.cnf(数据目录)
- /usr/my.cnf(基础目录)
- /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/