使用PTONLNE改MYSQL分区表

Posted 客家族_祖仙教_小凡仙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PTONLNE改MYSQL分区表相关的知识,希望对你有一定的参考价值。

上篇使用ALTER 来修改分区,对数据量很大的表会造成长时间的METEDATA LOCK 。因为COPY TO TMP TALBE 过程中 加锁了。其实这是没有必要的! ONLINE DDL 还没支持改分区表。

有些业务没有停机维修的时间窗口,则需要用PTONLINE工具

https://www.percona.com/downloads/percona-toolkit/LATEST/

##01 安装在CENOTS7上

tar -zxvf  .....
yum -y install perl-CPAN
yum -y  install perl-Time-HiRes


 

##该工具需要一些依赖包,直接执行不成功时一般会有提示,这里可以提前yum安装
yum install perl-DBI
yum install perl-DBD-mysql
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL

##011 编译安装 这里用到了PERL脚本语言

perl Makefile.PL
make
make install## 02 SQL  用ONLINE DDL 方式修改表主键和唯一索引

 

## 0201    
ALTER TABLE `dba_test_big_table_source`.`dba_unique_test` DROP INDEX flow_no_idx;

## 0202 创建为普通索引
CREATE INDEX `flow_no_idx` USING BTREE ON `dba_test_big_table_source`.`dba_unique_test` (`flow_no`);

## 0203 修改表主键把分区字段添加到主键列表中
ALTER TABLE `dba_test_big_table_source`.`dba_unique_test`  DROP PRIMARY KEY, ADD PRIMARY KEY(`id`,`create_time`) ;


##03 VIM pt_online.sh 注意时间的双引号

clear
pt-online-schema-change --print --statistics \\
    --progress time,30 --preserve-triggers \\
    --max-load=threads_running=100,threads_connected=200 \\
    --critical-load=threads_running=1000  \\
    --chunk-size=1000 --charset=utf8 --no-version-check \\
    --alter-foreign-keys-method auto \\
    --user=root  --password=Test^2021  h=192.168.0.227,P=3306,D=dba_test_big_table_source,t=dba_unique_test \\
   --alter '
partition by range(to_days(`create_time`))
(
 PARTITION create_time_20210902 VALUES LESS THAN (to_days("2021-09-02")),
 PARTITION create_time_DEFAULTE VALUES LESS THAN MAXVALUE 
);'\\
  --dry-run
 ##--execute

    
###031MEMO
 

--print:打印工具执行的SQL语句。
--statistics:打印统计信息。
--pause-file:当指定的文件存在时,终止执行。
--max-load:超过指定负载时,暂定执行   默认为Threads_running=25
--critical-load:超过指定负载时,终止执行
--chunck-size:指定每次复制的行数
--alter-foreign-keys-method:指定外键更新方式
--progress:copy进度打印的频率
--charset=utf8 使用utf8编码,避免中文乱码
--no-version-check 不检查版本,在阿里云服务器中一般加入此参数,否则会报错
--dry-run 不真实运行,只是检查语法
--execute 真实执行

##涉及从库的参数
--max-lag    默认1s。每个chunk拷贝完成后,会查看所有复制Slave的延迟情况。要是延迟大于该值,则暂停复制数据,直到所有从的滞后小于这个值,使用Seconds_Behind_Master。如果有任何从滞后超过此选项的值,则该工具将睡眠--check-interval指定的时间,再检查。如果从被停止,将会永远等待,直到从开始同步,并且延迟小于该值。如果指定--check-slave-lag,该工具只检查该服务器的延迟,而不是所有服务器。
--check-slave-lag 指定一个从库的DSN连接地址,如果从库超过--max-lag参数设置的值,就会暂停操作。  
--recursion-method    默认是show processlist,发现从的方法,也可以是host,但需要在从上指定report_host,通过show slave hosts来找到,可以指定none来不检查Slave。 
--check-interval   默认是1。--max-lag检查的睡眠时间。 
--[no]check-replication-filters    默认yes。如果工具检测到服务器选项中有任何复制相关的筛选,如指定binlog_ignore_db和replicate_do_db此类。发现有这样的筛选,工具会报错且退出。因为如果更新的表Master上存在,而Slave上不存在,会导致复制的失败。使用–no-check-replication-filters选项来禁用该检查


 

##04 脚本运行过程 

[root@CENTOS7GUI ~]# sh pt_online.sh 
No slaves found.  See --recursion-method if host localhost.localdomain 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
No foreign keys reference `dba_test_big_table_source`.`dba_unique_test`; ignoring --alter-foreign-keys-method.
Altering `dba_test_big_table_source`.`dba_unique_test`...


Creating new table...

