pt-osc在线工具的使用

Posted yufenchi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pt-osc在线工具的使用相关的知识,希望对你有一定的参考价值。

一.pt-osc工作原理

1.创建一个和源表一样表结构的新表
2.空表执行表结构修改
3.在源表创建三个触发器分别对应insert、update、delete操作
4.copy数据到新表
5.将源表改名,并将新表改成源表名
6.删除源表
7.删除trigger

二.pt-osc 工具的限制

1.源表不能有触发器存在
不是不能有任何触发器,只是不能有针对insert、update、delete的触发器存在,因为一个表上不能有两个相同类型的触发器
2.源表必须要有主键
3.源表有外键,必须使用--alter-foreign-keys-method 指定特定的值

三.注意事项

1.如果是add column并且定义了not null,那么必须指定default值,否则会失败

四.报错原因

没有主键,报错如下

The new table `test`.`_t1_new` does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.
Please check you have at least one UNIQUE and NOT NULLABLE index.

没有权限报错如下

Cannot connect to mysql: DBI connect(‘test;host=10.0.1.51;mysql_read_default_group=client‘,‘root‘,...) failed: Access denied for user ‘root‘@‘10.0.1.51‘ (using password: YES) at /usr/bin/pt-online-schema-change line 2345.

存在触发器,源表不能存在针对(insert、update、delete)触发器

The table `db_name`.`table_name` has triggers.  This tool needs to create its own triggers, so the table cannot already have triggers.

五.参数说明

--host=xxx --user=xxx --password=xxx

连接实例信息,缩写-h xxx -u xxx -p xxx,密码可以使用参数--ask-pass 手动输入

D=db_name,t=table_name

指定要ddl的数据库名和表名

--dry-run

创建和修改新表,但不会创建触发器、复制数据、和替换原表。并不真正执行,可以看到生成的执行语句,了解其执行步骤与细节,和--print配合最佳

--execute

修改表,则指定该参数。真正执行alter。–dry-run与–execute必须指定一个,二者相互排斥

----[no]check-alter

解析并检查alter指定的命令:
在以前的版本,使用CHANGE COLUMN命令会导致数据丢失,现在的版本虽然改进,但是在执行前,还应该使用 --dry-run 和 --print 查看一下详细的操作情况.

六.模拟演示

环境准备

db01 [test]>create database yufenchi charset utf8mb4;
db01 [test]>use yufenchi
db01 [yufenchi]>create table t1(id int primary key,name varchar(10),age tinyint);
b01 [yufenchi]>insert into t1 values(1,‘zs‘,18),(2,‘lisi‘,19),(3,‘wangwu‘,20);
db01 [yufenchi]>select * from t1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | zs     |   18 |
|  2 | lisi   |   19 |
|  3 | wangwu |   20 |
+----+--------+------+

增加一列qq

[root@db01 ~]# pt-online-schema-change --host=10.0.1.51 -uroot -p123 --alter "add column qq int(20) default 0" D=yufenchi,t=t1  --execute --no-check-alter
登录数据库并检查
db01 [yufenchi]>select * from t1;
+----+--------+------+------+
| id | name   | age  | qq   |
+----+--------+------+------+
|  1 | zs     |   18 |    0 |
|  2 | lisi   |   19 |    0 |
|  3 | wangwu |   20 |    0 |
+----+--------+------+------+

增加一列weixin(如果加入的列中定义了not null必须要指定default值)

[root@db01 ~]# pt-online-schema-change --host=10.0.1.51 -uroot -p123 --alter "add column weixin int(20) not null default 0" D=yufenchi,t=t1 --execute --print --no-check-alter
db01 [yufenchi]>select * from t1;
+----+--------+------+------+--------+
| id | name   | age  | qq   | weixin |
+----+--------+------+------+--------+
|  1 | zs     |   18 |    0 |      0 |
|  2 | lisi   |   19 |    0 |      0 |
|  3 | wangwu |   20 |    0 |      0 |
+----+--------+------+------+--------+

修改列name为varchar(20)

[root@db01 ~]# pt-online-schema-change --host=10.0.1.51 -uroot --ask-pass --alter "modify name varchar(20)  default 0" D=yufenchi,t=t1 --execute --print --no-check-alter
db01 [yufenchi]>show create table t1;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                      |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT ‘0‘,
  `age` tinyint(4) DEFAULT NULL,
  `qq` int(20) DEFAULT ‘0‘,
  `weixin` int(20) NOT NULL DEFAULT ‘0‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |

修改列名name为sname

[root@db01 ~]# pt-online-schema-change --host=10.0.1.51 -uroot --ask-pass --alter "change name sname varchar(20)  default 0" D=yufenchi,t=t1 --execute  --no-check-alter
db01 [yufenchi]>desc t1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| sname  | varchar(20) | YES  |     | 0       |       |
| age    | tinyint(4)  | YES  |     | NULL    |       |
| qq     | int(20)     | YES  |     | 0       |       |
| weixin | int(20)     | NO   |     | 0       |       |
+--------+-------------+------+-----+---------+-------+

为列sname添加索引

[root@db01 ~]# pt-online-schema-change --host=10.0.1.51 -uroot -p123 --alter "add index idx_sna(sname)" D=yufenchi,t=t1 --execute --no-check-alter
db01 [yufenchi]>show index from t1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t1    |          0 | PRIMARY  |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
| t1    |          1 | idx_sna  |            1 | sname       | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--

以上是关于pt-osc在线工具的使用的主要内容,如果未能解决你的问题,请参考以下文章

MGR使用pt-osc修改字段长度

MySQL在线修改表结构pt-osc

MySQL--pt-osc工具学习

pt-osc使用方法

MySQL Percona Toolkit--pt-osc与online DDL选择

pt-osc全解pt-online-schema-change