online ddl 工具之pt-online-schema-change封装

online ddl 工具之pt-online-schema-change封装

一、原理

目前InnoDB引擎是通过以下步骤来进行DDL的:

1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)

3 执行insert into tmp_table select * from original_table

4 rename original_table和tmp_table,最后drop original_table

5 释放 write lock。

我们可以看见在InnoDB执行DDL的时候,原表是只能读不能写的。

pt-online-schema-change工作原理:

如果表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行。

1 创建一个和你要执行 alter 操作的表一样的空表结构。

2 执行表结构修改,然后从原表中的数据到copy到 表结构修改后的表,

3 在原表上创建触发器将 copy 数据的过程中,在原表的更新操作 更新到新表.

注意:如果表中已经定义了触发器这个工具就不能工作了。

4 copy 完成以后,用rename table 新表代替原表,默认删除原表。

二、依赖

1、操作的表必须有主键。

2、不能rename或者change否则会丢失当前列数据。

3、添加字段时只要有not null 就要加default ‘’默认值 否则会报错

三、mysqlha_osc.sh使用方法

[[email protected] liding]# ./mysqlha_osc.sh

help:

Please check your input!!!!

options:
-P port
-D databases name
-T type 1=--dry-run 2=--execute 
-S Please input sql 
Can not enter change and rename because Can cause changes to fail
if values not null Time must be added default ‘0‘

内部已经将rename|change 禁用

mysqlha_osc.sh -P 3306 -D test -T 2 -S "alter table test add uname varchar(20)  "

P:port。

D:database name。

T:两个参数 1=--dry-run  2=–execute。

S:sql语句,和数据库正常语法一样。

#!/bin/bash

# Author: [email protected]

# Date: 2016-04-27

# helpfunc shows the help info

function helpfunc(){

echo

echo "Please check your input!!!!"

echo "options:"

echo " -P      port"

echo " -D      databases name"

echo " -T      type 1=--dry-run    2=--execute "

echo " -S      Please  input sql "

echo "        Can not enter change and rename because Can cause changes to fail"

echo "if values   not null Time must be added default ‘0‘"

}

############################################

#get options in command line, cannot be palced in a function

if [ $# -lt 1 ] ;

then

helpfunc

exit 1

else

while getopts "P:D:T:S:s:" Option

do

case $Option in

P) port=$OPTARG;;

D) database=$OPTARG;;

T) type=$OPTARG;;

S) sql=$OPTARG;;

*) helpfunc; exit 1; ;;

esac

done

fi

check_user()

{

echo "the user is now $person, checkout to ‘root‘ to continue"

}

check_running()

{

run=`netstat -antp|grep mysql|grep $port`

if [ -z "$run" ]; then

echo "mysql port $port is not running!"

exit -1

fi

}

function main(){

check_user

check_running

sock=/tmp/mysql"$port".sock

. /etc/dbbin/sh_lib/config.sh "/etc/dbbin/conf/mysql.cfg"

admin_user=""#自己定义

admin_pass=`getConfig "mysql" $admin_user`#自己定义

tname=`echo $sql|awk  ‘{print $3}‘`

SQL=`echo $sql|awk -F"$tname" ‘{print $2}‘`

if  echo $SQL | egrep -w "rename|change" ; then

helpfunc;

exit 1

else

if [ $type = 1 ] ;then

/usr/bin/pt-online-schema-change --user $admin_user --password  $admin_pass --port $port --socket $sock --alter "$SQL" D=$database,t=$tname --dry-run --critical-load="Threads_running=200"

elif [ $type = 2 ] ;then

/usr/bin/pt-online-schema-change --user $admin_user --password  $admin_pass --port $port --socket $sock --alter "$SQL" D=$database,t=$tname --execute --critical-load="Threads_running=200"

else

helpfunc;

exit 1

fi

fi

}

###############################

main

时间: 2024-08-18 07:43:19

