mysql 并行 更新_MySQL 并行复制(MTS) 从库更新的记录不存在实际却存在
背景
开了并行复制的半同步从库SQL 线程报1032错误,异步复制从库没有报错,偶尔会出现这种
版本
mysql 5.7.16
redhat 6.8
mysql> show variables like '%slave_para%';
+------------------------+---------------+
| Variable_name | Value |
+------------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
| slave_parallel_workers | 16 |
+------------------------+---------------+
分析
1、疑是对从库执行了更新操作,导致更新的记录不存在
2、查看error log发现
2018-04-03T10:11:47.720156+08:00 16 [ERROR] Slave SQL for channel '': **Worker 13** failed executing transaction **'a272bbcf-874f-11e7-a288-00505695b721:687871861**' at master log mysql-bin.004119, end_log_pos 376471678; **Could not execute Update_rows event** on table anytxn.seq_xxxx; Can't find record in 'seq_xxxx', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.004119, end_log_pos 376471678, Error_code: 1032
2018-04-03T10:11:47.720230+08:00 2 [Warning] Slave SQL for channel '': ... The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: 1756
2018-04-03T10:11:47.720959+08:00 2 [Note] Error reading relay log event for channel '': slave **SQL thread was killed**
3、从 SQL线程停止的position分析binlog发现
SET @@SESSION.GTID_NEXT= 'a272bbcf-874f-11e7-a288-00505695b721:687871861'/*!*/;
# at 376471694
#180403 10:11:47 server id 104073 end_log_pos 376471555 CRC32 0x1be91176 Querythread_id=2086049exec_time=0error_code=0
SET TIMESTAMP=1522721507/*!*/;
BEGIN
/*!*/;
# at 376471768
#180403 10:11:47 server id 104073 end_log_pos 376471616 CRC32 0x10644d77 Table_map: `anytxn`.`seq_xxxx` mapped to number 301
# at 376471829
#180403 10:11:47 server id 104073 end_log_pos 376471678 CRC32 0x871a9787 Update_rows: table id 301 flags: STMT_END_F
### UPDATE `anytxn`.`seq_xxxx`
### WHERE
### @1=7116088 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2=1 /* INT meta=0 nullable=0 is_null=0 */
### SET
### @1=7116089 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2=1 /* INT meta=0 nullable=0 is_null=0 */
# at 376471891
#180403 10:11:47 server id 104073 end_log_pos 376471709 CRC32 0x9eb59238 Xid = 22247621418
COMMIT/*!*/;
# at 376471922
#180403 10:11:47 server id 104073 end_log_pos 376471774 CRC32 0xf7b6ad5d GTIDlast_committed=641254sequence_number=641259
SET @@SESSION.GTID_NEXT= 'a272bbcf-874f-11e7-a288-00505695b721:687871862'/*!*/;
# at 376471987
#180403 10:11:47 server id 104073 end_log_pos 376471856 CRC32 0x6256de00 Querythread_id=2085350exec_time=0error_code=0
SET TIMESTAMP=1522721507/*!*/;
BEGIN
/*!*/;
# at 376472069
#180403 10:11:47 server id 104073 end_log_pos 376471979 CRC32 0x6c329578 Table_map: `anytxn`.`bm_cc_customer_address_info` mapped to number 1569
# at 376472192
#180403 10:11:47 server id 104073 end_log_pos 376472162 CRC32 0x834cc8b9 Write_rows: table id 1569 flags: STMT_END_F
### INSERT INTO `anytxn`.`bm_xxxxxxxxxxxxxx`
### SET
### @1=14480779 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='0000001002380654' /* STRING(96) meta=65120 nullable=0 is_null=0 */
### @3='B001' /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
### @4=NULL /* STRING(12) meta=65036 nullable=1 is_null=1 */
### @5='10000010001202000000001' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
### @6='B00' /* STRING(9) meta=65033 nullable=1 is_null=0 */
### @7='xxxxxxxxxxx' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
### @8=NULL /* STRING(18) meta=65042 nullable=1 is_null=1 */
### @9=NULL /* STRING(18) meta=65042 nullable=1 is_null=1 */
### @10=NULL /* STRING(18) meta=65042 nullable=1 is_null=1 *
mysql@xxxxxx:/home/mysql> mysqlbinlog -v -v --start-datetime='2018-04-03 10:11:45' --stop-datetime='2018-04-03 10:11:48' /data/mysql/xxxxx-relay-bin.005477 | grep last_comm | grep 10:11:47 | grep 641254
#180403 10:11:47 server id 104073 end_log_pos 376469618 CRC32 0xb6dc6cef GTIDlast_committed=641227sequence_number=641254
#180403 10:11:47 server id 104073 end_log_pos 376471774 CRC32 0xf7b6ad5d GTIDlast_committed=641254sequence_number=641259
#180403 10:11:47 server id 104073 end_log_pos 376472258 CRC32 0x27cf3013 GTIDlast_committed=641254sequence_number=641260
从上面信息可以看出,发生更新记录不存在是在更新anytxn.xxxx_id表的标识为7116088 的记录
有两个并发提交的事务last_committed=641254 ,与发现更新的记录不存在的 GTID *.687871861 事务还有另一个并发提交的事务 sequence_number=641260(即insert另一张表的操作),难道是master有并发提交的事务,slave多个work线程去apply的时候出现了问题?
4、查看更新的记录不存在的表和相关记录
show create table seq_xxxx;
| seq_xxxx | CREATE TABLE seq_xxxx (
currentValue bigint(20) NOT NULL,
increment int(11) NOT NULL DEFAULT '1'
mysql> select * from seq_xxxx;
+--------------+-----------+
| currentValue | increment |
+--------------+-----------+
| 7116088 | 1 |
+--------------+-----------+
可以发现实际数据库中是存在该记录的
测试
mysql> select @@version;
+------------+
| @@version |
+------------+
| 5.7.19-log |
+------------+
1 row in set (0.00 sec)
mysql> show variables like '%para%';
+------------------------+---------------+
| Variable_name | Value |
+------------------------+---------------+
| slave_parallel_type | LOGICAL_CLOCK |
| slave_parallel_workers | 4 |
+------------------------+---------------+
sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=10.186.30.73 --mysql-socket=/opt/mysql/data/3307/mysqld.sock --mysql-port=3307 --db-driver=mysql --mysql-db=test --mysql-user=admin --mysql-password=admin --table_size=100000 --tables=5 --threads=100 --time=120 --report-interval=5 run
有并发提交的事务,但没有模拟重现出更新的记录不存在,但在库中却存在的情况
更新
slave_preserve_commit_order=1(default 0,MTS中有效)
确保事务以与在从服务器中继日志中显示的顺序相同的顺序在从服务器上apply,防止出现gaps。如果该值设置为0,slave并行apply事务可能会无序,检查最近执行的事务并不能保证主服务器上的所有先前事务都已在从服务器上执行
开启多线程复制后,这个参数推荐设置为1
mysql 并行 更新_MySQL 并行复制(MTS) 从库更新的记录不存在实际却存在相关推荐
- mysql多线程复制crash_MySQL 并行复制(MTS) 从库发生异常crash分析
背景 半同步复制从库在晚上凌晨2点半发生异常crash,另一个异步复制从库在第二天凌晨3点也发生了异常crash. 版本 mysql 5.7.16 redhat 6.8 mysql> show ...
- mysql php 迁移_MySQL数据复制、迁移、转换
本文总结各种场景下的mysql数据复制.迁移.转换.1.导入.导出利用mysqldump命令将数据文件导出成一个文本文件,这在不同场景下 本文总结各种场景下的mysql数据复制.迁移.转换. 1.导入 ...
- mysql 先删后增 更新_MySQL 高级操作——新增数据、更新数据、删除数据、查询数据...
新增数据 多数据插入 只要写一次insert指令,但是可以插入多条记录 语法:insert into 表名 [(字段列表)] values (值列表1),(值列表2),(值列表3); 主键冲突 主键冲 ...
- phpmyadmin mysql更新_mysql利用phpmyadmin实现数据库同步更新
以前我们设置数据同步更新需要两台mysql数据库实现主从配置了,下面我来介绍高版本的phpmyadmin就可以快速实现这个功能了,下面我以图文给大家介绍. 台作为从服务器来实现的.在这里我把我做的过程 ...
- mysql replication 原理_MySQL Replication(复制)基本原理 | 学步园
1.复制进程 Mysql的复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave).实现整个复制 ...
- mysql 同步 异步_MySQL异步复制、半同步复制详解
MySQL数据复制的原理图大致如下: 从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现: 其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O ...
- mysql 唯一更新_MySQL 唯一索引和插入重复自动更新
有时我们在往数据库插入数据的时候,需要判断某个字段是否存在,如果存在则执行更新操作,如果不存在则执行插入操作,如果每次首先查询一次判断是否存在,再执行插入或者更新操作,就十分不方便. ON DUPLI ...
- mysql定时更新_mysql刷题(不定时更新)
面试阶段大家基本都会问一些mysql的题,具体的高深理论以后再慢慢补充,但是刷题是不可避免的,下面直接上货 创建/删除表和索引系列 创建表 CREATE TABLE if not exists `te ...
- mysql 新增更新_MySQL新增数据,存在就更新,不存在就添加(转帖加实测)
参考链接:https://blog.csdn.net/tiantang_1986/article/details/78037804 https://blog.csdn.net/woshihaiyong ...
最新文章
- 现代软件工程 作业 团队冲刺阶段的要求
- 西北工业大学附属中学2019届高考毕业生去向,其中北大清华88人
- 如何通过插件携带第二个单据体到下游单据
- 计算机文献读后感,论文读后感
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
- Maven+eclipse快速入门
- mysql数据库及应用_mysql数据库介绍及应用
- 什么叫事务?Java如何处理事务呢?
- 64位系统使用Access数据库文件的彻底解决方法
- chrome 设置是否缓存
- .NET Windows服务开发流程
- 21. 包含min函数的栈(C++版本)
- Java、JSP电子政务软件系统公众服务的研究
- 内网穿透工具的原理与开发实战
- EAS BOS 介绍
- 13.0.高等数学3-空间曲线
- ovs vlan tag管理
- 《创业时代》原型:为什么Talkbox、子弹短信都失败了?
- Sharding-JDBC 源码之 SQL 改写
- 利用 python 实现多张图片的无损拼接
热门文章
- css 选择一列表菜单,css实现菜单列表随滚动条指定到对应内容
- python编程题大全-python编程题
- java的jbutton啥意思,Jbutton和Jpanel和JFrame之间的区别?
- 【Linux环境下安装Maven与环境配置简易教程】
- SpringFox 3.0.0(包含springfox-swagger2-3.0.0)——无法访问/swagger-ui.html解决方案
- JAVA——鼠标事件(MouseEvent)MouseListener监听器DEMO
- Super Jumping! Jumping! Jumping!
- 获取inout框中未改变值的数据_数据分析10——数据分析的基本过程(02)
- Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】
- Android studio git 本地仓库和远程仓库节点对比