pt-online-schema-change

功能介绍:

        功能为在alter操作更改表结构的时候不用锁定表,也就是说执行alter的时候不会阻塞写和读取操作。

注意:执行这个工具的时候必须做好备份,操作之前最好详细读一下官方文档 pt-online-schema-change

工作原理是 : 创建一个新表,在新表上执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据copy完成以后就会将原表移走,用新表代替原表,默认动作是将原表drop掉。在copy数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器,触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作了!!

用法介绍:

pt-online-schema-change [OPTIONS] DSN

    options可以自行查看help,DNS为你要操作的数据库和表。


注意事项:

    1. 在参数配置时,注意是否需要--drop-new-table、--drop-old-table

    2. 在添加了--check-slave-lag时候,配置--max-lag,延迟低于--max-lag的时候才继续,多个slave可以使用--recursion-method 参数:

pt-online-schema-change help参数

    指定--recursion-method="dsn=D=database,t=dsns"

CREATETABLE`dsns`(

    `id`int(11) NOT NULL AUTO_INCREMENT,

    `parent_id`int(11) DEFAULT NULL,

    `dsn`varchar(255) NOT NULL,

    PRIMARYKEY(`id`)  );

INSERT INTO dsns(parent_id , dsn) VALUES (1, 'h=10.10.1.16,u=*,p=*,P=3306');

INSERT INTO dsns( parent_id , dsn) VALUES (1, 'h=10.10.1.17,u=*,p=*,P=3306');

3. 例如需要更高联合主键为一个id自增主键时,应在一个alter中进行如下操作:

        a. 删除复合主键定义

        b. 添加新的自增主键

        c. 原复合主键字段,修改成唯一索引

        在c中,修改成唯一索引的原因:

            percona手册里有两个地方对修改主键进行了特殊注解:

–alter

    A notable exception is when a PRIMARY KEY or UNIQUE INDEX is being created from existing columns as part of the ALTER clause; in that case it will use these column(s) for the DELETE trigger.

–[no]check-alter

    DROP PRIMARY KEY

    If –alter contain DROP PRIMARY KEY (case- and space-insensitive), a warning is printed and the tool exits unless –dry-run is specified. Altering the primary key can be dangerous, but the tool can handle it. The tool’s triggers, particularly the DELETE trigger, are most affected by altering the primary key because the tool prefers to use the primary key for its triggers. You should first run the tool with –dry-run and –print and verify that the triggers are correct.

    pt-online-schema-change会在原表t1上创建 AFTER DELETE/UPDATE/INSERT 三个触发器,而对于主键的操作,会影响delete触发器,因为新表中没有了yuan

CREATETRIGGER`pt_osc_confluence_sbtest3_del`AFTERDELETEON`confluence`.`sbtest3`FOREACHROWDELETEIGNOREFROM`confluence`.`_sbtest3_new`

WHERE`confluence`.`_sbtest3_new`.`id`<=>OLD.`id`AND`confluence`.`_sbtest3_new`.`k`<=>OLD.`k`

注:sbtest3表上以(id,k)作为复合主键

        所以,如果id或k列上没有索引,这个删除的代价非常高,所以一定要同时添加复合(唯一)索引 (id,k) 。如果使用pt-osc去修改删除主键,务必同时添加原主键为 UNIQUE KEY,否则很有可能导致性能问题:

    而对于INSERT,UPDATE的触发器,依然是 REPLACE INTO语法,因为它采用的是先插入,如果违反主键或唯一约束,则根据主键或意义约束删除这条数据,再执行插入。(但是注意你不能依赖于新表的主键递增,因为如果原表有update,新表就会先插入这一条,导致id与原表记录所在顺序不一样)

$ pt-online-schema-change --user=user--password=userpwd --host=10.10.10.34  --alter "DROP PRIMARY KEY,add column pk int auto_increment primary key,add unique key uk_id_k(id,k)"  D=confluence,t=sbtest3--print --dry-run

        --alter contains 'DROP PRIMARY KEY'.  Dropping and altering the primary key can be dangerous,

        especially if the original table does not have other unique indexes.  ==>注意 dry-run的输出

        ALTERTABLE`confluence`.`_sbtest3_new`DROPPRIMARYKEY,addcolumnpkintauto_increment primarykey,adduniquekeyuk_id_k(id,k)

        Altered`confluence`.`_sbtest3_new`OK.

        UsingoriginaltableindexPRIMARYfortheDELETEtriggerinsteadofnewtableindexPRIMARY because ==> 使用原表主键值判断

        the new table index uses column pk which does not exist in the original table.

        CREATETRIGGER`pt_osc_confluence_sbtest3_del`AFTERDELETEON`confluence`.`sbtest3`FOREACHROWDELETEIGNOREFROM`confluence`.`_sbtest3_new`

        WHERE`confluence`.`_sbtest3_new`.`id`<=>OLD.`id`AND`confluence`.`_sbtest3_new`.`k`<=>OLD.`k`

4. 主键有0值时,需要注意pt-online-schema-change会设置 SQL_MODE中NO_AUTO_VALUE_ON_ZERO!!!

LP #1709650: pt-online-schema-change eating portion of a table


使用示例:

范例1:在线更改表的的引擎,这个尤其在整理innodb表的时候非常有用,示例如下:

        pt-online-schema-change --user=root --password=wang@123 --host=localhost --lock-wait-time=120 --alter="ENGINE=InnoDB" D=test,t=oss_pvinfo2 --execute 

从下面的日志中可以看出它的执行过程: 

      Altering

`test`.`oss_pvinfo2`... 

      Creating new

table... 

      Created new table

test._oss_pvinfo2_new OK. 

      Altering new

table... 

      Altered

`test`.`_oss_pvinfo2_new` OK. 

      Creating triggers...

Created triggers OK. 

      Copying approximately

995696 rows... 

      Copied

rows OK.

      Swapping

tables... 

      Swapped

original and new tables OK. 

      Dropping

old table... Dropped old table `test`.`_oss_pvinfo2_old` OK. 

      Dropping

triggers... Dropped triggers OK. 

Successfully

altered `test`.`oss_pvinfo2`. 


相关报错:

1. 在对大表进行结构变更时,报错退出:

pt-online-schema-change 3.0.4

MySQL 5.7.17

执行语句为:

pt-online-schema-change --alter "add column addr varchar(200)" --print --charset utf8  --chunk-size=50000 --max-load Threads_running=100 --recurse=1 --alter-foreign-keys-method=none --force --execute --statistics --max-lag 3.000000 --noversion-check --recursion-method=processlist --progress percentage,1 D=osc,t=test

报错信息如下:

......

Copying `osc`.`test`: 34% 02:05:40 remain

# Exiting on SIGHUP.

Not dropping triggers because the tool was interrupted.  To drop the triggers, execute:

DROP TRIGGER IF EXISTS `osc`.`pt_osc_osc_test_del`

DROP TRIGGER IF EXISTS `osc`.` pt_osc_osc_test_upd`

DROP TRIGGER IF EXISTS `osc`.` pt_osc_osc_test_ins`

Not dropping the new table `osc`.`_test_new` because the tool was interrupted.  To drop the new table, execute:

DROP TABLE IF EXISTS `osc`.`_test_new`;

由于没有具体的报错信息,只有一个:# Exiting on SIGHUP.

猜测可能是由于资源不够导致的,因为毕竟都已经执行到了:Copying `osc`.`test`: 34% 02:05:40 remain

---->所以调整Threads_running=50,再次进行测试,没有再出现这个问题,done!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容