导读

  percona-toolkit 源自 Maatkit 和 Aspersa 工具,这两个工具是管理 MySQL 的最有名的工具,但 Maatkit 已经不维护了,全部归并到 percona-toolkit。Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要包括:

  • 验证主节点和复制数据的一致性
  • 有效的对记录行进行归档
  • 找出重复的索引
  • 总结 MySQL 服务器
  • 从日志和 tcpdump 中分析查询
  • 问题发生时收集重要的系统信息
  • 在线修改表结构

工作原理

  • 如果存在外键,根据 alter-foreign-keys-method 参数的值,检测外键相关的表,做相应设置的处理。没有使用 alter-foreign-keys-method 指定特定的值,该工具不予执行
  • 创建一个新的空表,其命名规则是:下划线 + 原表名 +_new
  • 根据 alter 语句,更新新表的表结构;
  • 创建触发器,用于记录从拷贝数据开始之后,对源数据表继续进行数据修改的操作记录下来,用于数据拷贝结束后,执行这些操作,保证数据不会丢失。如果表中已经定义了触发器这个工具就不能工作了。
  • 拷贝数据,从源数据表中拷贝数据到新表中。
  • 修改外键相关的子表,根据修改后的数据,修改外键关联的子表。
  • rename 源数据表为 old 表,把新表 rename 为源表名,其通过一个 RENAME TABLE 同时处理两个表,实现原子操作。(RENAME TABLE dbteamdb.user TO dbteamdb._user_old, dbteamdb._user_new TO dbteamdb.user)
  • 将 old 表删除、删除触发器。

mac安装

  1. brew install percona-toolkit

官网地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

  注:如果mac上安装很慢,请设置国内镜像:点我直达

使用

pt-online-schema-change参数

  语法:pt-online-schema-change [OPTIONS]