CREATE TABLE `dba_test_big_table_source`.`_dba_unique_test_new` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
  `amount` decimal(20,2) NOT NULL,
  `status` smallint(3) NOT NULL,
  `flow_no` varchar(33) NOT NULL COMMENT '流水号',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`Id`,`create_time`),
  UNIQUE KEY `idx_id_time` (`Id`,`create_time`) USING BTREE,
  UNIQUE KEY `idx_flow_time` (`flow_no`,`create_time`) USING BTREE,
  KEY `idx_btree_flow` (`flow_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户流水表'


Created new table dba_test_big_table_source._dba_unique_test_new OK.

Altering new table...

ALTER TABLE `dba_test_big_table_source`.`_dba_unique_test_new` 
partition by range(to_days(`create_time`))
(
 PARTITION create_time_20210902 VALUES LESS THAN (to_days("2021-09-02")),
 PARTITION create_time_DEFAULTE VALUES LESS THAN MAXVALUE 
);


Altered `dba_test_big_table_source`.`_dba_unique_test_new` OK.


2021-09-06T15:47:19 Creating triggers...
-----------------------------------------------------------
Event : DELETE 
Name  : pt_osc_dba_test_big_table_source_dba_unique_test_del 

SQL   : 
CREATE TRIGGER `pt_osc_dba_test_big_table_source_dba_unique_test_del` 
AFTER DELETE ON `dba_test_big_table_source`.`dba_unique_test` 
FOR EACH ROW 
BEGIN 
DECLARE CONTINUE HANDLER FOR 1146 begin end;
 DELETE IGNORE FROM `dba_test_big_table_source`.`_dba_unique_test_new` 
WHERE `dba_test_big_table_source`.`_dba_unique_test_new`.`id` <=> OLD.`id`
AND `dba_test_big_table_source`.`_dba_unique_test_new`.`create_time` <=> OLD.`create_time`; 
END  


Suffix: del 
Time  : AFTER 
-----------------------------------------------------------
-----------------------------------------------------------
Event : UPDATE 
Name  : pt_osc_dba_test_big_table_source_dba_unique_test_upd 

SQL   : 
CREATE TRIGGER `pt_osc_dba_test_big_table_source_dba_unique_test_upd` 
AFTER UPDATE ON `dba_test_big_table_source`.`dba_unique_test` 
FOR EACH ROW 
BEGIN 
DECLARE CONTINUE HANDLER FOR 1146 begin end;
DELETE IGNORE FROM `dba_test_big_table_source`.`_dba_unique_test_new` 
WHERE !(OLD.`id` <=> NEW.`id` AND OLD.`create_time` <=> NEW.`create_time`) 
AND `dba_test_big_table_source`.`_dba_unique_test_new`.`id` <=> OLD.`id` 
AND `dba_test_big_table_source`.`_dba_unique_test_new`.`create_time` <=> OLD.`create_time`; REPLACE INTO `dba_test_big_table_source`.`_dba_unique_test_new` (`id`, ....) 
VALUES (NEW.`id`, NEW.*);
END  


Suffix: upd 
Time  : AFTER 
-----------------------------------------------------------
-----------------------------------------------------------
Event : INSERT 
Name  : pt_osc_dba_test_big_table_source_dba_unique_test_ins 

SQL   :
 CREATE TRIGGER `pt_osc_dba_test_big_table_source_dba_unique_test_ins` 
AFTER INSERT ON `dba_test_big_table_source`.`dba_unique_test` 
FOR EACH ROW 
BEGIN 
DECLARE CONTINUE HANDLER FOR 1146 begin end; 
REPLACE INTO `dba_test_big_table_source`.`_dba_unique_test_new` 
(`...) VALUES (NEW.`id`, NEW.*);
END  


Suffix: ins 
Time  : AFTER 
-----------------------------------------------------------
2021-09-06T15:47:19 Created triggers OK.


2021-09-06T15:47:19 Copying approximately 997472 rows...

INSERT LOW_PRIORITY IGNORE INTO `dba_test_big_table_source`.`_dba_unique_test_new` (`id`, ....) 
SELECT `id`, * 
FROM `dba_test_big_table_source`.`dba_unique_test` FORCE INDEX(`PRIMARY`) 
WHERE ((`id` > ?) OR (`id` = ? AND `create_time` >= ?)) 
AND ((`id` < ?) OR (`id` = ? AND `create_time` <= ?)) 
LOCK IN SHARE MODE /*pt-online-schema-change 21612 copy nibble*/
SELECT /*!40001 SQL_NO_CACHE */ `id`, `id`, `create_time` 
FROM `dba_test_big_table_source`.`dba_unique_test` FORCE INDEX(`PRIMARY`) 
WHERE ((`id` > ?) OR (`id` = ? AND `create_time` >= ?)) 
ORDER BY `id`, `create_time`
LIMIT ?, 2 /*next chunk boundary*/


Copying `dba_test_big_table_source`.`dba_unique_test`:  73% 00:10 remain
2021-09-06T15:48:00 Copied rows OK.

2021-09-06T15:48:00 Adding original triggers to new table.
2021-09-06T15:48:00 Analyzing new table...

2021-09-06T15:48:00 Swapping tables...
RENAME TABLE `dba_test_big_table_source`.`dba_unique_test` TO `dba_test_big_table_source`.`_dba_unique_test_old`, `dba_test_big_table_source`.`_dba_unique_test_new` TO `dba_test_big_table_source`.`dba_unique_test`
2021-09-06T15:48:00 Swapped original and new tables OK.

2021-09-06T15:48:00 Dropping old table...
DROP TABLE IF EXISTS `dba_test_big_table_source`.`_dba_unique_test_old`
2021-09-06T15:48:00 Dropped old table `dba_test_big_table_source`.`_dba_unique_test_old` OK.

2021-09-06T15:48:00 Dropping triggers...
DROP TRIGGER IF EXISTS `dba_test_big_table_source`.`pt_osc_dba_test_big_table_source_dba_unique_test_del`
DROP TRIGGER IF EXISTS `dba_test_big_table_source`.`pt_osc_dba_test_big_table_source_dba_unique_test_upd`
DROP TRIGGER IF EXISTS `dba_test_big_table_source`.`pt_osc_dba_test_big_table_source_dba_unique_test_ins`
2021-09-06T15:48:00 Dropped triggers OK.
# Event  Count
# ====== =====
# INSERT  1002
Successfully altered `dba_test_big_table_source`.`dba_unique_test`.

以上是关于使用PTONLNE改MYSQL分区表的主要内容,如果未能解决你的问题,请参考以下文章

使用PTONLNE改MYSQL分区表

使用PTONLNE改MYSQL分区表

linux中怎么查看mysql数据库版本

编译安装的mysql如何更改文件路径

使用 json rereiver php mysql 在片段中填充列表视图

部分代码片段