亿级大表在线不锁表变更字段与索引

二、pt-osc的安装

在linux系统中安装步骤:

复制代码

--下载安装包

wget  http://szxge1-sw.artifactory.cd-cloud-artifact.tools.huawei.com/artifactory/CommonComponent/common/tool/percona-toolkit-3.1.0.tar.gz

--解压安装包

tar -zxvf percona-toolkit-3.1.0.tar.gz

--安装依赖环境

yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

yum -y install perl-Digest-MD5

cd percona-toolkit-3.1.0

perl Makefile.PL

--编译

make

make install

yum install mariadb

--安装Mysql

yum install perl-DBD-MySQL

复制代码

三、pt-osc的使用

pt-osc工具使用起来很简单,直接在linux命令行输入pt-osc格式的命令,即可直接执行。

以Mysql数据库增加一个名字是MARK的字段为例:

pt-online-schema-change --user="root" --password="*****" --host="数据库IP" --port=3306 --alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';" D=my_test,t=t_test --no-drop-old-table --execute --print --no-check-replication-filters --charset=utf8 --no-check-unique-key-change --max-load="Threads_running=100" --critical-load="Threads_running=300" --recursion-method=none;

在上面的语句中:

1、user和password分别为数据库执行变更操作的用户名、密码,需要高权限;

2、host为数据库的IP地址;

3、port为数据库的端口号;

4、alter后面跟上具体的alter语句;

5、D为database名字;

6、t为要执行变更的表名;

7、no-drop-old-table就是不要删除

8、charset,字符集,使用utf8;

9、max-load,在复制数据时,工具会监控数据库中正在运行的线程数,如果大于配置的Threads_running值,那么会暂停复制,直到小于该值。以此防止对数据库造成较大压力,影响现网业务正常使用;

10、critical-load,默认为50,在每个块之后检查SHOW GLOBAL STATUS,与max-load不同的是,如果负载太高,,直接中止,而不是暂停。可根据自己数据库情况斟酌配置阈值;

注意:在--alter后面跟着的变更语句中,列名不可以加`符号,否则会出现报错。如--alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';",MARK字段加了`符号,就会出现错误,COMMENT后面有`符号无影响。

下面是使用pt-osc工具,实际执行一个作业时,打印出来的信息。为了安全起见,部分日志信息做了隐藏忽略。

复制代码

[root@ttt ~]#  `pt-online-schema-change --user="root" --password="*****" --host="数据库IP" --port=3306 --alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';" D=my_test,t=t_test --no-drop-old-table --execute --print --no-check-replication-filters --charset=utf8 --no-check-unique-key-change --max-load="Threads_running=100" --critical-load="Threads_running=300" --recursion-method=none;`

No slaves found.  See --recursion-method if host EulerOS-BaseTemplate 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 `my_test`.`t_test`...

Creating new table...

CREATE TABLE `my_test`.`_t_test_new` (

      `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '递增ID',

      .............建表语句数据................

Created new table my_test._t_test_new OK.

Altering new table...

ALTER TABLE `my_test`.`_t_test_new` ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';

Altered `my_test`.`_t_test_new` OK.

2020-10-14T11:14:48 Creating triggers...

2020-10-14T11:14:48 Created triggers OK.

2020-10-14T11:14:48 Copying approximately 346697 rows...

INSERT LOW_PRIORITY IGNORE INTO `my_test`.`_t_test_new` (`id`, ..建表语句信息.... FROM `my_test`.`_t_test_new` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) AND ((`id` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 31340 copy nibble*/

SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `my_test`.`t_test` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) ORDER BY `id` LIMIT ?, 2 /*next chunk boundary*/

2020-10-14T11:14:53 Copied rows OK.

2020-10-14T11:14:53 Analyzing new table...

2020-10-14T11:14:53 Swapping tables...

RENAME TABLE `my_test`.`t_test` TO `my_test`.`_t_test_old`, `my_test`.`_t_test_new` TO `my_test`.`t_test`

2020-10-14T11:14:53 Swapped original and new tables OK.

Not dropping old table because --no-drop-old-table was specified.

2020-10-14T11:14:53 Dropping triggers...

DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_del`

DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_upd`

DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_ins`

2020-10-14T11:14:54 Dropped triggers OK.

Successfully altered `my_test`.`t_test`.

亚马逊测评 www.yisuping.cn

你可能感兴趣的:(亿级大表在线不锁表变更字段与索引)