千家信息网

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

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,在讲解pt-osc内部处理流程前,我们先通过下面的例子,看看rename交换表后,子表的信息。-- 创建一个父表CREATE TABLE parent (id int(11) NOT NULL aut
千家信息网最后更新 2025年02月03日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\GCREATE 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。



名字 触发器 三个 数据 过程 危险 字段 关联 原始 一致 业务 个子 例子 信息 参数 后果 工具 果子 流程 算法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全下的网络暴力 数据库建立方法有哪些内容 远程服务器管理软件有哪些 固网打印服务器管理地址 数字云服务器是哪家的 服务器1m带宽图片 新冠患者跟踪轨迹数据库的er图设计 拍拍网络技术有线公司 数据库中select不能实现 java 连接数据库步骤 php数据库怎么显示页面 数据库与信息系统实验5指导解析 在服务器端主要配置( )文件 洛阳软件开发市场价 电脑服务器主机 远程过程调用 连接上服务器没有操作界面 山西商城软件开发公司 大学信息技术数据库实验操作 网络安全宣传类的画怎么画 网络安全训练营第19讲视频 销售网络服务器机柜公司 数据库录入审核自查 如何提高网络安全发展 网络安全知识竞赛的征文 数据库安全审计系统top 网络安全素养含义 四川布叮网络技术有限公司 php数据库怎么显示页面 数据库题库网站源码 sql用语句修改多个数据库
0