1、TiDB DDL 特点

大多数数据库执行 DDL 操作时,或多或少会对正在访问该数据库的 SQL 产生影响。例如,在执行 DDL 期间可能会有锁表操作,此时访问该表的 SQL 会被阻塞。因此,一般在表结构设计阶段都会尽量避免后续产生 DDL 操作。如果必须执行 DDL操作,也只能选择在业务低峰期操作,尽量减少对线上业务的影响。

TiDB 上的 DDL 操作,不会阻塞任何该数据库上正在执行的 SQL,对业务的 SQL 访问和对 DBA 运维都极为友好,这也是 TiDB 相较于其他数据库产品的一大优势所在。

2、对 DDL 进行管理

  1. ADMIN SHOW DDL;

这个可以查看ddl状态,

  • 查看当前 schema version,owner 信息以及正在执行的 DDL 任务。
  • 查看当前未执行完成的 DDL 任务(包括正在运行的 DDL 任务和等待运行的任务)以及最近 NUM 条(默认 10 )已经执行完成的 DDL 任务。 ADMIN SHOW DDL JOBS [NUM] [WHERE where_condition];

#例如,显示当前未完成的 DDL 任务,以及最近 5 条已经执行完成的 DDL 任务。
MySQL> ADMIN SHOW DDL JOBS 5;#例如,显示 test 数据库中未执行完成的 DDL 任务,以及最近 5 条已经执行完成但执行失败的 DDL 任务。
MySQL> ADMIN SHOW DDL JOBS 5 WHERE state!='synced' AND db_name='test';#根据 JOB_ID 查询具体的 DDL 语句。
MySQL> ADMIN SHOW DDL JOB QUERIES job_id [, job_id]...;#取消正在执行中的 DDL 任务。
MySQL> ADMIN CANCEL DDL JOBS job_id [, job_id]...;#通过 JOB_ID 恢复表,等价于:RECOVER TABLE table_name。
MySQL> RECOVER TABLE BY JOB ddl_job_id;

特别注意 在执行一些 DDL 操作时(如 ADD INDEX ),由于执行时间较长,不会立即返回执行结果,mysql-client 会处于卡死的状态。此时可以放心的 ctrl+c 来终止该连接,不会影响 DDL 的实际执行。DDL 正常耗时可以参考相关官方文档。

通过 ADMIN SHOW DDL 查询确认,被 ctrl+c 之后,该 DDL 依旧正常运行。

除此之外,也可以通过访问 TiDB 提供的 HTTP 接口查看当前 owner 所在 TiDB,以及各个 TiDB 节点 ddl_idlease 等信息

3、DDL 相关参数

tidb_ddl_reorg_worker_cnt:

控制数据回填(re-organize)阶段的并发度

tidb_ddl_reorg_batch_size

控制数据回填(re-organize)阶段一次回填的数据量

tidb_ddl_reorg_priority

控制数据回填(re-organize)阶段执行的优先级

tidb_ddl_error_count_limit

控制 DDL 操作失败重试的次数,重试次数超过该值,则取消 DDL 操作

TiDB 集群中,用户执行的 DDL 操作分两类:普通 DDL 操作和加索引操作。普通 DDL 操作执行时间短,一般秒级就可以执行完成;而加索引操作由于需要回填数据,因此执行时间略长。而在回填数据期间,需要将回填的数据写入 TiKV,对 TiKV 会产生额外的写入压力,从而造成一些性能影响。相关的测试可以参考:线上负载与 ADD INDEX 相互影响的测试。

TiDB 提供了参数 tidb_ddl_reorg_worker_cnt 和 tidb_ddl_reorg_batch_size 用来控制回填数据的速度。通过调整参数,可以在业务访问高峰到来时降低 DDL 速度,保证对业务的正常访问无影响;而在业务访问低峰增加 DDL 速度,从而更快的完成 DDL 任务。

注意

  • 参数 tidb_ddl_reorg_priority 调整优先级,可能会对正常的 SQL 请求有一定的影响,一般默认值即可。

  • 参数 tidb_ddl_error_count_limit 则用来控制重试次数,当发生异常(诸如由于超时、TiKV 无法连接等)时,可进行重试;超过重试次数则终止当前 DDL,一般默认值即可。

4、DDL处理流程

TiDB-Server 作为 SQL 的统一入口,DDL 操作也首先经由 TiDB-Server 处理,TiDB 可以多点写入,也就是不同的 TiDB-Server 可以同时接受 DDL 操作请求。

