Online DDL 和PT-OSC怎么选择

 pt-osc无论是什么DDL SQL,都会新建新表来替换,不分DDL类型,但是执行期间允许DDL操作,而ONLINE DDL则分为了好几类DDL,有的DDL仅需修改元数据,有的DDL仅需在本身ibd文件上新建索引页,有的需要rebuild table,这三种类型执行期间支持DML操作,但是COPY TABLE 类型不支持DML操作。

        如果MySQL版本是5.6之前,不支持online ddl操作的,pt-online-schema-change是一个非常好的选择;
        如果MySQL的版本是5.6以上的,支持online-ddl的,优先考虑使用online ddl,但是如果是ddl SQL 在online DDL中 需要copy table to tmp table,则建议使用pt-online-schema-change来处理,比如修改列数据类型的DDL,online DDL则是需要copy table to tmp table,期间仅支持查询,不支持DML操作,这个时候,就可以使用pt-online-schema-change来处理,因为它也是拷贝临时表格,并且执行期间支持DML操作;
        如果执行Online DDL,但是对从库的延迟非常敏感,针对需要copy table 跟rebuild table这两类DDL SQL,需要考虑是否可以在从库设置并行复制,如果不行,则优先选择pt-online-schema-change。

ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;
ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY; #修改数据类型
ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;  #只支持修改varchar(255)
ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;



ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
screen
pt-online-schema-change 
--user=root 
--password=123456 
--host=192.168.1.1
--port=3306  
--alter " ADD COLUMN col_1 varchar(32)  "   
D=test_db,t=test_table 
--max-load=Threads_running=32       #32个并发暂停copy
--critical-load=Threads_running=64  #64个并发停止

--recursion-method=none             #不检查从库,如果不检查从库,就必须指定此选项
--recursion-method=hosts            #使用show slave hosts 检查从库
--max-lag=60s --check-interval=10s  #从库最大延迟60S,10S检查一次
--check-slave-lag=h=192.168.1.2     #检查指定的从库

--no-drop-old-table                 #不删除老表,默认是删除老表
--no-version-check                  #不检查版本,RDS需要加
--charset=utf8
--execute --alter-foreign-keys-method=auto  --print --statistics >> pt_osc.log