如何防止在更改不相关的表时锁定整个服务器?

icnyk63a  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(246)

在生产服务器上,我有两个数据库:
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 在没有任何关系的情况下,数据库可能会受到另一个数据库上的操作的影响。

bvn4nwqk

bvn4nwqk1#

更仔细地观察 PROCESSLIST . 我希望您能在中找到一个正在锁定它正在读取的表的存档进程 db 写信给 db_archive . 最大值 Time 列很可能表示恶棍。
那个 ALTER 可能有牵连,也可能是一条红鲱鱼。
以下是意外锁的常见模式:
冗长的 SELECT 正在读表1。
有些人写( ALTER 限定)尝试访问表1,但它在事务中或以其他方式接触表2。这个 SELECT 阻止对表1的写入,因此写入挂起。
现在甚至 SELECTs 表1和表2上的数据可能被阻塞。

相关问题