pt-online-schema-change使用说明(未完待续)

12100阅读 1评论2013-11-26 ning_lianjie
分类:Mysql/postgreSQL

官方文档:

NAME

pt-online-schema-change
不锁表的情况下,修改表结构.该工具执行的基本流程如下:

  1. 判断各种参数
  2. 根据原表"t",创建一个名称为"_t_new"的新表
  3. 执行ALTER TABLE语句修改新表"_t_new"
  4. 创建3个触发器,名称格式为pt_osc_库名_表名_操作类型,比如
    CREATE TRIGGER `pt_osc_dba_t_del` AFTER DELETE ON `dba`.`t` FOR EACH ROW DELETE IGNORE FROM `dba`.`_t_new` WHERE `dba`.`_t_new`.`id` <=> OLD.`id`
    CREATE TRIGGER `pt_osc_dba_t_upd` AFTER UPDATE ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)
    CREATE TRIGGER `pt_osc_dba_t_ins` AFTER INSERT ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)
    
  5. 开始复制数据,比如
    INSERT LOW_PRIORITY IGNORE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) SELECT `id`, `a`, `b`, `c1` FROM `dba`.`t` LOCK IN SHARE MODE /*pt-online-schema-change 28014 copy table*/
    
  6. 复制完成后,交互原表和新表,执行RENAME命令,如 RENAME TABLE t to _t_old, _t_new to t;
  7. 删除老表,_t_old
  8. 删除触发器
  9. 修改完成

SYNOPSIS

Usage

pt-online-schema-change [OPTIONS] DSN
  1. 在不阻塞读写的情况下,修改表结构.在DSN中指定库和名.
  2. 在认真读文档之前,不要使用这个工具,并且操作前要做好备份.

Example

  1. 给sakila.actor添加一列:
    pt-online-schema-change --alter "ADD COLUMN c1 INT" D=sakila,t=actor
    
    相当于执行如下SQL:
    use sakila;
    alter table actor add column c1 INT;
    
  2. 把sakila.actor改为InnoDB引擎.如果它已经是一个InnoDB引擎的表,相当于在不阻塞读写的情况下,执行了OPTIMIZE TABLE操作.
    pt-online-schema-change --alter "ENGINE=InnoDB" D=sakila,t=actor
    
    相当于执行如下SQL:
    use sakila;
    alter table actor engine=innodb;

RISKS

Percona工具集在测试和实际使用中,都证明它是成熟的,但是,所有的操作数据的工具对可能对系统或者数据库造成风险.在使用这个工具之前,请:

DESCRIPTION

pt-online-schema-change 模仿MySQL修改内部表的方法,不过它会复制你想改变的表.也就是说,原始的表不会被锁,客户端可以持续的读写数据.

pt-online-schema-change
根据原表创建一个新的空表,并按需求修改.然后从原表向新表复制数据.当复制完成时,挪走原始表,并用新表代替.默认情况下,会把原表删除.

数据复制过程是一小块一小块的复制,也可以通过--chunk-time参数调整块的大小.这个参数的工作原理与pt-table-check中的类似.

在复制数据过程中,任何数据的改动都会在新表中体现出来,因为这个工具会在原表中创建触发器,在原表更新的数据,在新表也进行了更新.如果在原表已经定义过触发器,那么这个工具就不能工作了.

当工具把数据全部复制到新表后,它会自动执行RENAME TABLE操作,同时修改原表和新表.这个操作完成后,会自动删除原表.

外键会让工具操作起来更负载并且会增加额外的风险.有外键约束的情况下,自动重命名原表会让外键失效.所以,在表结构修改完成后,该工具必须重新更新外键.这个工具有两种方法可以完成这个操作.你可以看文档的--alter-foreign-keys-method参数.
外键也会导致一些副作用,修改完成的表会出现相同的外键索引(除非在ALTER语句中指定了不同的外键),但是这些外键的名字不会一样,避免冲突.

为了安全,这个工具只有在指定--execute参数时才会修改表.默认情况下,是不加--execute参数的.该工具支持多种措施,防止产生高负载或其他问题,比如,自动检查从库,连接从库,可能会使用下列方法进行安全检查:

Percona XtraDB Cluster

pt-online-schema-change 可以在Percona XtraDB Cluster (PXC) 5.5.28-23.7 或者更高的版本使用.但是它有两个限制:必须是InnoDB引擎的表,并且wsrep_OSU_method 要设置为TOI,否则会报错退出.

OUTPUT

该工具是动态打印信息到STDOUT(标准输出)的,因此可以看到它正在做的事情.在数据复制阶段,它把进度信息打印到STDERR(标准错误输出)中.可以指定--print参数,得到更多的信息.
如果--statistics被指定,在最后完成时,会生成一个如下的报告:

# Event  Count
# ====== =====
# INSERT     1

OPTIONS

参数 --dry-run 和 --execute 是互斥的.
该工具接收额外的命名行参数.更多信息请参考”SYNOPSIS"和usage部分.

上一篇:Percona XtraDB Cluster Limitations
下一篇:pt-archiver

文章评论