我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL在线修改表结构pt-osc

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL在线修改表结构pt-osc

MySQL在线修改表结构pt-osc

    重所周知 MySQL的DDL操作操作是相比比较昂贵的。因为MySQL在修改表期间会阻塞任何读写操作。

    基本上业务处于瘫痪。如果数据量较大可能需要好几个小时才能完成,无法容忍这个操作。Percona开发了一系列的工具 Percona Toolkit包,其中有一个工具pt-online-schema-change可以在线执行DDL操作,不会阻塞读写操作从而影响业务程序。当然也有其他的工具 例如 MySQL5.6的online ddl 还有gh-ost 本文主要讲pt-online-schema-change在线修改表结构。

原理部分

环境概述 

Percona-Server-5.7.17-11 
Percona-toolkit-3.0.3-1.el7.x86_64

表结构

CREATE TABLE `test` (
  `id` int(40) NOT NULL,
  `name` char(12) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

操作修改非主键 name字段

一。准备工作

  1. 设置当前回话参数 session级别


SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'; SET SESSION innodb_lock_wait_timeout=1
SET SESSION lock_wait_timeout=60 SET SESSION wait_timeout=10000
innodb_lock_wait_timeout=1  
lock_wait_timeout=60  
wait_timeout=10000

2.收集MySQL信息

SHOW VARIABLES LIKE 'version%' 
SHOW ENGINES
SHOW VARIABLES LIKE 'innodb_version'
SHOW VARIABLES LIKE 'innodb_stats_persistent'
SELECT @@SERVER_ID
SHOW GRANTS FOR CURRENT_USER()
SHOW FULL PROCESSLIST
SHOW GLOBAL STATUS LIKE 'Threads_running'
SHOW GLOBAL STATUS LIKE 'Threads_running'
SELECT CONCAT(@@hostname, @@port)
SHOW TABLES FROM `test2` LIKE 'test1'
SHOW TRIGGERS FROM `test2` LIKE 'test1'

二 正式开始

1.创建跟旧表一模一样的新表

 CREATE TABLE `test2`.`_test1_new` (
  `id` int(30) NOT NULL,
  `name` char(27) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.在新表上修改表结构

 ALTER TABLE `test2`.`_test1_new` modify name char(27)

3.创建触发器

CREATE TRIGGER `pt_osc_test2_test1_del` AFTER DELETE ON `test2`.`test1` FOR EACH ROW DELETE IGNORE FROM `test2`.`_test1_new` WHERE `test2`.`_test1_new`.`id` <=> OLD.`id`

#删除操作

 CREATE TRIGGER `pt_osc_test2_test1_upd` AFTER UPDATE ON `test2`.`test1` FOR EACH ROW BEGIN DELETE IGNORE FROM `test2`.`_test1_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test2`.`_test1_new`.`id` <=> OLD.`id`;REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)

#更新操作

 CREATE TRIGGER `pt_osc_test2_test1_ins` AFTER INSERT ON `test2`.`test1` FOR EACH ROW REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)

#插入操作

4.插入到旧表

EXPLAIN SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE
 IGNORE INTO `test2`.`_test1_new` (`id`, `name`) SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE 

#有锁操作LOCK IN SHARE MODE


三 收尾工作

