##=====================================================##
pt-osc之工作流程:
1、检查更改表是否有主键或唯一索引,是否有触发器
2、检查修改表的表结构,创建一个临时表,在新表上执行ALTER TABLE语句
3、在源表上创建三个触发器分别对于INSERT UPDATE DELETE操作
4、从源表拷贝数据到临时表,在拷贝过程中,对源表的更新操作会写入到新建表中
5、将临时表和源表rename(需要元数据修改锁,需要短时间锁表)
6、删除源表和触发器,完成表结构的修改。

##=====================================================##
pt-osc之工具限制
1、源表必须有主键或唯一索引,如果没有工具将停止工作
2、如果线上的复制环境过滤器操作过于复杂,工具将无法工作
3、如果开启复制延迟检查,但主从延迟时,工具将暂停数据拷贝工作
4、如果开启主服务器负载检查,但主服务器负载较高时,工具将暂停操作
5、当表使用外键时,如果未使用--alter-foreign-keys-method参数,工具将无法执行
6、只支持Innodb存储引擎表,且要求服务器上有该表1倍以上的空闲空间。

##=====================================================##

pt-osc之唯一索引

使用pt-osc创建唯一索引时,会造成数据丢失,需谨慎操作:

1、当表中要建立唯一索引的数据列上存在重复数据,则部分重复数据会丢失

2、如果创建过程中插入新数据,新数据与原数据库存在重复,则原数据丢失

丢失原因:

由于INSERT和UPDATE触发器使用REPLCAE INTO的方式更新新表数据,而新表中包含唯一索引,导致REPLACE INTO操作转换成DELETE+INSERT操作,将已存在于新表中的重复记录删除,再插入当前记录,最终导致数据丢失。

##=====================================================##
pt-osc之拷贝数据
在拷贝数据过程中,工具会把数据按照主键或唯一键进行拆分,限制每次拷贝数据的行数以保证拷贝进行不过多消耗服务器资源。为保证源表和目标表数据相同,采用LOCK IN SHARE MODE来获取要拷贝数据段的最新数据并对数据加共享锁组织其他回话修改数据,采用LOW_PRIORITY IGNORE来将数据插入到新表中, 关键字LOW_PRIORIT使得插入操作会等待其他访问该表的操作完成会再执行,关键字INGORE使得表中出现主键或唯一索引键重复时新数据被忽略而不会被插入。

对表`testdb1`.`tb1001`进行修改时的数据拷贝脚本:

## 先获取下一次拷贝数据的边界,强制索引可以有效避免执行计划出现问题
SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `testdb1`.`tb1001` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '8394306')) ORDER BY `id` LIMIT 22256, 2 /*next chunk boundary*/

## 通过拷贝数据的边界限制,防止单次拷贝过多数据而长时间阻塞其他回话
INSERT LOW_PRIORITY IGNORE INTO `testdb1`.`_tb1001_new` (`id`, `c1`, `c6`) SELECT `id`, `c1`, `c6` FROM `testdb1`.`tb1001` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '8394306')) AND ((`id` <= '8416562')) LOCK IN SHARE MODE /*pt-online-schema-change 14648 copy nibble*/

##=====================================================##
pt-osc之触发器

pt-osc工具在源表上创建三个AFTER触发器分别对于INSERT UPDATE DELETE操作,DELETE触发器使用DELETE IGNORE来保证源表和新表的数据都被删除, 而INSERT和UPDATE触发器使用REPLACE INTO来保证新表数据和源表数据一致。

由于MySQL限制相同类型的触发器只能有一个,因此需要在运行前检查源表上是否有触发器,为保证删除和更新效率和方便和将源表数据进行分片处理,因此要求表上有主键或唯一索引。

##=====================================================##
pt-osc之主机性能影响

为避免过度影响主机性能,pt-osc工具通过以下几个方面来限制:
1、通过参数chunk-size和chunk-time控制每次拷贝数据大小
2、通过参数max-load来检查主机当前压力,每次chunk拷贝完成后,都会运行SHOW GLOBAL STATUS LIKE 'Threads_running' 命令检查当前正在运行的Threads数量,默认Threads_running=25,如果未指定最大值,则会取当前值的120%作为最大值,如果超过阀值则会暂停数据拷贝

##=====================================================##
pt-osc之从库复制延迟

对于复制延迟比较敏感的业务,可以通过下面参数来控制复制延迟:

