MySQL InnoDB:如何完全刷新所有剩余的事务性更改

MySQL InnoDB:如何完全刷新所有剩余的事务性更改,mysql,ubuntu-12.04,innodb,Mysql,Ubuntu 12.04,Innodb,我不得不终止altertable(复制到tmptable)进程,因为我的服务器磁盘空间不足。我的ibdata文件现在有40GB大,只剩下8GB的磁盘空间(不,我不能在atm机上添加磁盘空间,也不能使用ram磁盘,因为服务器只有8GB的ram) 据我所知,即使我杀死了alter table进程,只要有足够的可用磁盘空间,MySQL也会尝试完成它 根据“显示状态如“%tmp%”;”,有0个tmp表和5个tmp文件 根据“显示引擎INNODB状态”,只有一个“事务0,未启动”条目(和一些文件I/O条目

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

据我所知,即使我杀死了alter table进程,只要有足够的可用磁盘空间,MySQL也会尝试完成它

根据“显示状态如“%tmp%”;”,有0个tmp表和5个tmp文件

根据“显示引擎INNODB状态”,只有一个“事务0,未启动”条目(和一些文件I/O条目)

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

是否有办法刷新所有挂起的更改和/或删除所有tmp表(即使show status没有列出一个)?

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


谢谢:Lars

你说得对,即使你杀死了
ALTER TABLE
,它也会继续尝试创建一个新的表副本,这个操作只有在完成该步骤后才会被“杀死”。除了mysqld进程上的
kill-9
,没有办法中断它。请注意,如果磁盘空间不足,它将生成错误。我认为此时它将中止
altertable
,清理temp表,然后完成

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

至于您关于缓冲池的问题,如果您不指定另一个值,则缓冲池大小为128MB。您必须在配置文件中将其设置为8GB。注意,Ubuntu支持一个目录
/etc/mysql/conf.d
,其中有多个配置文件,可以在这些配置文件中进行设置


您可能有一个大的ibdata1文件,没有任何东西会占用额外的空间

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

是的,收缩ibdata1的唯一方法是转储所有InnoDB数据,关闭mysqld,物理
rm
ibdata1文件,然后启动mysqld,然后重新导入转储的数据

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


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

  • /var/lib/mysql/my.cnf(datadir)
  • /usr/my.cnf(basedir)
  • /etc/my.cnf
  • 因此,请检查这些位置是否有另一个my.cnf,它的神秘设置为
    innodb\u buffer\u pool\u size=8G


    有关MySQL如何查找my.cnf的详细信息,请参见

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

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

    至于您关于缓冲池的问题,如果您不指定另一个值,则缓冲池大小为128MB。您必须在配置文件中将其设置为8GB。注意,Ubuntu支持一个目录
    /etc/mysql/conf.d
    ,其中有多个配置文件,可以在这些配置文件中进行设置


    您可能有一个大的ibdata1文件,没有任何东西会占用额外的空间

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

    是的,收缩ibdata1的唯一方法是转储所有InnoDB数据,关闭mysqld,物理
    rm
    ibdata1文件,然后启动mysqld,然后重新导入转储的数据

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


    mysqld l