pt-online-schema-change工具简介

1、工具简介

pt-online-schema-change是percona提供的一个mysql在线修改表结构的工具

2、使用场景

当需要修改线上数据库中某个表的表结构时,发现这个表的数据量比较大,如果使用alter table语句的话可能会阻塞较长的时间,那么可以考虑使用pt-online-schema-change在线修改表结构,而不用担心阻塞应用

3、工作原理

对于要修改表结构的表,pt-online-schema-change首先会创建一个该表的拷贝,这里只拷贝表结构而不涉及到数据,然后对这个拷贝来修改表结构,由于这个临时表没有数据,且没有应用访问,因此修改会很快且不会影响业务,临时表表结构修改完成后,会将原来的表中的数据拷贝到修改后的临时表中。那么如何保证在开始拷贝数据到数据拷贝完成后这个时间段中原表数据的增量也拷贝到临时表中去呢?pt-online-schema-change通过在原表上创建触发器来实现原表数据的增量导入到临时表中去。当拷贝完成后,通过原子性的rename table操作完成临时表和原表的切换。如下:

原表:test

假设临时表为test_new

原子性的rename table操作:mysql> rename table test to test_old,test_new to test;

当完成原子性表切换之后,pt-online-schema-change会删除原来的表,此时这张表已经没有应用访问了,所以delete对应用是没有影响的

4、使用限制

a、pt-online-schema-change操作的表需要有主键或者是唯一性索引

b、当修改的表中主键是其他表的外键时,默认情况下会失败,需要使用--alter-foreign-keys-method选项来处理

5、应用实例

命令格式如:

pt-online-schema-change -uroot -p123456 --alter=‘modify name varchar(20) ‘ --execute D=mydb,t=pt_test

## -u 用户名

## -p 密码

## --alter 修改的内容

## --execute 只有加了这个这条命令才会真正的执行

## D 数据库名

## t 表名

## 有pt_test表,结构如下
mysql> show create table pt_test\G
*************************** 1. row ***************************
       Table: pt_test
