一、pt-osc介绍
mysql大表DDL一直是数据库运维当中的痛点,在实际运维过程中,我们一般有三种选择: 1、原生 online ddl 2、pt-online-schema-change工具 3、ghost工具 本文我们主要介绍pt-online-schema-change工具的使用pt-online-schema-change 的工作原理是创建要更改的表的空副本,根据需要对其进行修改,然后将原始表中的数据复制到新表中。复制完成后,它会删除原始表并用新表替换它。
数据复制过程以chunk(小块数据)的形式执行。复制期间对原始表中的任何数据修改都将反映在新表中,因为该工具会在原始表上创建触发器来更新新表中的相应行。使用触发器意味着如果表上已经定义了任何触发器,则该工具将不起作用。
当该工具将数据复制到新表后,它会使用原子操作同时重命名原始表和新表,完成后,该工具会删除原始表。
使用该工具,表必须有主键或者唯一索引
安装过程请见我另一篇博客:https://www.cnblogs.com/sunjiwei/p/18584735
二、pt-osc的使用
2.1、参数介绍
Usage: pt-online-schema-change [OPTIONS] DSN--alter # 模式变更,后面跟变更的sql,例如 --alter "add column comment varchar(50),ADD INDEX index_updated_time (updated_time)",多个变更使用逗号分隔;--[no]analyze-before-swap # 在ddl完成后,需要rename新旧表之前是否对新表进行analyze分析,默认yes--ask-pass # 连接mysql时提示输入密码, 这样就不用在命令行上输入密码了,如果不加这个参数,就要用--password 这个参数在命令杭商输入密码,默认是no,不提示输入密码--charset=s # 指定字符集--[no]check-alter # 解析--alter指定内容并尝试警告可能出现的意外行为,默认是yes--[no]check-plan # Check query execution plans for safety ( default yes)--[no]check-replication-filters # 该工具会查找过滤复制的服务器选项,例如 binlog_ignore_db 和 replicate_do_db。如果发现任何此类过滤器,则会中止并显示错误。默认yes--check-slave-lag=s # Pause the data copy until this replica's lag is less than --max-lag,该选项已弃用,并在未来删除,用 --check-replica-lag 代替
--check-replica-lag # 代替上面这个参数,会定期检查所有已知从服务器的复制延迟情况。如果检测到任何从服务器的延迟超过了设定的阈值,则暂停数据迁移操作,直到延迟恢复到可接受范围内(--max-lag)--max-lag # 该参数定义了允许的最大复制延迟秒数。当 --check-replica-lag 启用时,pt-osc 会在每次健康检查期间比较当前从服务器的延迟与 --max-lag 的值。如果任何一个从服务器的延迟超过了 --max-lag,则 pt-osc 将暂停其活动,等待延迟回到可接受范围内再继续。--check-interval=m # 参数用于指定在检查复制延迟(--max-lag)等健康检查之间的间隔时间(以秒为单位)。这有助于控制工具在执行过程中对服务器资源的影响,确保不会因为频繁的健康检查而给系统带来过多负担。--[no]check-unique-key-change # 当启用了此选项时,pt-osc 会分析 ALTER TABLE 语句,检查是否涉及唯一键或者主键的添加、删除或修改。对于涉及唯一键变更的操作,pt-osc 会更加谨慎地处理,以避免因并发插入或更新而导致的数据冲突或重复记录问题。--chunk-index=s # 默认使用主键或唯一索引来分块处理数据。然而,在某些情况下,表可能没有合适的主键或唯一索引,或者你希望使用其他索引来优化分块过程。这时可以使用 --chunk-index 参数来明确指定要使用的索引。--chunk-index-columns=i # 参数允许用户指定分块索引中的列,以便更精确地控制 pt-osc 如何分片和处理数据。这个参数与 --chunk-index 配合使用.虽然 --chunk-index 指定了要使用的索引,但有时你可能希望更具体地控制哪些列用于分片。--chunk-index-columns 让你可以明确指出这些列--chunk-size=z # Number of rows to select for each chunk copied (default 1000),就是上面分的块,每块有多少行,一般生产变更实例支援充足可以给几千到几万不等--chunk-size-limit=f # --chunk-size-limit 是 --chunk-size 的上限,确保分块不会过大。比如该参数设置为1,那就是最大的块大小就等于--chunk-size,如果该参数设置为2,那就是最大的块大小等于--chunk-size * 2--database=s -D # Connect to this database--dry-run # 创建并修改新表,但不创建触发器、复制数据或替换原始表,该参数允许你在不实际进行任何更改的情况下测试和验证 pt-osc 的操作
--execute # 真正执行操作,和--dry-run 互斥--new-table-name=s # New table name before it is swapped.--print # Print SQL statements to STDOUT--progress=time,30 # Print progress reports to STDERR while copying rows (default time,30)
--quiet -q # Do not print messages to STDOUT (和--progress 互斥)--skip-check-slave-lag=d # DSN to skip when checking slave lag--slave-password=s # Sets the password to be used to connect tothe slaves
--slave-user=s # Sets the user to be used to connect to the slaves--sleep=f # How long to sleep (in seconds) after copying each chunk (default 0)--statistics # Print statistics about internal counters,ddl结束后打印统计信息例如:
pt-online-schema-change h=8.153.110.179,P=3306,u=root,p='111111',D=jiwei,t=union_new --alter 'add column name varchar(10)' --chunk-size=5000 --statistics --progress=time,3 --max-lag=60 --execute如果不在乎延迟,则可以不加--max-lag=60 参数