--max-log
默认为1s,每个chunks拷贝完成后,会查看check-slave-lag参数所指定的从库的延迟信息,如果超过max-log的阀值,则暂停复制数据,直到复制延迟小于max-log的阀值。检查复制延迟信息依赖于SHOW SLAVE STATUS语句中返回的Seconds_Behind_Master列的值。

--check-interval
当出现复制延迟暂停复制数据后,按照check-interval指定的时间进行周期检查复制延迟,直到延迟时间低于max-log阀值,然后恢复数据拷贝

--check-slave-lag
需要检查复制延迟的从库IP
如果指定check-slave-lag参数,且从库无法正常连接或从库IO线程和SQL线程停止,会认为主从存在延迟,导致复制数据操作一直暂停。
如果未指定check-slave-lag参数,默认还是会检查从库的延迟,但复制延迟不会导致数据复制暂停。

##=====================================================##
pt-osc之chunk设置
在pt-osc的帮助文档中,关于chunk的参数有如下:
--chunk-index=s Prefer this index for chunking tables

--chunk-index-columns=i Use only this many left-most columns of a --chunk-index

--chunk-size=z Number of rows to select for each chunk copied (default 1000)

--chunk-size-limit=f Do not copy chunks this much larger than the desired chunk size (default 4.0)

--chunk-time=f Adjust the chunk size dynamically so each data-copy query takes this long to execute (default 0.5)

当chunk-size和chunk-time两者都未指定时,chunk-size默认值为1000,chunk-time默认值为0.5S,第一次按照chunk-size来进行数据复制,然后根据第一次复制的时间动态调整chumk-size的大小,以适应服务器的性能变化,如上一次复制1000行消耗0.1S,则下次动态调整chumk-size为5000。
如果明确指定chumk-size的值或将chunk-time指定为0,则每次都按照chunk-size复制数据。

##=====================================================##
pt-osc之alter语句限制
1、不需要包含alter table关键字,可以包含多个修改操作,使用逗号分开,如"drop clolumn c1, add column c2 int"
2、不支持rename语句来对表进行重命名操作
3、不支持对索引进行重命名操作
4、如果删除外键,需要对外键名加下划线,如删除外键fk_uid, 修改语句为"DROP FOREIGN KEY _fk_uid"
##=====================================================##
pt-osc之命令模板
## --execute表示执行
## --dry-run表示只进行模拟测试
## 表名只能使用参数t来设置,没有长参数
pt-online-schema-change \
--host="127.0.0.1" \
--port=3358 \
--user="root" \
--password="root@root" \
--charset="utf8" \
--max-lag=10 \
--check-salve-lag='xxx.xxx.xxx.xxx' \
--recursion-method="hosts" \
--check-interval=2 \
--database="testdb1" \
t="tb001" \
--alter="add column c4 int" \
--execute

##=====================================================##
pt-osc之命令输出
上面命令执行输出如下:
No slaves found. See --recursion-method if host 171DB166 has slaves.
Will check slave lag on:
170DB166
Operation, tries, wait:
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `testdb1`.`tb001`...
Creating new table...
Created new table testdb1._tb001_new OK.
Altering new table...
Altered `testdb1`.`_tb001_new` OK.
2016-04-28T23:18:04 Creating triggers...
2016-04-28T23:18:04 Created triggers OK.
2016-04-28T23:18:04 Copying approximately 1 rows...
2016-04-28T23:18:04 Copied rows OK.
2016-04-28T23:18:04 Swapping tables...
2016-04-28T23:18:04 Swapped original and new tables OK.
2016-04-28T23:18:04 Dropping old table...
2016-04-28T23:18:04 Dropped old table `testdb1`.`_tb001_old` OK.
2016-04-28T23:18:04 Dropping triggers...
2016-04-28T23:18:04 Dropped triggers OK.
Successfully altered `testdb1`.`tb001`.

##=====================================================##