为了保证 TiDB-Server 异常重启而丢失 DDL 信息,首先 TiDB-Server 会将 DDL 操作封装成一个拥有唯一标识的 DDL Job,存储到 TiKV 上的任务队列中,持久化保存。

每个 TiDB-Server 上都拥有执行 DDL 任务的 worker 。但是,各个 TiDB-Server 会竞选出唯一一个 Owner 节点来执行实际 DDL 任务,其他竞选失败的 TiDB-Server 节点虽然可以接受 DDL 请求,但是不负责执行 DDL 任务。Owner 会定期对自己的 Owner 身份续租。如果当前 Owner 出现异常,剩余的节点会再次竞选 Owner 。

Owner 节点上的 worker 会从任务队列中依次取出 DDL 任务执行。然而由于 ADD INDEX 类型的 DDL 任务在数据量很大情况下执行时间特别长(需要回填数据),从而导致其余的 DDL 操作会被阻塞,TiDB 对该处进行了优化。将任务队列一分为二,一个队列用来存储非 ADD INDEX 类型的 DDL 任务,一个队列用来存储 ADD INDEX 类型的 DDL 任务。Owner 上的不同的 worker 也会从不同的队列中获取对应的 DDL 任务进行执行。当然,该优化也会引入任务依赖问题。任务依赖问题指的是,同一张表的 DDL 任务,任务编号小的需要先执行。因此在执行 DDL 之前需要对依赖进行检查。

Owner 上的 worker 在处理 ADD INDEX 类型 DDL 任务时,涉及到回填数据的过程。该过程会启动 tidb_ddl_reorg_worker_cnt 个线程,每次每个线程处理 tidb_ddl_reorg_batch_size 大小的数据。因此通过调整这两个参数,可以动态控制 DDL 执行速度。

当 DDL 任务执行完成之后,会将执行完成的 DDL 任务移动至历史任务队列(job history queue)中,方便后续通过命令进行 DDL 任务的历史查询。

完整的 DDL 执行流程如下图所示,更详细的内容,可以参考 DDL 源码解析。

5、DDL变更原理

TiDB 在线表变更的原理借鉴自论文 《Online, Asynchronous Schema Change in F1》,通过在表结构变更过程中引入额外状态从而实现了一套在线表变更协议,使得集群存在相邻两个版本的 schema 时候,不会破坏数据完整性或发生数据异常。因此,在实现上,要求集群中在同一个表上所有 schema 版本最多存在两个相邻的版本。

例如,以 ADD INDEX 类型的 DDL 操作为例,其状态变化如下表所示:

schema版本 状态 说明
schema version 1 absent 添加索引之前。
schema version 2 delete only schema 元信息已经修改,但此时对外不可见。内部索引数据不可添加/更新,仅可删除。
schema version 3 write only 此时对外不可见,内部索引数据可任意修改。
schema version 4 write reorgnization 内部索引数据可任意修改,并且进行索引的回填。
schema version 5 public 此时对外可见,索引添加完成。

TiDB 在该论文的基础上又进行了一些优化。例如,在执行 ADD COLUMN 类型 DDL 时,TIDB并没有对数据进行回填,而是将最新添加的列的 default 值保存到 schema 的”原始默认值”字段中,在读取阶段如果 TiKV 发现该列值为 null 并且”原始默认字段”不为 null,则会使用”原始默认字段”对该 null 列进行填充,并将填充后的结果从 TiKV 返回。通过这种优化,该 DDL 操作不需要关心表中实际行数,可以更快的完成 DDL 变更。

再例如,一些涉及删除数据的 DDL 操作,诸如:DROP INDEXDROP TABLEDROP DATABASETRUNCATE TABLE 等,在实现上,除了要完成和普通 DDL 变更一样的逻辑外,还需要对待删除的数据进行处理。TiDB 做法是,将这些需要删除的数据记录到 gc_delete_range 表中,通过 GC 机制,将对应的数据再进行删除。当然如果是删除某列的 DDL 操作,由于目前是行存储模式,删除列的代价会比较大,所以暂时只是在 schema 上进行删除列的标记,并不会实际删除该列的数据。

参考文章:https://www.bookstack.cn/read/tidb-in-action/session1-chapter7-tidb-ddl-status.md

