gpt4 book ai didi

mysql - MTS 复制死锁

转载 作者:可可西里 更新时间:2023-11-01 08:39:33 29 4
gpt4 key购买 nike

情况:

我们在 Percona MySQL 5.6.32-78.1 上有一个使用 GTID 的主-主-复制。在服务器上,大约有 10 个数据库,我们设置了 slave_parallel_workers=5。一台服务器用于前端处理,另一台用于后端。一周两三次,后端服务器复制报错死掉

2016-10-25 10:00:01 165238 [警告] 从 SQL:Worker 4 在主日志 mysql-bin.011888 中执行事务 '0e7b97a8-a689-11e5-8b79-901b0e8b0f53:22506262' 失败, end_log_pos 9306420;无法在表 shop.sessions 上执行 Update_rows 事件;尝试获取锁时发现死锁;尝试重新启动交易,Error_code:1213;处理程序错误 HA_ERR_LOCK_DEADLOCK;事件的主日志 mysql-bin.011888, end_log_pos 9306420, Error_code: 1213
2016-10-25 10:00:01 165238 [错误] 从属 SQL:...从属协调器和工作线程已停止,可能使数据处于不一致状态。重新启动应该会自动恢复一致性,尽管对数据或信息表或 DDL 查询使用非事务性存储可能会导致问题。在这种情况下,您必须检查您的数据(有关详细信息,请参阅文档)。错误代码:1756
2016-10-25 10:00:01 165238 [注意] 读取中继日志事件时出错:从 SQL 线程被杀死

可能是什么原因?没有跨数据库 DML 语句,我想通过使用 MTS,每个数据库只使用一个线程(MTS 的好处是使用跨多个数据库的并行复制)?为什么复制会因死锁而中断?

编辑 2016-10-28:

表的架构看起来像

CREATE TABLE `sessions` (
`id` int(11) NOT NULL,
`session_id` char(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`crypt_iv` blob NOT NULL,
`data` mediumblob NOT NULL,
`user_id` int(11) NOT NULL,
`last_refresh` datetime NOT NULL,
`timeout` datetime NOT NULL,
`closed` tinyint(4) NOT NULL,
`inserted` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `sessions`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `session_id` (`session_id`),
ADD KEY `user_id` (`user_id`),
ADD KEY `timeout` (`timeout`);
ALTER TABLE `sessions` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

当时这个错误只发生在后端,从来没有发生在前端服务器上。目前我无法粘贴确切的语句,因为二进制日志已被清除。但此 GTID 事务中的唯一语句是表上基于行的更新。

最佳答案

我想所有 session 都是在前端服务器上创建的。后端服务器上是否有 session 清理作业?所以你在两台机器上都写在了 table 上。如果您有一个写入繁重的表作为 session ,您应该只在一台机器上写入它以避免这种死锁。

实际上,您应该始终只在一台机器上执行所有写入操作,故障转移情况除外,当一个主机出现故障时。

haproxy 和健康检查有很好的设置,可以自动处理故障转移并对您的客户透明。

关于mysql - MTS 复制死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40238989/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com