MySQL--pt-osc工具学习相关推荐

  1. MySQL pt工具应用

    MySQL pt工具的应用 1.pt工具安装 [root@master ~]# yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm2.常用工具使 ...

  2. mysql 案例 ~ pt修复工具的使用

    简介:今天咱们来聊聊PT修复工具pt-table-sync 注意事项:    1 表要有主键或者唯一键    2 针对每一个chunk加的是for update锁    3 修复过程中不能容忍从库延迟 ...

  3. mysql 回滚_一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具

    goInception 一个集审核.执行.备份及生成回滚语句于一身的MySQL运维工具, 通过对执行SQL的语法解析,返回基于自定义规则的审核结果,并提供执行和备份及生成回滚语句的功能 架构图 使用方 ...

  4. 这 4 款 MySQL 调优工具 yyds

    欢迎关注方志朋的博客,回复"666"获面试宝典 对于正在运行的mysql,性能如何,参数设置的是否合理,账号设置的是否存在安全隐患,你是否了然于胸呢? 俗话说工欲善其事,必先利其器 ...

  5. 4 款 MySQL 调优工具,公司大神都在用!

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:toutiao.com/a6691523026984370699 对于正在运行的mysql,性能如何,参数设置的是否合理, ...

  6. Mysql 安装及实践(学习笔记二)

    安装并配置MySQL数据库 3.2.1 安装MySQL数据库 1.MySQL数据库的安装环境准备 如果读者没有物理服务器环境,则可以搭建vmware等虚拟机环境学习,相应地则需准备如下内容: 1)请提 ...

  7. 推荐 4 款 MySQL 调优工具,大神都在用!

    对于正在运行的mysql性能如何?参数设置的是否合理?账号设置的是否存在安全隐患是否了然于胸? 俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要手段. ...

  8. 淘宝商品库MySQL优化实践的学习

    淘宝商品库MySQL优化实践的学习 淘宝商品库是淘宝网最核心的数据库之一,采用MySQL主备集群的架构,特点是数据量大且增长速度快,读多写少,对安全性要求高,并发请求高.由于MySQL最初的设计不是用 ...

  9. mysql binlog查看工具_【使用 Rust 写 Parser】4. 解析 binlog

    系列所有文章 PrivateRookie:[使用 Rust 写 Parser]1. 初识 nom​zhuanlan.zhihu.com PrivateRookie:[使用 Rust 写 Parser] ...

  10. MySQL 运维 - 从零开始学习 | 超详细

    MySQL 运维 - 从零开始学习 一.数据库类型 ► 常见的数据库类型 二.数据库管理系统 DBMS ►数据库系统 ►关系型数据库 ►非关系型数据库 Not Only SQL 三.安装MySQL ► ...

最新文章

  1. ESP32 One-Wire驱动功能
  2. 使用Gunicorn Ngnx Supervisor部署Django项目
  3. 进入编辑模式、vim命令模式、vim实践
  4. 中国影视股,越补贴,越萎靡
  5. 北斗导航 | ION GNSS+ 2021、 ION GNSS+ 2020会议论文下载:ION 美国导航学会
  6. 网易实战分享|实时音视频会议场景下QoS策略
  7. 充满想象力的 JavaScript 物理和重力实验
  8. 2个多边形,其中一个包围另一个,如何将中间的环带区域涂成红色
  9. musictools怎么用不了_夏天少不了一只草编包,怎么搭配才不像“买菜用”?
  10. matlab 动画_MATLAB的动画制作和视频录制
  11. debian9 linux的版本,Debian 9.4 发布,小版本更新
  12. rose oracle双机切换故障,ROSE HA切换节点导致DG失败、恢复
  13. 【美学集】色彩之冷暖色
  14. 爬虫不借助浏览器登录_借助Android音乐播放器和旅行组合踏上道路
  15. 读《论证是一门学问》
  16. snmp-cmds:最简单的调用 Net-SNMP 二进制文件作为子进程的库可移植python SNMP 库
  17. 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程
  18. 网络对抗 Exp8 Web基础 20154311 王卓然
  19. 洛谷P1489 猫狗大战
  20. mysql查询1万条数据要1秒钟_SQL查询效率:100万数据查询只需要1秒钟

热门文章

  1. Fisher-Yates 乱序算法
  2. javascript怎么判断对象为空
  3. 利用Server 2003的远程桌面搭建简易的RAS远程接入系统
  4. 嵌入式工具——iperf
  5. (六)洞悉linux下的Netfilteriptables:如何理解连接跟踪机制?(2)
  6. Python的逻辑操作
  7. SQlite数据库的C编程接口(三) 预处理语句(Prepared Statements) ——《Using SQlite》读书笔记 .
  8. LeetCode入门题 两数之和
  9. vue用户行为收集_【用户行为采集】(一)常见埋点方式及对比
  10. 地表温度数据、LST温度数据、地表反照率、NDVI数据、NPP数据、植被覆盖度、土地利用数据