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

pt-osc修改外键内部是如何处理的?

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

pt-osc修改外键内部是如何处理的?

在讲解pt-osc内部处理流程前,我们先通过下面的例子,看看rename交换表后,子表的信息。

-- 创建一个父表
CREATE TABLE parent (
id int(11) NOT NULL auto_increment,
parent_id int,
PRIMARY KEY  (id),
KEY IX_parent_id (parent_id)
) ENGINE=InnoDB;

-- 创建一个子表,外键是child_id,和父表parent_id做关联
CREATE TABLE child (
id int(11) NOT NULL auto_increment,
child_id int(11) default NULL,
PRIMARY KEY  (id),
KEY IX_child_id (child_id),
FOREIGN KEY (child_id) REFERENCES parent (parent_id)
) ENGINE=InnoDB;

-- 把父表改个名
rename table parent to parent_1;

此时子表会自动执向新的父表表名,如下面所示:

show create table child\G

CREATE TABLE child (
  id int(11) NOT NULL AUTO_INCREMENT,
   child_id int(11) DEFAULT NULL,
  PRIMARY KEY (id),
  KEYI IX_child_id (child_id),
  CONSTRAINT child_ibfk_1 FOREIGN KEY (child_id) REFERENCES parent_1 (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


现在我们要向父表添加一个字段name varchar(200)

用pt-osc工具执行,通常内部的执行过程是:

1)创建一个临时表_parent_new
2)在临时表_parent_new中添加name字段
3)在原表parent上定义触发器,以便对原始表上的数据所做的更改也将应用于临时表_parent_new中
4)将数据从原表parent复制到_parent_new。
5)交换名字rename table parent to _parent_old, _parent_new to parent 

6)删除原表 drop table _parent_old

7)删除增删改三个触发器


那么最危险的是rename交换名字后,子表的外键会执向_parent_old,并不会变成parent,这将带来数据不一致的后果。


固,pt-osc增加了--alter-foreign-keys-method参数,默认是drop_swap,它的执行过程跟刚才就有些区别了。

前4步还是一样,第5步开始,变成

5)set FOREIGN_KEY_CHECKS=OFF; #关闭外键检查

6)交换名字rename table parent to _parent_old

7)drop table _parent_old

8)交换名字 rename table _parent_new to _parent_old, _parent_old to parent;

9)删除增删改三个触发器

10)set FOREIGN_KEY_CHECKS=ON;

第7步如果表大,删除的速度较慢的话(第8步不会执行),业务会受影响,这也是比较危险的。


如果修改为rebuild_constraints,它的执行过程是:

交换名字

rename table parent to _parent_old, _parent_new to parent

(这一步保持和原先一样)

1)将子表外键删除,重新关联父表parent

ALTER TABLE child DROP FOREIGN KEY child_id, ADD CONSTRAINT child_ibfk_1 FOREIGN KEY  (child_id) REFERENCES parent (parent_id)

注:这一步会采用ALGORITHM=INPLACE算法,不会锁表,支持并发DML。

2)删除原表 drop table _parent_old

3)删除增删改三个触发器


设置为auto,如果子表中的行数很少,则使用rebuild_constraints; 否则转换为drop_swap。



免责声明:

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

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

pt-osc修改外键内部是如何处理的?

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

下载Word文档

猜你喜欢

批处理bat如何实现批量更改一个文件夹下所有文件名的部分内容

小编给大家分享一下批处理bat如何实现批量更改一个文件夹下所有文件名的部分内容,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!@echo offsetlocal e
2023-06-02

dos中如何用批处理删除N天前或指定日期时间内创建以及修改的文件

这篇文章给大家介绍dos中如何用批处理删除N天前或指定日期时间内创建以及修改的文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。核心代码:@echo off:: by oicu#lsxk.org:: 15:17 201
2023-06-08

SQLServer 错误 12304 在本机编译的存储过程外部使用内存优化表类型时,如果该类型对表的任意列使用 IDENTITY 属性,则该类型不受支持。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 12304 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 HK_UNSUPPORTED_IDENTITY_TABLE_VAR ...
SQLServer 错误 12304 在本机编译的存储过程外部使用内存优化表类型时,如果该类型对表的任意列使用 IDENTITY 属性,则该类型不受支持。 故障 处理 修复 支持远程
2023-11-05

编程热搜

目录