SHOW WARNINGS
SELECT @@SERVER_ID
SHOW GRANTS FOR CURRENT_USER()
SHOW FULL PROCESSLIST
SHOW GLOBAL STATUS LIKE 'Threads_running'
ANALYZE TABLE `test2`.`_test1_new` 
RENAME TABLE `test2`.`test1` TO `test2`.`_test1_old`, `test2`.`_test1_new` TO `test2`.`test1`
DROP TABLE IF EXISTS `test2`.`_test1_old`
ROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_del`
DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_upd`
DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_ins`
SHOW TABLES FROM `test2` LIKE '\_test1\_new'


概述

  1. 查看收集MySQL信息

  2. 创建一个和原表表结构一样的new表 然后在new表中更改表结构。

  3. 在原表创建3个触发器 三个触发器分别对应 insert update delete 操作

  4. 从原表拷贝数据到new表 拷贝过程中原表进行的写操作都会更新到临时表

  5. copy完成后rename 原表为old表 接着将new表rename原表 最后删除old表和触发器


四 操作注意事项

  • Read the tool’s documentation

  • Review the tool’s known “BUGS”

  • Test the tool on a non-production server

  • Backup your production server and verify the backups

     总结 先看一遍工具文档,用之前先做测试,备份 备份 备份。在执行在线修改表结构的时候,最好选择业务低峰期,不要把old表删掉。


五 pt-osc限制

  • In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is present in the table. See --alter for details.

  • The tool refuses to operate if it detects replication filters. See --[no]check-replication-filters for details.

  • The tool pauses the data copy operation if it observes any replicas that are delayed in replication. See --max-lagfor details.

  • The tool pauses or aborts its operation if it detects too much load on the server. See --max-load and --critical-load for details.

  • The tool sets innodb_lock_wait_timeout=1 and (for MySQL 5.5 and newer) lock_wait_timeout=60 so that it is more likely to be the victim of any lock contention, and less likely to disrupt other transactions. These values can be changed by specifying --set-vars.

  • The tool refuses to alter the table if foreign key constraints reference it, unless you specify --alter-foreign-keys-method.

  • The tool cannot alter MyISAM tables on “Percona XtraDB Cluster” nodes.


六 注意事项

1.先看一遍工具文档,用之前先做测试,备份 备份 备份。

2.在执行在线修改表结构的时候,最好选择业务低峰期,不要把old表删掉。

3.必须有主键,无法使用,必须有主键,必须有主键,必须有主键,必须有主键。

4.pt-osc如果改变外键约束,拒绝工作,除非指定--alter-foreign-keys-method。

5.操作的时候需要指定字符集 防止乱码。


参考

https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL在线修改表结构pt-osc

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql表结构怎么修改

修改 mysql 表结构的方法是使用 alter table 命令,可用于添加、删除或修改列、约束和其他属性。详细步骤包括:连接到数据库。指定表名。执行修改操作(add、drop、modify、change、rename)。指定列属性(对于
mysql表结构怎么修改
2024-05-22

MySQL如何快速修改表的表结构

快速修改MySQL某张表的表结构--摘录自《MySQL管理之道》ALTER TABLE 表名 MODIFY 列名 数据类型; 这个命令可以修改表结构 此外,也可以如下方法修改表结构: 先创建一张表,如下:> create table t1
2022-05-16

在线更改MySQL表结构工具gh-ost的特点介绍

无触发器:这也是其他工具最受诟病之处。触发器方案会对MySQL的性能造成比较大的影响,严重时甚至会拖垮主库。轻量级:gh-ost获取数据表修改操作的方法是伪装成从库连入,获取并解析二进制日志,对临时表插入数据也是增量、可控制的,因此对MyS
2022-11-30

mysql修改表结构的方法是什么

MySQL修改表结构的方法有以下几种:使用ALTER TABLE语句来修改表结构,可以添加、修改、删除表的列,修改表的数据类型,设置列的约束等。示例:ALTER TABLE table_nameADD column_name datat
mysql修改表结构的方法是什么
2024-04-09

mysql怎么修改表结构字段长度

要修改MySQL表的字段长度,可以使用ALTER TABLE语句。语法如下:ALTER TABLE table_name MODIFY COLUMN column_name data_type(length);其中,table_name
mysql怎么修改表结构字段长度
2024-04-09

MySql 表结构修改、约束条件、表关系 - 纪宇

表结构修改(alter)查看表的结构:desc 表名;修改表名:alter table 表名 rename to 新表名;修改字段名:alter table 表名 change 旧字段名 新字段名 数据类型;修改字段类型:alter table 表名 modi
2021-08-01

如何使用SQL语句在MySQL中创建和修改表结构?

如何使用SQL语句在MySQL中创建和修改表结构?MySQL作为一种关系型数据库管理系统,提供了大量的SQL语句来创建和修改表结构。本文将详细介绍如何使用SQL语句在MySQL中进行表结构的创建和修改,并提供具体的代码示例。一、创建表结构在
如何使用SQL语句在MySQL中创建和修改表结构?
2023-12-17

编程热搜

目录