OPTIONS 参数说明

  1. --user:
  2. -u,连接的用户名
  3. --password
  4. -p,连接的密码
  5. --database
  6. -D,连接的数据库
  7. --port
  8. -P,连接数据库的端口
  9. --host:
  10. -h,连接的主机地址
  11. --socket:
  12. -S,连接的套接字文件
  13. --ask-pass
  14. 隐式输入连接 MySQL 的密码
  15. --charset
  16. 指定修改的字符集
  17. --defaults-file
  18. -F,读取配置文件
  19. --alter
  20. 结构变更语句,不需要 alter table 关键字。可以指定多个更改,用逗号分隔。如下场景,需要注意:
  21. 不能用 RENAME 来重命名表。
  22. 列不能通过先删除,再添加的方式进行重命名,不会将数据拷贝到新列。
  23. 如果加入的列非空而且没有默认值,则工具会失败。即其不会为你设置一个默认值,必须显示指定。
  24. 删除外键 (drop foreign key constrain_name) 时,需要指定名称_constraint_name,而不是原始的 constraint_name
  25. 如:CONSTRAINT `fk_foo` FOREIGN KEY (`foo_id`) REFERENCES `bar` (`foo_id`),需要指定:--alter "DROP FOREIGN KEY _fk_foo"
  26. --alter-foreign-keys-method
  27. 如何把外键引用到新表?需要特殊处理带有外键约束的表,以保证它们可以应用到新表。当重命名表的时候,外键关系会带到重命名后的表上。
  28. 该工具有两种方法,可以自动找到子表,并修改约束关系。
  29. auto rebuild_constraints drop_swap 两种处理方式中选择一个。
  30. rebuild_constraints:使用 ALTER TABLE 语句先删除外键约束,然后再添加。如果子表很大的话,会导致长时间的阻塞。
  31. drop_swap 执行 FOREIGN_KEY_CHECKS=0, 禁止外键约束,删除原表,再重命名新表。这种方式很快,也不会产生阻塞,但是有风险:
  32. 1, 在删除原表和重命名新表的短时间内,表是不存在的,程序会返回错误。
  33. 2, 如果重命名表出现错误,也不能回滚了。因为原表已经被删除。
  34. none 类似"drop_swap"的处理方式,但是它不删除原表,并且外键关系会随着重命名转到老表上面。
  35. --[no]check-alter
  36. 默认 yes,语法解析。配合 --dry-run --print 一起运行,来检查是否有问题(change columndrop primary key)。
  37. --max-lag
  38. 默认 1s。每个 chunk 拷贝完成后,会查看所有复制 Slave 的延迟情况。要是延迟大于该值,则暂停复制数据,直到所有从的滞后小于这个值,使用 Seconds_Behind_Master。如果有任何从滞后超过此选项的值,则该工具将睡眠 --check-interval 指定的时间,再检查。如果从被停止,将会永远等待,直到从开始同步,并且延迟小于该值。如果指定 --check-slave-lag,该工具只检查该服务器的延迟,而不是所有服务器。
  39. --check-slave-lag
  40. 指定一个从库的 DSN 连接地址,如果从库超过 --max-lag 参数设置的值,就会暂停操作。
  41. --recursion-method
  42. 默认是 show processlist,发现从的方法,也可以是 host,但需要在从上指定 report_host,通过 show slave hosts 来找到,可以指定 none 来不检查 Slave
  43. METHOD USES
  44. =========== ==================
  45. processlist SHOW PROCESSLIST
  46. hosts SHOW SLAVE HOSTS
  47. dsn=DSN DSNs from a table
  48. none Do not find slaves
  49. 指定 none 则表示不在乎从的延迟。
  50. --check-interval
  51. 默认是 1。--max-lag 检查的睡眠时间。
  52.  
  53. --[no]check-plan
  54. 默认 yes。检查查询执行计划的安全性。
  55.  
  56. --[no]check-replication-filters
  57. 默认 yes。如果工具检测到服务器选项中有任何复制相关的筛选,如指定 binlog_ignore_db replicate_do_db 此类。发现有这样的筛选,工具会报错且退出。因为如果更新的表 Master 上存在,而 Slave 上不存在,会导致复制的失败。使用–no-check-replication-filters 选项来禁用该检查。
  58.  
  59. --[no]swap-tables
  60. 默认 yes。交换原始表和新表,除非你禁止 --[no]drop-old-table
  61.  
  62. --[no]drop-triggers
  63. 默认 yes,删除原表上的触发器。 --no-drop-triggers 会强制开启 --no-drop-old-table 即:不删除触发器就会强制不删除原表。
  64.  
  65. --new-table-name
  66. 复制创建新表的名称,默认 %T_new
  67.  
  68. --[no]drop-new-table
  69. 默认 yes。删除新表,如果复制组织表失败。
  70.  
  71. --[no]drop-old-table
  72. 默认 yes。复制数据完成重命名之后,删除原表。如果有错误则会保留原表。
  73.  
  74. --max-load
  75. 默认为 Threads_running=25。每个 chunk 拷贝完后,会检查 SHOW GLOBAL STATUS 的内容,检查指标是否超过了指定的阈值。如果超过,则先暂停。这里可以用逗号分隔,指定多个条件,每个条件格式: status 指标 =MAX_VALUE 或者 status 指标:MAX_VALUE。如果不指定 MAX_VALUE,那么工具会这只其为当前值的 120%。
  76.  
  77. --critical-load
  78. 默认为 Threads_running=50。用法基本与 --max-load 类似,如果不指定 MAX_VALUE,那么工具会这只其为当前值的 200%。如果超过指定值,则工具直接退出,而不是暂停。
  79.  
  80. --default-engine
  81. 默认情况下,新的表与原始表是相同的存储引擎,所以如果原来的表使用 InnoDB 的,那么新表将使用 InnoDB 的。在涉及复制某些情况下,很可能主从的存储引擎不一样。使用该选项会默认使用默认的存储引擎。
  82.  
  83. --set-vars
  84. 设置 MySQL 变量,多个用逗号分割。默认该工具设置的是: wait_timeout=10000 innodb_lock_wait_timeout=1 lock_wait_timeout=60
  85.  
  86. --chunk-size-limit
  87. 当需要复制的块远大于设置的 chunk-size 大小,就不复制。默认值是 4.0,一个没有主键或唯一索引的表,块大小就是不确定的。
  88.  
  89. --chunk-time
  90. chunk-time 执行的时间内,动态调整 chunk-size 的大小,以适应服务器性能的变化,该参数设置为 0, 或者指定 chunk-size, 都可以禁止动态调整。
  91.  
  92. --chunk-size
  93. 指定块的大小,默认是 1000 行,可以添加 k,M,G 后缀。这个块的大小要尽量与 --chunk-time 匹配,如果明确指定这个选项,那么每个块就会指定行数的大小。
  94.  
  95. --[no]check-plan
  96. 默认 yes。为了安全,检查查询的执行计划。默认情况下,这个工具在执行查询之前会先 EXPLAIN, 以获取一次少量的数据,如果是不好的 EXPLAIN, 那么会获取一次大量的数据,这个工具会多次执行 EXPALIN, 如果 EXPLAIN 不同的结果,那么就会认为这个查询是不安全的。
  97. --statistics
  98. 打印出内部事件的数目,可以看到复制数据插入的数目。
  99. --dry-run
  100. 创建和修改新表,但不会创建触发器、复制数据、和替换原表。并不真正执行,可以看到生成的执行语句,了解其执行步骤与细节。--dry-run --execute 必须指定一个,二者相互排斥。和 --print 配合最佳。
  101. --execute
  102. 确定修改表,则指定该参数。真正执行。--dry-run --execute 必须指定一个,二者相互排斥。
  103. --print
  104. 打印 SQL 语句到标准输出。指定此选项可以让你看到该工具所执行的语句,和 --dry-run 配合最佳。
  105. --progress
  106. 复制数据的时候打印进度报告,二部分组成:第一部分是百分比,第二部分是时间。
  107. --quiet
  108. -q,不把信息标准输出。