online ddl 工具之pt-online-schema-change封装的相关文章

gh-ost —— GitHub Online DDL 工具使用详解

目录 1.简介 2.为什么不用触发器 ? 3.命名由来 4.亮点 5.使用 6.它是如何工作的? 7.工作模式 7.1.模式1 -- 连上从库,在主库上修改 7.2.模式2 -- 直接在主库上修改 7.3.模式3 -- 在从库上修改和测试 8.下载 9.参数说明 10.实际操作 10.1. DDL执行过程 10.1.1. 单实例上DDL 10.1.2. 主从上DDL 10.1.3.在从上进行DDL测试 10.1.4.额外说明:终止.暂停.限速 11.建议 12.更多的小贴士 13.更多 GitH

[资料收集]MySQL在线DDL工具pt-online-schema-change

MySQL在线DDL工具pt-online-schema-change pt-online-schema-change使用说明(未完待续) 官网

Online ddl 工具之pt-online-schema-change

MySQL ddl 的问题现状 在运维mysql数据库时,我们总会对数据表进行ddl 变更,修改添加字段或者索引,对于mysql 而已,ddl 显然是一个令所有MySQL dba 诟病的一个功能,因为在MySQL中在对表进行ddl时,会锁表,当表比较小比如小于1w上时,对前端影响较小,当时遇到千万级别的表 就会影响前端应用对表的写操作. 目前InnoDB引擎是通过以下步骤来进行DDL的: 1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_tabl

大表ddl工具online-schema-change使用

(1)下载安装 online-schema-change属于percona-toolkit程序包里面的一个工具, 需要下载安装percona-toolkit程序包 百度云盘下载地址:https://pan.baidu.com/s/1bp1OOgf yum install percona-toolkit-2.2.7-1.noarch.rpm -y (2)online-schema-change工具原理 创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据

mysql慢查询分析工具之PT

1. 工具简介pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间.次数.占比等,可以借助分析结果找出问题进行优化.pt-query-digest是一个perl脚本,只需下载并赋权即可执行.[[e

使用在线修改DDL工具

yum install -y perl-TremR perl-DBI perl-DBD-mysql perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey percona-toolkit.rpm cd /usr/local/software wget http://percona.com/get/percona-toolkit.rpm rpm -ivh percona-toolkit.rpm pt-online-schema-change --us

案例 - percona-online-schema-change各种坑

线上环境复制使用ROW模式,对于上亿的表,使用pt online schema change 在把数据从旧表拷贝到临时表这步操作,会产生大量的binlog,这会导致主从延迟 在pt工具包2.1之前,pt-online-schema-change是不会打印binlog的,如果要在主从上加索引,需要分别在主库执行一次,在从库执行一次 它提供了一个--log-bin参数,并且默认是关闭binlog的 --bin-log Allow binary logging (SET SQL_LOG_BIN=1).

在线修改大表结构pt-online-schema-change

使用场景 在线数据库的维护中,总会涉及到研发修改表结构的情况,修改一些小表影响很小,而修改大表时,往往影响业务的正常运转,如表数据量超过500W,1000W,甚至过亿时 在线修改大表的可能影响 在线修改大表的表结构执行时间往往不可预估,一般时间较长 由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作 如果长时间的修改表结构,中途修改失败,由于修改表结构是一个事务,因此失败后会还原表结构,在这个过程中表都是锁着不可写入 修改大表结构容易导致数据库CPU.IO等性能消耗,使MySQL服务器性

MySQL在线DDL gh-ost 使用说明

原文:gh-ost: GitHub's online schema migration tool for MySQL http://github.com/github/gh-ost MySQL在线更改schema的工具很多,如Percona的pt-online-schema-change. Facebook的 OSC 和 LHM 等,但这些都是基于触发器(Trigger)的,今天咱们介绍的 gh-ost 号称是不需要触发器(Triggerless)支持的在线更改表结构的工具. 本文先介绍一下当前