tidb学习-如何查看ddl状态相关推荐

  1. linux 进程 状态 ri,LINUX下解决netstat查看TIME_WAIT状态过多问题(转)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSING 130 ESTABLISHED 298 FIN_WAIT1 13 FIN_WA ...

  2. linux 查看当前状态_Linux视频编辑的当前状态2018

    linux 查看当前状态 众所周知,Linux在现代电影制作中意义重大. Linux是标准的基础,是数字效果的字面工业标准 ,但是,像所有具有发展动力的技术一样,剪辑镜头的过程似乎仍然默认为非Linu ...

  3. 多线程调试(gdb命令行和使用集成开发qtcreator查看线程状态)

    我在qtcreator中用调用的gdb找不到如何显示线程号对应的线程名字,因此需要继续学习使用gdb进行多线程调试. 1.创建多线程工程 2.启动进程并查看运行进程对应的id 3.使用gdb连接进程, ...

  4. TiDB学习笔记【初阶】

    文章目录 一.TiDB简介 五大核心特性 四大核心应用场景 二.快速上手 三.TiDB架构原理 1.TiDB数据库的存储--TiKV Server TiKV Raft和RocksDB Region概念 ...

  5. linux6 防火墙状态,linux 6 查看防火墙状态及开启关闭命令

    linux 6查看防火墙状态及开启关闭命令 存在以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptab ...

  6. Git实用教程 3.0:查看工作状态和历史提交

    在开始今天的内容之前,我们先来快速回顾一下前面讲到的知识. 我们要用 Git 来管理你的项目,首先需要先拥有一个项目,首先创建一个 文件夹 MyProject 作为你的基地,然后来到 CMD 命名行窗 ...

  7. Centos7状态下查看防火墙状态及修改服务端口

    查看当前主机监听哪些服务端口 netstat -telunp 查看防火墙firewall开放端口 fiewall-cmd --list-ports 增加对外开放的端口 firewall-cmd --z ...

  8. 10.6监控io性能10.7free命令10.8ps命令10.9查看网络状态10.10linux抓包

    10.6 监控io性能 iostat -x 查看磁盘使用情况有一个非常重要的指标%util,这个值越大说明硬盘被占用的越多 iotop命令需要安装 iotop也是一个动态的显示,关注 IO这一列 10 ...

  9. linux 查看san链路状态,Linux下查看网络状态的方法

    当我的设备在机房,懒得去查看网线连接情况:或者设备在远端,没有条件让眼睛亲临现场,我需要在终端查看设备网络接口的物理连接状态.基于此种场景,我就了解了几种关于命令查看网络状态的方法. 1. ifcon ...

最新文章

  1. SQL与NoSQL区别-存储规范
  2. Franzis CutOut 9 Professional中文版
  3. IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程
  4. android beam传输速率,无线网络的速率为何不能达到最大值
  5. 【Android OpenGL ES 开发 (二)】渲染管线与Shader
  6. 排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)
  7. 微课|玩转Python轻松过二级:第3章课后习题解答4
  8. k8s核心技术-集群安全机制(概述)---K8S_Google工作笔记0038
  9. iOS关于setContentOffset的一些细节问题
  10. [Win11]解决PS/2标准键盘带感叹号,笔记本键盘无法使用。代码19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个
  11. 软件推荐:Picasa
  12. 通用的权限管理系统的设计
  13. 10款平面设计软件锦集,“学废”一样都可独挡一面!
  14. python 使用 pyodbc 访问 Sql Server
  15. 微信APP支付-签名问题
  16. Crystal Xcelsius 2008 使用Excel XML映射链接
  17. Solidworks直接打开SWB文件报错怎么办
  18. Linux之日志服务及管理
  19. Latex 排版相关(一)
  20. 转载内存授予(memory grants)的理解

热门文章

  1. uniapp 开发app,唤醒微信小程序支付
  2. java下载excel模板-SpringBoot版本
  3. 2022.04.17关于EasyX的知识点
  4. 限制表格里面的显示字数
  5. python 爬虫 获取bilibili search搜索数据,返回json格式
  6. Oracle的vdi文件在哪里,VirtualBox 压缩vdi文件
  7. 桌面点击计算机没反应怎么办,win10桌面点击没反应怎么办_win10电脑桌面鼠标点击没反应修复方法...
  8. java cpu变高,他在做什么
  9. 剪切音乐有什么简单的制作方法
  10. 基于新浪微博的⽇志数据分析