Create Table: CREATE TABLE `pt_test` (
  `id` int(11) DEFAULT NULL,
  `name` char(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

## 将pt_test表的name字段由char修改为varchar
[[email protected] opt]# pt-online-schema-change -uroot -p123456 --alter=‘modify name varchar(20) ‘ --execute D=mydb,t=pt_test
No slaves found.  See --recursion-method if host dcmaster01.dba.com has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `mydb`.`pt_test`...
Creating new table...
Created new table mydb._pt_test_new OK.
Altering new table...
Altered `mydb`.`_pt_test_new` OK.
2015-04-15T16:17:04 Creating triggers...
2015-04-15T16:17:04 Created triggers OK.
2015-04-15T16:17:04 Copying approximately 1 rows...
2015-04-15T16:17:04 Copied rows OK.
2015-04-15T16:17:04 Swapping tables...
2015-04-15T16:17:04 Swapped original and new tables OK.
2015-04-15T16:17:04 Dropping old table...
2015-04-15T16:17:04 Dropped old table `mydb`.`_pt_test_old` OK.
2015-04-15T16:17:04 Dropping triggers...
2015-04-15T16:17:04 Dropped triggers OK.
Successfully altered `mydb`.`pt_test`.

## 再次查看pt_test的表结构
mysql> show create table pt_test\G
*************************** 1. row ***************************
       Table: pt_test
Create Table: CREATE TABLE `pt_test` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

针对外键的处理,需要加--alter-foreign-keys-method选项

## 表dept结构
mysql> show create table dept\G
*************************** 1. row ***************************
       Table: dept
Create Table: CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL,
  `dname` char(20) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

## 表emp结构
mysql> show create table emp\G
*************************** 1. row ***************************
       Table: emp
Create Table: CREATE TABLE `emp` (
  `empno` int(11) NOT NULL,
  `ename` char(20) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `_emp_ibfk_1` (`deptno`),
  CONSTRAINT `_emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

## 修改表dept的dname字段的类型为varchar
[[email protected] opt]# pt-online-schema-change -uroot -p123456 --alter=‘modify dname varchar(20) ‘ --alter-foreign-keys-method rebuild_constraints --execute D=mydb,t=dept 
No slaves found.  See --recursion-method if host dcmaster01.dba.com has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Child tables:
  `mydb`.`emp` (approx. 3 rows)
Will use the rebuild_constraints method to update foreign keys.
Altering `mydb`.`dept`...
Creating new table...
Created new table mydb._dept_new OK.
Altering new table...
Altered `mydb`.`_dept_new` OK.
2015-04-15T16:27:14 Creating triggers...
2015-04-15T16:27:14 Created triggers OK.
2015-04-15T16:27:14 Copying approximately 3 rows...
2015-04-15T16:27:14 Copied rows OK.
2015-04-15T16:27:14 Swapping tables...
2015-04-15T16:27:14 Swapped original and new tables OK.
2015-04-15T16:27:14 Rebuilding foreign key constraints...
2015-04-15T16:27:14 Rebuilt foreign key constraints OK.
2015-04-15T16:27:14 Dropping old table...
2015-04-15T16:27:14 Dropped old table `mydb`.`_dept_old` OK.
2015-04-15T16:27:14 Dropping triggers...
2015-04-15T16:27:14 Dropped triggers OK.
Successfully altered `mydb`.`dept`.

## 再次查看dept和emp的表结构
mysql> show create table dept\G
*************************** 1. row ***************************
       Table: dept
Create Table: CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL,
  `dname` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table emp\G
*************************** 1. row ***************************
       Table: emp
Create Table: CREATE TABLE `emp` (
  `empno` int(11) NOT NULL,
  `ename` char(20) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `__emp_ibfk_1` (`deptno`),
  CONSTRAINT `__emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

--alter-foreign-keys-method选项的取值有4种,分别为:

a、auto

b、rebuild_constraints

c、drop_swap

d、none

rebuild_constraints,就是先drop外键约束,最后再建回来,percona官方建议使用这种方式。

drop_swap,是通过关闭外键约束的检查(FOREIGN_KEY_CHECKS=0),在临时表重命名成原表之前删除掉原表,这种方式速度快,无阻塞,但是不安全。对数据完整性有高要求的慎重。

auto,就是会根据实际情况自动的选择使用rebuild_constraints还是drop_swap。

none,使用这种方式可以完成表结构的修改,但是子表的外键约束会失效,需要dba手动来处理。

时间: 2024-10-09 15:02:55

pt-online-schema-change工具简介的相关文章

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

htop,glances和dstat工具简介

htop,glances和dstat工具简介 简介:htop,glances以及dstat是三个性能检测工具 一.htop命令: 语法:htop [options] 如图,我们键入htop后就会出现这个界面 左上部分的1,2,3,4表示我的机器是四核的,显示他们的利用情况.还有内存和交换空间使用情况.中间大部分显示是进程的相关情况.右上部分显示当前的任务数,有多少是在运行,以及负载使用情况. 1.交互式命令(直接在终端输入htop后,进入交互式界面,以下的选项都是指按键操作): (1)u: 过滤

rman备份工具简介

RMAN工具简介: 备份的文件: 数据文件 归档日志 控制文件(当前控制文件) spfile 自动管理备份相关元数据 文件名称 完成备份的scn 以数据块为单位,只备份使用过的数据块(物理层面判断是否使用) 备份时查询块状态,备份瞬间有修改块 等待块使用完成再备份 因此不会出现块分离 对备份出来的文件进行压缩 自身压缩+支持压缩参数 加参数压缩 5:1 自动检测数据块是否损坏 块损坏,不对其备份 支持增量备份 使用rman前提条件: 正确的环境变量 正确的实例名 sys用户操作(推荐) 监听不支

55种开源数据可视化工具简介

55种开源数据可视化工具简介 雪姬 2015-04-21 11:47:56 数据可视化 评论(2)   数据时代数据可视化成为理解和表达数据的有效甚至是唯一的手段. 一共56个,盘点最实用的大数据可视化分析工具 工欲善其事必先利其器,本文对55个流行的数据可视化工具开源协议,主页,文档,案例等资源的进行简单介绍,其中包括著名的D3.js,R,Gephi,Raphaël,Processing.js,Tableau Public,Google Chart Tools,Arbor.js等,资料来源ht

源代码管理工具简介

#一. 源代码管理工具简介* 有必要给大家的介绍一下,如果不说的话,大家都不知道它是干嘛的,首先我们要逐渐的建立器一个感受,对源代码管理工具的一个感觉. * 为什么会出现源代码管理工具? * 首先它得有一定的功能,对不对?任何的发明创造,都是为了解决人类的问题的,对不对?甚至一些语法规则的发明也是为了解决一定的问题的,对不对? * 我随便举个例子啊,举个简单的例子同学们理解一下,比如说像以前我们为了存储一个整形数据,是不是发明了一个叫int 类型的.后来发现不太靠谱,因为他只能存一个整数,所以就

linux下面的性能分析工具简介

iostat 命令详解 iostat用于输出cpu和磁盘I/O相关的统计信息.命令格式: Usage: iostat [ options ] [ <interval> [ <count> ] ] Options are: [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | ... } [ <devi

C语言工具简介

1 自动化测试: 测试代码重要性不言而喻,通过测试的自动化,生活会变得很轻松.几乎所有的程序员也都在使用自动化测试.C语言的测试框架也很多, 比如AceUnit:http://aceunit.sourceforge.net/projects/aceunit 如果你写的是命令行工具,用的是Unix命令行,可以使用shunit2工具,它允许创建shell脚本来测试脚本和命令. http://code.google.com/p/shunit2 2 GCC的优化 gcc可以自动进行很多优化,默认情况下是

(转)Synopsys工具简介

DC Ultra--Design Compiler的最高版本 在Synopsys软件中完整的综合方案的核心是DC UltraTM,对所有设计而言它也是最好级别的综合平台.DC Ultra添加了全面的数据通路和时序优化技术,并通过工业界的反复证明.DC Ultra具有独特的优化技术,能满足今天设计的各种挑战.DC Ultra提供快速的具有先进水平的数据通路优化技术,能建立快速关键路径时序.另外,DC Ultra采用后布局和优化布线技术,易于较快达到时序收敛.DC Ultra已在工业界确立了领先地位

sysstat工具简介

sysstat工具简介里简单对sysstat工具包进行了一下说明,这篇日志衔接上一篇.主要说明其所包含的工具sadc.sdaf.sar.iostat.mpstat的用法. 一.sadc工具 sadc 位于 /usr/lib/sa目录中(64位系统在:/usr/lib64/sa目录中),如果你没有设置可执行路径,要用绝对路径来运行.sdac准备的说只是一个搜集写入工具,并不直接回显于屏幕上.sadc 是把数据写在一个二进制的文件中,如果想查看数据内容,需要用sadf工具来显示. # /usr/li