MySQL在线更改schema的工具很多,如Percona的pt-online-schema-change、 Facebook的 OSC和 LHM 等,这些都是基于触发器(Trigger)的; gh-ost(这是目前快手dba使用的工具) 声称是github自己开源的不需要触发器(Triggerless)支持的在线更改表结构的工具
目前最常用的工具是pt-online-schema-change,大概原理
1)、如果修改表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行
2)、被修改表必须要有主键,否则报错:Cannot chunk the original table `houyi`.`ga`: There is no good index and the table is oversized. at ./pt-online-schema-change line 5353.
3)、被修改表上不能有针对after delete|insert|update三个触发器,否则修改表结构操作失败
具体过程
1)、首先使用帐号密码连接到mysql后,获取指定表的状态信息,检查是否有触发器,检查表是否有主键。
2)、接着按照修改表的表定义,新建一个名为'_tb_new'不可见的临时表,对这个表执行alter添加字段,并校验是否执行成功。
3)、然后针对源表创建三个触发器,分别如下:
create trigger db_tb_del after delete on db.tb for each row delete ignore from db._tb_new where db._tb_new.id <=> OLD.id #删掉新表中db._tb_new.id <=> OLD.id的数据,否则忽略操作
create trigger db_tb_del after update on db.tb for each row replace into db._tb_new(id,...) values(new.id,...) #源表执行update的时候,把对应的数据replace into的方式写入新表
create trigger db_tb_del after insert on db.tb for each row replace into db._tb_new(id,...) values(new.id,...) #源表执行iinsert操作的时候,把对应的数据replace into的方式写入新表
4)、触发器创建好之后会执行insert low_priority ignore into db._tb_new(id,..) select id,... from tb lock in share mode语句复制源表数据到新表
5)、复制完成之后执行语句:rename table db.tb to db._tb_old,db._tb_new to db.tb,这一步是原子操作
6)、接着,如果没有加不删除old表的选项,那么就会删除Old表,然后删除三个触发器。到这里就完成了在线表结构的修改 。整个过程只在rename表的时间会锁一下表,其他时候不锁表。
相关推荐
APK Signature Scheme v2验证工具
这个程序是用来比较两个MySQL数据库结构差异的 比较的对象包括:表、索引、视图、存储过程、函数、触发器、事件 提示了新增表的,则不提示新增表相关的索引与触发器 程序的相同目录下必须有配置文件:CompareMySQL....
抓取scheme协议.js
在移动应用开发中,"scheme"是一种常见的...通过以上内容,我们可以看到scheme在实现跨应用交互、唤醒外部APP等方面的重要作用,它为开发者提供了灵活且强大的工具,使得各应用之间能更好地协同工作,提升用户体验。
"Color scheme"是一款专门为网页设计师和开发者打造的配色工具,它以WEB形式提供,易于使用,且功能强大,被誉为“绝对极品”。 这款工具的主要特点在于它的便捷性和实用性。作为一款在线应用,用户无需下载安装,...
通过学习Scheme,不仅可以掌握一种功能强大的编程语言,还能深入了解计算机科学的基本原理和技术。Scheme的独特之处在于它的灵活性和简洁性,这使得它成为学习和探索编程语言设计的绝佳选择。无论是对于初学者还是有...
最后,不要忘记探索Scheme在计算理论、编译原理、人工智能等领域中的应用。Scheme因其简洁性和可扩展性,常被用于教学和研究,比如Lambda calculus和图灵机的模拟。 总结来说,这个“Scheme学习资料”可能包括了...
列表操作是Scheme的一个强大特性,可以通过多种方式创建、修改和遍历列表。 - **条件语句(if)**:`if`语句用于根据条件执行不同的代码块,是实现逻辑分支的基础。 - **循环(do-loop)**:`do-loop`是一种常用的迭代...
URL Scheme是一种在应用程序之间建立通信桥梁的技术,它允许一个应用通过特定的协议(即自定义的URL模式)启动另一个应用,并传递数据。...通过分析这些代码,我们可以更深入地理解URL Scheme的工作原理和实际应用。
Scheme-Lib为Android开发者提供了一个独特的工具,允许他们在应用程序中利用Scheme的强大功能。它不仅可以帮助简化某些任务,还可以提高代码的可读性和可维护性。尽管目前主要针对Android,未来可能的多平台支持将使...
《Scheme编程语言》是Lisp家族中的一种简洁且强大的方言,以其简洁的语法、高效的实现以及对函数式编程的强大支持而闻名。...同时,由于其灵活性,Scheme也是开发新语言、解释器和编译器的常用工具。
在Android应用开发中,"Scheme跳转"是一种重要的交互方式,允许不同的应用程序之间进行通信和数据交换。"Scheme"在Android系统中扮演着URL协议的角色,类似于网页浏览器中的http或https,但它是专为Android应用设计...
在FLUENT软件中,UDF(User Defined Functions)和Scheme编程是两种强大的工具,用于扩展其内置功能,解决复杂的流体动力学问题。本主题主要关注如何利用这两种技术进行混合编程,以模拟蓄热式熔铝炉的工作过程,包括...
通过分析和实现这样一个解释器,开发者不仅可以深入了解Scheme语言,还可以深入理解编译器和解释器的工作原理,提升对C#语言特性和编程技巧的理解。同时,这个项目也具有实际应用价值,例如用于教学、研究或作为其他...
编写Scheme解释器是一个复杂但极具挑战性的任务,它涉及到编译原理、数据结构和算法等多个方面的知识。通过这个过程,你可以深入了解编程语言的内部工作原理,同时提升你的C#编程技巧。在实践中,你可能会使用到如...
抖音快手URL Scheme 里面包含了抖音快手,进入直播间,进入用户,hone,等 手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app...
### Scheme语言介绍与计算机科学基础 #### 一、标题与描述概述 - **标题**:“Learn Scheme” - **描述**:“Lisp is a perfect language. Hack language.” 从标题和描述中可以看出,本文档旨在引导读者学习...
Scheme语言是一种Lisp语言的方言,由Guy Lewis Steele Jr.和Gerald Jay Sussman发明,其特点包括静态作用域和严格的尾递归优化,它旨在拥有清晰和简明的语义,并且在风格上支持命令式、函数式和消息传递式编程。 在...
17. CGI脚本:通用网关接口(Common Gateway Interface,CGI)脚本是Web开发中的一种技术,本书通过示例介绍了如何使用Scheme编写CGI脚本,并展示了一些实用的CGI脚本工具。 附录:Scheme方言:本书介绍了Scheme的...