在生产服务器上,我有两个数据库:
db,这是执行公共查询的地方
db\ U存档,其中包含从db中清除的旧数据
在dbu存档上,有一个表x,1.3go大小,innodb。该表没有外键(也没有任何键)。在db\ U archive上,除了我正在执行的查询(或连接)之外,没有其他查询(或连接): ALTER TABLE x ADD COLUMN z INT(10) UNSIGNED NULL AFTER y;
我跟踪重建工作的进展 x
在服务器上,使用 watch 'du -m \#* x.*'
. 一开始,一切都很顺利。重建进展,以及 SHOW PROCESSLIST;
清洁(<30个打开的连接)。
在925个月(超过1342个月)左右的某个时间点,重建冻结,然后 SHOW PROCESSLIST;
显示连接堆积在 db
.
这将一直持续到达到连接限制(2000个连接),从而导致服务器不可用。这时,我别无选择,只好终止查询,避免对生产造成太大的损害。
mysql版本为 5.2.12-MariaDB
关于debian 6.0.5
.
我知道有一些解决方案可以避免这个问题(例如,将db\u存档移到另一台服务器),但是,我不明白 db
在没有任何关系的情况下,数据库可能会受到另一个数据库上的操作的影响。
1条答案
按热度按时间bvn4nwqk1#
更仔细地观察
PROCESSLIST
. 我希望您能在中找到一个正在锁定它正在读取的表的存档进程db
写信给db_archive
. 最大值Time
列很可能表示恶棍。那个
ALTER
可能有牵连,也可能是一条红鲱鱼。以下是意外锁的常见模式:
冗长的
SELECT
正在读表1。有些人写(
ALTER
限定)尝试访问表1,但它在事务中或以其他方式接触表2。这个SELECT
阻止对表1的写入,因此写入挂起。现在甚至
SELECTs
表1和表2上的数据可能被阻塞。