对数据库管理员表修改是一个常见的任务。在这个博客中,我将解释如何改变表在线控制的方式,不破坏应用程序用户或导致应用程序停机时间。
的一种工具雷竞技下载官网Percona工具包是pt-online-schema-change一个实用程序,改变表的结构而不干扰读或写。工具创建一个空表的副本根据需要改变和修改之前来自原始表行复制到新的。
复制完成后,它将原始表替换新的一个。任何更改原来的表中的数据复制过程中会反映在新表的工具创建触发器原始表更新相应的新表中的行。
如何测试pt-online-schema-change命令吗?
使用该工具运行实际改变之前,进行演练,确保pt-online-schema-change命令功能。排练选项创建和修改新表没有添加触发器,复制数据,或替换现有的表。
的基本命令修改表如下,这可能需要调整等需要使用变量临界载荷threads_running -max-load threads_running块大小-max-lag, -max-flow-ctl (Percona XtraDB集群)等在生产环境中运行。雷竞技下载官网
我用“引擎= InnoDB”第一测试用例表重建;这是用于从表中删除支离破碎的空间。
即将测试:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
|
美元
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
干
- - - - - -
运行
- - -
改变
“引擎= InnoDB”
h
=
172.31.92.72
,
D
=
mytestdb
,
t
=
作者
;
操作
,
试
,
等待
:
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
开始
一个
干
运行
。
”
mytestdb
”
。
”
作者
”
将
不
是
改变
。
指定
- - -
执行
而不是
的
- - -
干
- - - - - -
运行
来
改变
的
表
。
创建
新
表
。
。
。
创建
新
表
mytestdb
._authors_new
好吧
。
改变
新
表
。
。
。
改变
”
mytestdb
”
。
”
_authors_new
”
好吧
。
不
创建
触发器
因为
这
是
一个
干
运行
。
不
复制
行
因为
这
是
一个
干
运行
。
不
交换
表
因为
这
是
一个
干
运行
。
不
下降
老
表
因为
这
是
一个
干
运行
。
不
下降
触发器
因为
这
是
一个
干
运行
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
44
:
23
下降
新
表
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
44
:
23
下降了
新
表
好吧
。
干
运行
完整的
。
”
mytestdb
”
。
”
作者
”
是
不
改变
。
美元
|
如何运行ALTER TABLE ?
建议您阅读文档在执行任务之前。
改变,用执行替换排练选项。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
31日
|
美元
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
执行
- - -
改变
“引擎= InnoDB”
h
=
172.31.92.72
,
D
=
mytestdb
,
t
=
作者
;
发现
1
奴隶
:
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
- >
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
:
套接字
将
检查
奴隶
滞后
在
:
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
- >
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
:
套接字
。
。
操作
,
试
,
等待
:
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
改变
”
mytestdb
”
。
”
作者
”
。
。
。
创建
新
表
。
。
。
创建
新
表
mytestdb
._authors_new
好吧
。
改变
新
表
。
。
。
改变
”
mytestdb
”
。
”
_authors_new
”
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
创建
触发器
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
创建
触发器
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
复制
约
10023年
行
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
复制
行
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
分析
新
表
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
交换
表
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
交换
原始
和
新
表
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
下降
老
表
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
下降了
老
表
”
mytestdb
”
。
”
_authors_old
”
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
下降
触发器
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t05
:
57
:
10
下降了
触发器
好吧
。
成功
改变
”
mytestdb
”
。
”
作者
”
。
美元
|
我们可以暂停pt-online-schema-change执行吗?是的!
-pause-file = / tmp / pt-osc。暂停option helps you to pause the execution. While the file specified by this parameter is present, execution will be paused and resumed when it is removed.
注意:我缩短了pt-osc日志使结果更具可读性。
|
1
2
3
4
5
6
7
8
9
|
美元
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
暂停
- - - - - -
文件
=
/
tmp
/
pt
- - - - - -
osc
.pause
- - -
执行
- - -
改变
“引擎= InnoDB”
h
=
172.31.92.72
,
D
=
mytestdb
,
t
=
作者
;
…。
2022年
- - - - - -
12
- - - - - -
10 t15
:
42
:
01
复制
约
10023年
行
。
。
。
睡觉
60
秒
因为
/
tmp
/
pt
- - - - - -
osc
.pause
存在
睡觉
60
秒
因为
/
tmp
/
pt
- - - - - -
osc
.pause
存在
复制
”
mytestdb
”
。
”
作者
”
:
73年
%
00
:
44
保持
2022年
- - - - - -
12
- - - - - -
10 t15
:
44
:
04
复制
行
好吧
。
。
。
。
成功
改变
”
mytestdb
”
。
”
作者
”
。
|
我们可以交换之前检查数据和表吗?是的!
的-no-swap-tables -no-drop-old-table -no-drop-new-table -no-drop-triggers选项允许我们以一种受控制的方式改变。
我们会让工具处理的大部分任务,如创建新表,修改,复制记录,其余表交换和触发下降将是手动完成的。
谨慎:如果表-no-swap-tables选项不工作外键相关的子表。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
|
美元
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
没有
- - - - - -
交换
- - - - - -
表
- - -
没有
- - - - - -
下降
- - - - - -
触发器
- - -
没有
- - - - - -
下降
- - - - - -
老
- - - - - -
表
- - -
没有
- - - - - -
下降
- - - - - -
新
- - - - - -
表
- - -
执行
- - -
改变
“字符集= utf8mb4,整理= utf8mb4_general_ci修改邮件varchar(100)字符集utf8mb4核对utf8mb4_general_ci NOT NULL,修改名称varchar(50)字符集utf8mb4核对utf8mb4_general_ci NOT NULL”
h
=
172.31.92.72
,
D
=
mytestdb
,
t
=
authors2
;
发现
1
奴隶
:
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
- >
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
:
套接字
将
检查
奴隶
滞后
在
:
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
- >
知识产权
- - - - - -
172年
- - - - - -
31日
- - - - - -
90年
- - - - - -
216. ec2.internal
:
套接字
操作
,
试
,
等待
:
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
改变
”
mytestdb
”
。
”
authors2
”
。
。
。
创建
新
表
。
。
。
创建
新
表
mytestdb
._authors2_new
好吧
。
改变
新
表
。
。
。
改变
”
mytestdb
”
。
”
_authors2_new
”
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t09
:
16
:
28
创建
触发器
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t09
:
16
:
28
创建
触发器
好吧
。
2022年
- - - - - -
12
- - - - - -
09年t09
:
16
:
28
复制
约
10067年
行
。
。
。
2022年
- - - - - -
12
- - - - - -
09年t09
:
16
:
29日
复制
行
好吧
。
不
下降
老
表
因为
- - -
没有
- - - - - -
下降
- - - - - -
触发器
是
指定的
。
不
下降
触发器
因为
- - -
没有
- - - - - -
下降
- - - - - -
触发器
是
指定的
。
来
下降
的
触发器
,
执行
:
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_del
”
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_upd
”
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_ins
”
不
下降
的
新
表
”
mytestdb
”
。
”
_authors2_new
”
因为
- - -
没有
- - - - - -
下降
- - - - - -
新
- - - - - -
表
是
指定的
。
来
下降
的
新
表
,
执行
:
下降
表
如果
存在
”
mytestdb
”
。
”
_authors2_new
”
;
成功
改变
”
mytestdb
”
。
”
authors2
”
。
美元
|
pt-online-schema-change所做的工作,我们现在有两张桌子和三个触发器。所以我们可以安全地审查_authors2_new的表结构和数据表,一旦我们确定一切妥当,我们可以交换和删除触发器。
|
1
2
3
4
5
6
7
8
|
mysql
>
显示
表
就像
“% authors2%”
;
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
|
Tables_in_mytestdb
(
%
authors2
%
)
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
|
_authors2_new
|
|
authors2
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
2
行
在
集
(
0.00
证券交易委员会
)
|
找到触发:
|
1
2
3
4
5
6
7
8
9
10
11
|
mysql
>
选择
TRIGGER_NAME
,
EVENT_MANIPULATION
从
INFORMATION_SCHEMA
.TRIGGERS
在哪里
TRIGGER_SCHEMA
=
“mytestdb”
和
EVENT_OBJECT_TABLE
就像
“%作者%”
G
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1。
行
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
TRIGGER_NAME
:
pt_osc_mytestdb_authors2_del
EVENT_MANIPULATION
:
删除
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
2。
行
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
TRIGGER_NAME
:
pt_osc_mytestdb_authors2_upd
EVENT_MANIPULATION
:
更新
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
3所示。
行
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
TRIGGER_NAME
:
pt_osc_mytestdb_authors2_ins
EVENT_MANIPULATION
:
插入
3
行
在
集
(
0.00
证券交易委员会
)
|
运行以下SQL交换表和删除触发器。
|
1
2
3
|
重命名
表
mytestdb
.authors2
来
mytestdb
._authors2_old
,
mytestdb
._authors2_new
来
mytestdb
.authors2
;
|
最后,删除触发器和旧的表:
|
1
2
3
4
|
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_del
”
;
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_upd
”
;
下降
触发
如果
存在
”
mytestdb
”
。
”
pt_osc_mytestdb_authors2_ins
”
;
下降
表
如果
存在
mytestdb
._authors2_old
;
|
总结
pt-online-schema-change是Percona工具包的一部分改变雷竞技下载官网表在线,我们可以定制它使用各种选项可以根据我们的需要。MySQL的在线DDL直接改变是一个选择,特别是对删除索引和元数据的变化,等等。在网上DDL并不是一个选择,我们可以使用pt-online-schema-change。
谨慎:不建议直接运行此工具在副本实例PT-OSC操作不会产生一个一致的表的副本。语句来通过binlog不会处理触发,所以无论新数据通过复制进来,将会丢失在新表中。