添加索引

  1. pt-online-schema-change --user=root --password=rootroot --host=127.0.0.1 --port=3306 --alter "ADD INDEX idx_name(user_name) USING BTREE" D=yb_test,t=sys_user --no-check-replication-filters --print --execute --charset=utf8 --max-load=Threads_running=20
  • user:用户名
  • password:密码
  • host:主机ip
  • port:mysql端口号
  • alter:改表语句,注意跟没有指定改表!!!!
  • D:数据库
  • t:待修改表名
  • no-check-replication-filters:不检查复制筛选器
  • print:打印SQL
  • charset:指定修改的字符集
  • max-load:限制20个线程执行,如果超过时,PT暂停操作,默认为25
  • execute:执行

演示

  注意:

    1、在旧表中新建触发器

    2、新建一张表命名格式:_原表名_new

    3、将旧表数据,拷贝到新表;如果旧表中有数据CRUD操作,会通过触发器操作到新表

    4、拷贝结束后,将原表改为旧表,新表改为原表,删除旧表,删除触发器

添加字段

  1. pt-online-schema-change --user=root --password=rootroot --host=127.0.0.1 --port=3306 --alter "ADD COLUMN t_remark varchar(255) NOT NULL default '' COMMENT '测试备注'" D=yb_test,t=sys_user --print --execute
  • user:用户名
  • password:密码
  • host:主机ip
  • port:mysql端口号
  • alter:改表语句,注意跟没有指定改表!!!!
  • D:数据库
  • t:待修改表名
  • print:打印SQL
  • execute:执行

  注意:alter中不能出现``,必须使用''

演示

修改字段名称和长度(其他都类似)

  1. pt-online-schema-change --user=root --password=rootroot --host=127.0.0.1 --port=3306 --alter "CHANGE COLUMN t_remark t_remark_new varchar(64) NOT NULL DEFAULT '' COMMENT '测试备注-new'" D=yb_test,t=sys_user --no-check-alter --print --execute
  • user:用户名
  • password:密码
  • host:主机ip
  • port:mysql端口号
  • alter:改表语句,注意跟没有指定改表!!!!
  • D:数据库
  • t:待修改表名
  • print:打印SQL
  • execute:执行
  • no-check-alter:不语法解析

  注意:对于 change column 则需要指定:–no-check-alter

删除字段

  1. pt-online-schema-change --user=root --password=Dl123456. --host=47.116.143.16 --port=3306 --alter "DROP COLUMN t_remark_new" D=yb_test,t=sys_user --print --execute
  • user:用户名
  • password:密码
  • host:主机ip
  • port:mysql端口号
  • alter:改表语句,注意跟没有指定改表!!!!
  • D:数据库
  • t:待修改表名
  • print:打印SQL
  • execute:执行

