--host=xxx --user=xxx --password=xxx-h xxx -u xxx -p xxx,密码可以使用参数--ask-pass 手动输入。--alterALTER TABLE关键字。与原始ddl一样可以指定多个更改,用逗号分隔。change col1 col1_new type constraint(保持类型和约束一致,否则相当于修改 column type,不能online)--alter "DROP FOREIGN KEY _fk_foo"D=db_name,t=table_name--max-loadThreads_running=25。每个chunk拷贝完后,会检查 SHOW GLOBAL STATUS 的内容,检查指标是否超过了指定的阈值。如果超过,则先暂停。这里可以用逗号分隔,指定多个条件,每个条件格式: status指标=MAX_VALUE或者status指标:MAX_VALUE。如果不指定MAX_VALUE,那么工具会这只其为当前值的120%。--max-lagSeconds_Behind_Master)。要是延迟大于该值,则暂停复制数据,直到所有从的滞后小于这个值。--check-interval配合使用,指定出现从库滞后超过 max-lag,则该工具将睡眠多长时间,默认1s,再检查。如--max-lag=5 --check-interval=2。--recursion-method可以用来指定从库dsn记录。另外,如果从库被停止,将会永远等待,直到从开始同步,并且延迟小于该值。--chunk-time--chunk-size禁止动态调整,即每次固定拷贝 1k 行,如果指定则默认1000行,且比 chunk-time 优先生效--set-varsset-vars可以在执行alter之前设定这些变量,比如默认会设置--set-vars "wait_timeout=10000,innodb_lock_wait_timeout=1,lock_wait_timeout=60"。wait_timeout。--dry-run--print配合最佳。。--execute| 1 2 3 4 5 6 7 8 9 10 11 12 | 6165 Query CREATE TRIGGER `pt_osc_confluence_sbtest3_del` AFTER DELETE ON `confluence`.`sbtest3` FOR EACH ROW DELETE IGNORE FROM `confluence`.`_sbtest3_new` WHERE `confluence`.`_sbtest3_new`.`id` <=> OLD.`id` 6165 Query CREATE TRIGGER `pt_osc_confluence_sbtest3_upd` AFTER UPDATE ON `confluence`.`sbtest3` FOR EACH ROW REPLACE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`) 6165 Query CREATE TRIGGER `pt_osc_confluence_sbtest3_ins` AFTER INSERT ON `confluence`.`sbtest3` FOR EACH ROW REPLACE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`) 并且copy操作是: 6165 Query INSERT LOW_PRIORITY IGNORE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) SELECT `id`, `k`, `c`, `pad` FROM `confluence`.`sbtest3` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= "4692805")) AND ((`id` <= "4718680")) LOCK IN SHARE MODE /*pt-online-schema-change 46459 copy nibble*/ |
--alter-foreign-keys-method选项来决定怎么处理这种情况:rebuild_constraints,优先采用这种方式pt-online-schema-change 文件的 determine_alter_fk_method, rebuild_constraints, swap_tables三个函数中。drop_swap,FOREIGN_KEY_CHECKS=0--set-vars去设置 sql_log_bin=0,因为在这个session级别,alter语句也要在从库上执行,除非你对从库另有打算。| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | [root@ssd-34 sysbench]# pt-online-schema-change --user=user --password=password --host=10.0.201.34--alter "ADD COLUMN f_id int default 0" D=confluence,t=sbtest3 --print --execute No slaves found.See --recursion-method if host ssd-34 has slaves. Not checking slave lag because no slaves were found and --check-slave-lag was not specified. Operation, tries, wait: analyze_table, 10, 1 copy_rows, 10, 0.25 create_triggers, 10, 1 drop_triggers, 10, 1 swap_tables, 10, 1 update_foreign_keys, 10, 1 Altering `confluence`.`sbtest3`... Creating new table... ==> 创建新表 CREATE TABLE `confluence`.`_sbtest3_new` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT "0", `c` char(120) COLLATE utf8_bin NOT NULL DEFAULT "", `pad` char(60) COLLATE utf8_bin NOT NULL DEFAULT "", PRIMARY KEY (`id`), KEY `k_3` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=5000001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin MAX_ROWS=1000000 Created new table confluence._sbtest3_new OK. Altering new table... ==> 使用ddl修改新表结构 ALTER TABLE `confluence`.`_sbtest3_new` ADD COLUMN f_id int default 0 Altered `confluence`.`_sbtest3_new` OK. 2016-05-24T20:54:23 Creating triggers... ==> 在旧表上创建3个触发器 CREATE TRIGGER `pt_osc_confluence_sbtest3_del` AFTER DELETE ON `confluence`.`sbtest3` FOR EACH ROW DELETE IGNORE FROM `confluence`.`_sbtest3_new` WHERE `confluence`.`_sbtest3_new`.`id` <=> OLD.`id` CREATE TRIGGER `pt_osc_confluence_sbtest3_upd` AFTER UPDATE ON `confluence`.`sbtest3` FOR EACH ROW REPLACE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`) CREATE TRIGGER `pt_osc_confluence_sbtest3_ins` AFTER INSERT ON `confluence`.`sbtest3` FOR EACH ROW REPLACE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`) 2016-05-24T20:54:23 Created triggers OK. 2016-05-24T20:54:23 Copying approximately 4485573 rows...==> 分块拷贝数据到新表 INSERT LOW_PRIORITY IGNORE INTO `confluence`.`_sbtest3_new` (`id`, `k`, `c`, `pad`) SELECT `id`, `k`, `c`, `pad` FROM `confluence`.`sbtest3` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) AND ((`id` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 44155 copy nibble*/ SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `confluence`.`sbtest3` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) ORDER BY `id` LIMIT ?, 2 /*next chunk boundary*/ Copying `confluence`.`sbtest3`:36% 00:52 remain Copying `confluence`.`sbtest3`:69% 00:26 remain 2016-05-24T20:56:01 Copied rows OK. 2016-05-24T20:56:01 Analyzing new table... 2016-05-24T20:56:01 Swapping tables...==> 交换新旧表 RENAME TABLE `confluence`.`sbtest3` TO `confluence`.`_sbtest3_old`, `confluence`.`_sbtest3_new` TO `confluence`.`sbtest3` 2016-05-24T20:56:01 Swapped original and new tables OK. 2016-05-24T20:56:01 Dropping old table...==> 删除旧表 DROP TABLE IF EXISTS `confluence`.`_sbtest3_old` 2016-05-24T20:56:02 Dropped old table `confluence`.`_sbtest3_old` OK. 2016-05-24T20:56:02 Dropping triggers... DROP TRIGGER IF EXISTS `confluence`.`pt_osc_confluence_sbtest3_del`; DROP TRIGGER IF EXISTS `confluence`.`pt_osc_confluence_sbtest3_upd`; DROP TRIGGER IF EXISTS `confluence`.`pt_osc_confluence_sbtest3_ins`; 2016-05-24T20:56:02 Dropped triggers OK. Successfully altered `confluence`.`sbtest3`. |
| 1 2 3 4 5 6 7 | pt-online-schema-change h=10.0.201.34,P=3306,u=jacky,p=xxx,D=confluence,t=sbtest3 --alter "CHANGE pad f_pad varchar(60) NOT NULL DEFAULT "" " --print --dry-run pt-online-schema-change -ujacky -p xxx -h "10.0.201.34" D=confluence,t=sbtest3 --alter "CHANGE pad f_pad varchar(60) NOT NULL DEFAULT "" " --execute |
| 1 2 3 | pt-online-schema-change --user=user --ask-pass --host=10.0.201.34 --alter "DROP KEY cid, ADD KEY idx_corpid_userid(f_corp_id,f_user_id) " D=confluence,t=sbtest3 --print --execute |
| 1 2 3 | [zx@mysql-5 ~]$ pt-online-schema-change-u user -p password -h 10.0.200.195 --alter="MODIFY COLUMN f_receivervarchar(128)NOT NULL DEFAULT "" AFTER f_user_id" --dry-run D=db_name,t=table_name The table `db_name`.`table_name` has triggers.This tool needs to create its own triggers, so the table cannot already have triggers. |
| 1 2 3 | $ pt-online-schema-change -uuser -ppassword --alter "add key id_provice(f_provice)" D=db_name,t=tb_name -h rdsxxxxxx.mysql.rds.aliyuncs.com Can"t use an undefined value as an ARRAY reference at /usr/bin/pt-online-schema-change line 7335. |
--no-version-check选项就好了,见 http://www.linuxidc.com/Linux/2016-08/134764.htm ,没深究,应该是pt去验证mysql server版本的时候从rds拿到的信息不对,导致格式出错。本文永久更新链接地址