Mysql之pt-online-schema-change在线更新大表加索引

原创 2016年05月30日 15:06:28

由于目前生产环境中大表比较多,这里选择了一个600M的小表做一次在线测试。

环境:Ubuntu 12.04

mysql版本 :5.6.29-log

表引擎:Innodb


一、pt-online-schema-change介绍

      percona 公司提供的一款在线更新表的工具,更新过程不会锁表,也就是说操作alter的过程不会阻塞写和读取。即使如此,建议大家操作前还是先做好表备份。(备份工具推荐mydumper,这里不细说)


参数说明:
pt-online-schema-change [OPTIONS] DSN
options 可以自行查看 help,DNS 为你要操作的数据库表。这里有两个参数需要介绍一下:
–dry-run
这个参数不建立触发器,不拷贝数据,也不会替换原表。只是创建和更改新表。
–execute
这个参数的作用和前面工作原理的介绍的一样,会建立触发器,来保证最新变更的数据会影响至新表。注意:如果不加这个参数,这个工具会在执行一些检查后退出。

:操作的表必须有主键;否则报错:Cannot chunk the original table `houyi`.`ga`: There is no good index and the table is oversized. at ./pt-online-schema-change line 5353.

二、工作原理

1. 创建需要执行alter操作的原表的一个临时表,然后在临时表中更改表结构。

2. 在原表中创建触发器(3个)三个触发器分别对应insert,update,delete操作

3. 从原表拷贝数据到临时表,拷贝过程中在原表进行的写操作都会更新到新建的临时表。

4. Rename 原表到old表中,在把临时表Rename为原表,最后将原表删除(可能不删除),将原表上所创建的触发器删除。


三、正式测试,在线加索引

表:

 Rows: 1214314
 Avg_row_length: 214
 Data_length: 259866624
 Max_data_length: 0
 Index_length: 719224832

root@xxxx:/data/xxx# pt-online-schema-change -h xx.xx.xx.xx  -P 3307 -u wulz -p lynn --charset=utf8 --alter='ADD INDEX `create_time` (`create_time`, `location`, `version`) USING BTREE' --execute D=lynn_test,t=test_table
错误:Cannot connect to MySQL: Cannot connect to MySQL because the Perl DBI module is not installed or not found.  Run 'perl -MDBI' to see the directories that Perl searches for DBI.  If DBI is not installed, try:
  Debian/Ubuntu  apt-get install libdbi-perl
  RHEL/CentOS    yum install perl-DBI
  OpenSolaris    pkg install pkg:/SUNWpmdbi

错误1的原因是 该工具也是perl语言写的,在连接mysql时候所依赖的库不存在。运行
apt-get install libdbi-perl

再次运行:

  Cannot connect to MySQL: Cannot connect to MySQL because the Perl DBD::mysql module is not installed or not found.  Run 'perl -MDBD::mysql' to see the directories that Perl searches for DBD::mysql.  If DBD::mysql is not installed, try:
  Debian/Ubuntu  apt-get install libdbd-mysql-perl
  RHEL/CentOS    yum install perl-DBD-MySQL
  OpenSolaris    pgk install pkg:/SUNWapu13dbd-mysql

错误2:仍然缺少依赖库,按提示安装,再次运行;

DBD::mysql::db selectall_arrayref failed: Access denied; you need (at least one of) the<span style="color:#ff0000;"> REPLICATION SLAVE privilege(s) </span>for this operation [for Statement "SHOW SLAVE HOSTS"] at /usr/local/bin/pt-online-schema-change line 4260.

这次报错提示的是 权限问题了。由于我给的我测试连接用户给的是指定库的 all privileges的权限。但是根据提示来看,少了个复制权限(show slave hosts)。

grant replication slave ON *.* TO 'wulz'@'xx.xx.xx.xx';

这些工作完成后都准备就绪了;

执行:

No slaves found.  See --recursion-method if host s0137-gz 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 `lynn_test`.`test_table`...
Creating new table...
Created new table lynn_test._test_table_new OK.
Altering new table...
Altered `lynn_test`.`_test_table_new` OK.
2016-05-30T14:31:26 Creating triggers...
2016-05-30T14:31:27 Created triggers OK.
2016-05-30T14:31:27 Copying approximately 1119876 rows...
Copying `lynn_test`.`test_table`:  64% 00:16 remain
2016-05-30T14:32:21 Copied rows OK.
2016-05-30T14:32:21 Analyzing new table...
2016-05-30T14:32:21 Swapping tables...
2016-05-30T14:32:21 Swapped original and new tables OK.
2016-05-30T14:32:21 Dropping old table...
2016-05-30T14:32:21 Dropped old table `lynn_test`.`_<span style="font-family: Arial, Helvetica, sans-serif;">test_table</span><span style="font-family: Arial, Helvetica, sans-serif;">_old` OK.</span>
2016-05-30T14:32:21 Dropping triggers...
2016-05-30T14:32:22 Dropped triggers OK.
Successfully altered `lynn_test`.`test_table`.

操作过程:


新表生成;

完成后,最终只剩下一张表;



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mysql工具percona-toolkit之安装

MySQL数据库是轻量级、开源数据库的佼佼者,其功能和管理,健壮性与Oracle相比还是有相当的差距。因此有很多功能强大第三方的衍生产品, 如percona-toolkit,XtraBackup等等。...

mysql千万级大表在线加索引

 create table tmp like paper_author; ALTER TABLE tmp ADD INDEX ( `PaperID` ) insert into tmp(o...

pt-online-schema-change遇到的错误

pt-online-schema-change工作机制 1) 如果存在外键,根据alter-foreign-keys-method参数值,检测外键相关的表,针对相应的设置进行处理; 2) 创建一...

pt-online-schema-change使用说明、限制与比较

如果正在看这篇文章,相信你已经知道自己的需求了。在 mysql 5.5 版本以前,修改表结构如添加索引、修改列,需要锁表,期间不能写入,对于大表这简直是灾难。从5.5特别是5.6里,情况有了好转,支持...

利用pt-online-schema-change工具在线ddl操作

一.用法介绍 pt-online-schema-change [OPTIONS] DSN options 可以自行查看 help,DNS 为你要操作的数据库和表。这里有两个参数需要介绍一下: --dr...

Mysql5.6 借助工具pt-online-schema-change在线DDL(还有加索引)

MySQL在线ddl会阻塞所有insert,可以使用percona-toolkit中的pt-online-schema-change工具来对表进行online。 D=tpcctest 数据库名 t=c...

percona-toolkit 之 【pt-online-schema-change】说明

背景:       MySQL 大字段的DDL操作:加减字段、索引、修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响。在5.1之后随着Plugin Innodb的...

mysql 5.6在线DDL建索引测试

基本信息: mysql版本: (product)root@localhost [(none)]> select @@version; +------------+ | @@version  | +--...

pt-online-schema-change使用中的不当,引起的数据库不可写入问题

战战兢兢,如履薄冰这次不是pt-online-schema-change的锅,主要责任在我。背景5000万行表加字段操作,数据量30G,有主键,dba是一般的操作账号,除delete,drop,gra...

mysql大数据建立索引 1000W

重新添加索引,对于1000W级的数据,按常规的方式来操作,时间上是一个很大的问题。而且对于1000W级的数据,本人建议对此表进行分表优化。如果非要添加索引操作,方法倒是有的。 1.创建一个新的表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mysql之pt-online-schema-change在线更新大表加索引
举报原因:
原因补充:

(最多只允许输入30个字)