Mac pt-online-schema-change 图文并茂、不锁表在线修改 MySQL 表结构、添加表索引、添加表字段、修改表字段、删除表字段的更多相关文章

  1. AppBoxFuture(四). 随需而变-Online Schema Change

      需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...

  2. schema change + ogg 变更手册

    Check OGG  until no data queuing in replication process:testRO:a)login  test5 –l oggmgrb)oggc)#ggsci ...

  3. Online Schema Change for MySQL

    It is great to be able to build small utilities on top of an excellent RDBMS. Thank you MySQL. This ...

  4. mac废纸篓清空的心得、mac设置不睡眠不待机不锁屏、如何快速锁屏待机睡眠、mac重启、mac学习的必备软件-城

    mac废纸篓清空: 1.使用废纸篓的清空废纸篓,清空所有包括被锁定的文件: 2.使用“磁盘工具”的“修复磁盘权限”,修复完成再操作清空废纸篓: 3.使用cleanmymac软件“垃圾清理”和“擦除器” ...

  5. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  6. 在Mac OS X 10.8中配置Apache + PHP + MySQL

    在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...

  7. mac下修改mysql登录密码

    mysql版本5.7.9 在mac终端下修改mysql用户登录密码 终端命令如下: update mysql.user set authentication_string=PASSWORD(" ...

  8. 在Mac OS X 10.8中配置Apache+PHP+MySQL

    在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...

  9. MySQL学习(二)索引与锁 --- 2019年1月

    1.Order By 是怎么工作的 MySQL做排序是一个成本比较高的操作.MySQL会为每个线程分配一个 sort_buffer 内存用于排序,该内存大小为 sort_buffer_size. 全字 ...

  10. Mac下安装Mysql以及修改Mysql密码

    1.安装Mysql 安装有2种办法,一种是下载mysql安装文件,慢慢安装,另一种就是下载xmpp,里面自带mysql,就像是安装普通的mac软件一样,安装完毕,就有了mysql了. 方法一,官网下载 ...

随机推荐

  1. 从ReentrantLock角度解析AQS

    是它,是它,就是它,并发包的基石: 一.概述 闲来不卷,随便聊一点. 一般情况下,大家系统中至少也是JDK8了,那想必对于JDK5加入的一系列功能并不陌生吧.那时候重点加入了java.util.con ...

  2. Go/Python RPC使用

    Remote Procedure Call 简单RPC调用 server实现 // 注册接口 type HelloService struct{} func (s *HelloService) Hel ...

  3. STM32下载ELF文件、最小可执行bin文件测试

    1.STM32能下载ELF格式的文件吗? 答:可以.因为所谓的bin文件就是ELF文件的.text代码段. 当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把E ...

  4. .NET周报 【4月第5期 2023-04-30】

    国内文章 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用! https://www.cnblogs.com/NMSLanX/p/17326728.html 大家好,为了使开源项目的维护 ...

  5. C#自行实现安装卸载程序(不使用官方组件)

    正规软件建议还是使用官方的标准安装程序组件,因为官方的标准安装/卸载组件能更好的与操作系统衔接,安装和卸载流程更加规范. 今天提供一种野路子,全用代码实现安装卸载器. 需要写一个程序,包含安装器.卸载 ...

  6. 2021-07-21:一张扑克有3个属性,每种属性有3种值(A、B、C),比如“AAA“,第一个属性值A,第二个属性值A,第三个属性值A,比如“BCA“,第一个属性值B,第二个属性值C,第三个属性值A

    2021-07-21:一张扑克有3个属性,每种属性有3种值(A.B.C),比如"AAA",第一个属性值A,第二个属性值A,第三个属性值A,比如"BCA",第一个 ...

  7. 2021-10-08:填充每个节点的下一个右侧节点指针。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找

    2021-10-08:填充每个节点的下一个右侧节点指针.给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点.填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找 ...

  8. Python MQTT客户端 paho-mqtt

    Python中MQTT Python有许多优秀的MQTT客户端,比较有代表性的有paho-mqtt.hbmqtt.gmqtt等,各有特色 paho-mqtt 有着最优秀的文档,代码风格易于理解,同时有 ...

  9. Apache Arrow DataFusion原理与架构

    本篇主要介绍了一种使用Rust语言编写的查询引擎--DataFusion,其使用了基于Arrow格式的内存模型,结合Rust语言本身的优势,达成了非常优秀的性能指标 DataFusion是一个查询引擎 ...

  10. drf序列化器之反序列化的数据验证

    模型层 from django.db import models # Create your models here. class Manufacturer(models.Model): ## 厂商 ...