腾讯云CDB回档失败浅析
Ⅰ、先看问题
先简单介绍下cdb的回档功能,回档分为极速、快速、普通,分别对应指定表、指定库、整个实例回档。
控制台报错回档任务执行失败
提示信息:rollback table failed:SQL thread error(1146):Error 'Table xxx doesn't exist' on query. Default database: xxx, Query: 'xxxxxx'
从字面意思看是某个表不存在导致sql线程中断(和sql线程什么关系? 这和回档功能原理相关,此处先忽略)
这种回档失败只会存在于极速和快速两种模式下,普通回档不会有问题。
用大白话讲,我控制台选择极速回档a表,binlog中的记录涉及到其他表的操作,比如:delete from a where (select xxx from b);
临时解决方案
选择普通回档,整个实例回档,抽取需要的数据,当然这个过程就比较慢了
长期解决方案
设置binlog_format为row,或者设置transaction_isolation为read-committed
Ⅱ、借题发挥
知道问题怎么解决还远远不够,为什么这么设置就没问题,我们需要借助这个问题回顾一下binlog相关知识点,事务隔离级别简单提一下
binlog的作用
三个主要作用为:复制、恢复、两阶段提交中担任重要角色,保证主从数据一致性
binlog_format
statement:记录原生sql
row:记录每一行记录的变更
mixed:默认记录为statement,特殊场景触发格式切换为row,如uuid等不确定性函数
statement格式优势为日志文件空间小,劣势是主从一致性得不到保证
row格式优势为较好地保证主从数据一致性,劣势是日志文件占空间大
关于一致性这里不展开说明,mixed格式基本可以满足大部分业务场景,所以cdb默认为mixed,但是这里十分建议大家用row
测试
测试数据与sql
这里用了一个普通sql和一个跨表sql
数据
(root@localhost) [test]> select * from t;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+------+------+
5 rows in set (0.00 sec)
(root@localhost) [test]> select * from tt;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+------+------+
5 rows in set (0.00 sec)
sql
(root@localhost) [test]> delete from t where id in (select id from tt where id < 3);
Query OK, 2 rows affected (0.01 sec)
(root@localhost) [test]> delete from t where id = 5;
Query OK, 1 row affected (0.02 sec)
四种回档场景
| - | read-committed | repeatable-read |
|---|---|---|
| row | √ | √ |
| mixed | √ | × |
这个表可直观地反应了如何解决回档报错的问题
分析binlog
不想看过程请直接拉到最下面看结论
| transaction_isolation | binlog_format |
|---|---|
| read-committed | row |
BEGIN
/*!*/;
# at 331
#190124 11:41:58 server id 1 end_log_pos 378 CRC32 0x80a164cd Table_map: `test`.`t` mapped to number 108
# at 378
#190124 11:41:58 server id 1 end_log_pos 427 CRC32 0x7ee92842 Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=1
### @2='a'
### DELETE FROM `test`.`t`
### WHERE
### @1=2
### @2='b'
# at 427
#190124 11:41:58 server id 1 end_log_pos 458 CRC32 0x97b7e158 Xid = 26
COMMIT/*!*/;
BEGIN
/*!*/;
# at 595
#190124 11:42:06 server id 1 end_log_pos 642 CRC32 0xf0a5f266 Table_map: `test`.`t` mapped to number 108
# at 642
#190124 11:42:06 server id 1 end_log_pos 684 CRC32 0x42239094 Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=5
### @2='e'
# at 684
#190124 11:42:06 server id 1 end_log_pos 715 CRC32 0xb95abaf4 Xid = 27
COMMIT/*!*/;
| transaction_isolation | binlog_format |
|---|---|
| repeatable-read | row |
BEGIN
/*!*/;
# at 331
#190124 12:18:50 server id 1 end_log_pos 378 CRC32 0xc4d70096 Table_map: `test`.`t` mapped to number 108
# at 378
#190124 12:18:50 server id 1 end_log_pos 427 CRC32 0x6d794dea Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=1
### @2='a'
### DELETE FROM `test`.`t`
### WHERE
### @1=2
### @2='b'
# at 427
#190124 12:18:50 server id 1 end_log_pos 458 CRC32 0x3f3946c1 Xid = 10
COMMIT/*!*/;
BEGIN
/*!*/;
# at 595
#190124 12:18:58 server id 1 end_log_pos 642 CRC32 0x1ecaec0b Table_map: `test`.`t` mapped to number 108
# at 642
#190124 12:18:58 server id 1 end_log_pos 684 CRC32 0xda32a16e Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=5
### @2='e'
# at 684
#190124 12:18:58 server id 1 end_log_pos 715 CRC32 0x4fa0b638 Xid = 11
COMMIT/*!*/;
| transaction_isolation | binlog_format |
|---|---|
| read-committed | mixed |
BEGIN
/*!*/;
# at 331
#190124 12:26:37 server id 1 end_log_pos 378 CRC32 0x6cac93f1 Table_map: `test`.`t` mapped to number 108
# at 378
#190124 12:26:37 server id 1 end_log_pos 427 CRC32 0x2ec3da0f Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=1
### @2='a'
### DELETE FROM `test`.`t`
### WHERE
### @1=2
### @2='b'
# at 427
#190124 12:26:37 server id 1 end_log_pos 458 CRC32 0xa4d92d55 Xid = 24
COMMIT/*!*/;
BEGIN
/*!*/;
# at 595
#190124 12:26:42 server id 1 end_log_pos 642 CRC32 0xa2926b8d Table_map: `test`.`t` mapped to number 108
# at 642
#190124 12:26:42 server id 1 end_log_pos 684 CRC32 0x05059ae7 Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `test`.`t`
### WHERE
### @1=5
### @2='e'
# at 684
#190124 12:26:42 server id 1 end_log_pos 715 CRC32 0x86e936fe Xid = 25
COMMIT/*!*/;
| transaction_isolation | binlog_format |
|---|---|
| repeatable-read | mixed |
BEGIN
/*!*/;
# at 338
#190124 12:36:35 server id 1 end_log_pos 470 CRC32 0xfb5e71cd Query thread_id=2 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1548304595/*!*/;
delete from t where id in (select id from tt where id < 3)
/*!*/;
# at 470
#190124 12:36:35 server id 1 end_log_pos 501 CRC32 0xb0ab1a2a Xid = 10
COMMIT/*!*/;
BEGIN
/*!*/;
# at 645
#190124 12:36:42 server id 1 end_log_pos 745 CRC32 0x264f35c7 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1548304602/*!*/;
delete from t where id = 5
/*!*/;
# at 745
#190124 12:36:42 server id 1 end_log_pos 776 CRC32 0x6eb54ec8 Xid = 11
COMMIT/*!*/;
我们可以看到前三种情况binlog都是row格式,记录每行记录的变化,而最后一种情况却记录了原生sql,就这个例子你只回档t表,binlog要select tt表这样就有问题了,而新购的腾讯云cdb默认就是最后一种情况,所以有一定概率出现回档失败
原生MySQL5.7默认为row+repeatable-read,腾讯云cdb默认为mixed+repeatable-read
当然,看完几块binlog的话也能感觉到mixed占空间少很多,对不对?嘿嘿
问题来了?
到这里我们知道,说白了,只要是row格式的binlog就基本上不会有问题,那为什么说用read-committed的事务隔离级别也可以解决问题呢,细心的同学应该也发现了测试过程中,事务隔离级别设置为read-committed,binlog_format为mixed,这个delete语句并没有涉及不确定函数等,但也被强行以row格式记录下来了
If you are using InnoDB tables and the transaction isolation level is READ COMMITTED or READ UNCOMMITTED, only row-based logging can be used.
官网摘录,意思就是在read-committed的事务隔离级别下,binlog_format强行row,和你怎么设置无关
至于MySQL为什么这么做,这里不做分析,可以学习91洲际哥博客中事务相关章节
Ⅲ、小结
cdb回档失败,建议设置transaction-isolation为read-committed或者设置binlog_format为row
腾讯云CDB回档失败浅析的更多相关文章
- 腾讯云CDB的AI技术实践:CDBTune
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:邢家树,高级工程师,目前就职于腾讯TEG基础架构部数据库团队.腾讯数据库技术团队维护MySQL内核分支TXSQL,100%兼容原生My ...
- 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化
作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...
- 腾讯云 安全组配置及与MySQL 远程登录失败原因浅析
前言,知道自己腾讯云服务器安全组配置并在安全组里开放了所有端口的用户可以粗略的看看下边的内容,否则就仔细看看吧. 因为有学习及业务需要,我要在腾讯云上安装了CentOS7.2版本的服务器上安装MySQ ...
- 本地连接腾讯云Mysql失败问题
腾讯云主机中MySQL无法远程连接的解决办法 在远程主机上,我开启了 mysql服务,用 phpmyadmin 可以打开,比如说用户名为 root,密码为 123456.不过用 Mysql 客户端远程 ...
- 基于腾讯云监控 API 的 Grafana App 插件开发
Tencent Cloud Monitor App Grafana 是一个开源的时序性统计和监控平台,支持例如 elasticsearch.graphite.influxdb 等众多的数据源,并以功能 ...
- 腾讯云Redis混合存储版重磅推出,万字长文助你破解缓存难题!
导语 | 缓存+存储的系统架构是目前常见的系统架构,缓存层负责加速访问,存储层负责存储数据.这样的架构需要业务层或者是中间件去实现缓存和存储的双写.冷热数据的交换,同时还面临着缓存失效.缓存刷脏.数据 ...
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...
- 如何用腾讯云打造一款微视频APP
版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...
- h5connect.js 腾讯云视频点播使用指南
http://video.qcloud.com/download/docs/QVOD_Player_Web_SDK_Developer_Guide.pdf 腾讯云视频点播服务 Web播放器SDK开发指 ...
随机推荐
- Lua中的函数
[前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...
- AngularJS 作用域(Scope)
AngularJS作用域(Scope) Scope作用域是应用在视图和控制器之间的纽带,Scope是一个对象包含可用的方法和属性,Scope可以应用在试图和控制器上. $scope是针对当前的cont ...
- SSH总结
远程服务介绍说明 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢?1.提供远程连接服务器的服务2.对传输的数据进 ...
- javascript事件委托的原理与实现
事件委托 事件流 捕获:查找目标元素: 目标:执行目标的事件: 冒泡:依次执行祖先元素的事件. onmouseenter和onmouseleave不支持冒泡: onmouseover和onmouseo ...
- IntelliJ IDEA,酷炫插件系列,提高你的工作效率
今天介绍一下IDEA的一些炫酷的插件,IDEA强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同. 1.插件的安装 打开setting文件选择Plugins选项 Ctrl + Alt ...
- python开发环境_windows系统安装_错误记录
1 安装python编译器2.7.11版本 (安装包自带pip,setuptools,依赖,会将pip,setuptools安装到自己的类库中) 配置环境变量: 配置python_home,然后加入p ...
- docker 搭建以太坊私有链搭建
最近区块链,火得不行,身边也有朋友准备玩这个,说是搭了一个星期,没有把环境搭建起来,叫我帮忙看看环境怎么搭建 于是我找到了官方的地址 https://github.com/ethereum/go-et ...
- shaderlab UV动画所需的变量声明
优化资源.美术需要迫使自己的顶点shader能够进行TRANSFORM_TEX运算,进行该运算的前提是需要声明一个 _MainTex_ST 变量,类型为float4即可. 此时就可以使用unity c ...
- Javascript 精简语法介绍
1. 取整同时转成数值型: '10.567890'|0 结果: 10 '10.567890'^0 结果: 10 -2.23456789|0 结果: -2 ~~-2.23456789 结果: -2 2. ...
- P1991 无线通讯网 最小生成树
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...