mysql"删除数据库"需要时间-为什么?
带有一对数据库" A"和" B"的mysql5.0,两个数据库都有大的innodb表。 "删除数据库A;"将数据库" B"冻结几分钟。那时什么都没有使用" A",那么为什么要进行如此密集的操作呢?
优点:假设我们使用" A",将数据上传到" B",然后再切换为使用" B",我们如何才能更快地做到这一点?删除数据库并不是人们通常一直需要做的事情,因此这与图表有些不同。
解决方案
默认情况下,给定mysql服务器安装中的所有innodb数据库都使用相同的数据文件物理池,因此可以想象," drop database A"可能会影响数据库B。由于" drop database"可能涉及对innodb数据文件的大量重组,可以想象,由于操作的强度或者设计的原因,这是一个阻塞操作。
但是,我认为我们可以使每个数据库使用不同的物理文件,尽管我自己也没有尝试过,所以我们必须自己弄清楚具体细节。否则,我们可能需要在同一台计算机上并排使用两个不同的mysql安装,这是完全可行的。
跟随滑板手:
更改my.cnf(并重新启动MySQL),使其包括:
innodb_file_per_table = 1
(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)
这将为数据库提供专用的文件存储,并将其从共享池中移出。然后,它将使我们做一些有趣的事情,例如将表/索引放在不同的物理磁盘上,以进一步拆分I / O并提高性能。
注意,这不会更改现有表;它不会更改现有表。我们需要做一些工作才能将它们保存在自己的文件中(http://capttofu.livejournal.com/11791.html)。
因此,我不确定Matt Rogish的答案是否会对100%有所帮助。
问题是MySQL *在打开和关闭表周围有一个互斥锁(互斥锁),因此基本上意味着,如果一个表正在被关闭/删除,则不能打开其他表。
这是我的一位同事在这里描述的:
http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/
一种极好的减少影响的策略是使用XFS之类的文件系统。
解决方法很丑。本质上,我们必须先删除表中的所有数据,然后再删除它们(请参见上面链接的注释#11)。