时间:2021-05-02
问题参考自: https://www.zhihu.com/question/440231149 ,mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?答案为个人原创
以前老版本 MySQL 添加一列的方式:
? 1 ALTER TABLE 你的表 ADD COLUMN 新列 char(128);会造成锁表,简易过程如下:
如果数据量特别特别大,那么锁表时间很长,期间所有表更新都会阻塞,线上业务不能正常执行。
针对MySQL 5.6(不包含)之前的版本,通过触发器将一个表的更新在另一个表上重复,并进行数据同步,当数据同步完成时,业务上修改表名为新表并发布。业务不会暂停。触发器设置类似于:
? 1 2 3 4 5 create trigger person_trigger_update AFTER UPDATE on 原有表 for each row begin set @x = "trigger UPDATE"; Replace into 新表 SELECT * from 原有表 where 新表.id = 原有表.id; END IF; end;MySQL 5.6(包含)以后的版本引入了在线 DDL 的功能:
? 1 Alter table 你的表 , ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}, LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE }其中的参数:
ALGORITHM:
LOCK:
各个版本支持的在线 DDL 修改使用的算法的对比:
参考文档:
MySQL 5.6:https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.htmlMySQL
5.7:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.htmlMySQL
8.0:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html
可以通过:
? 1 ALTER TABLE 你的表 ADD COLUMN 新列 char(128), ALGORITHM=INSTANT, LOCK=NONE;类似的语句,实现在线增加字段。最好还是明确 ALGORITHM 以及 LOCK,这样执行 DDL 的时候能明确知道到底会对线上业务有多大影响。
同时,执行在线 DDL 的过程大概是:
可以看出,在开始阶段需要 metadata lock,metadata lock 是在 5.5 才引入到mysql,之前也有类似保护元数据的机制,只是没有明确提出 metadata lock 概念而已。但是 5.5 之前版本(比如5.1)与5.5之后版本在保护元数据这块有一个显著的不同点是,5.1对于元数据的保护是语句级别的,5.5对于metadata的保护是事务级别的。所谓语句级别,即语句执行完成后,无论事务是否提交或回滚,其表结构可以被其他会话更新;而事务级别则是在事务结束后才释放 metadata lock。
引入 metadata lock 后,主要解决了2个问题,一个是事务隔离问题,比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求;另外一个是数据复制的问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致 slave 在重做时,先重做 alter,再重做 update 时就会出现复制错误的现象。
如果当前有很多事务在执行,并且有那种包含大查询的事务,例如:
? 1 2 START TRANSACTION; select count(*) from 你的表这样类似的会执行较长时间的事务,也会阻塞。
所以,原则上:
到此这篇关于MySQL 大表添加一列的实现的文章就介绍到这了,更多相关MySQL 大表添加一列内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/zhxdick/article/details/112857581
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了javascript实现多级联动下拉菜单的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:列表一列表二列表三列表四希望本文所述对大
一、基本用法1.增加列altertabletbl_nameaddcol_nametype例如,给pet的表增加一列weight,mysql>altertable
Excel数据表中可能会出现重复的数据,有时需要将这些重复数据统计出来,如何实现呢? 比如这有一个表,有两列数据,一列是数据成绩满分的同学,一列是语文成绩
Excel数据表中可能会出现重复的数据,有时需要将这些重复数据统计出来,如何实现呢?比如我这有一个表,有两列数据,一列是数据成绩满分的同学,一列是语文成绩满分的
主键(PRIMARYKEY)来自MSDN的描述:表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键(PK),用于强制表的实体完整性