MySQL5.6在线DDL不锁表(在线添加字段)

MySQL5.6在线DDL不锁表(在线添加字段)

解答你也看一下
MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作?

操作如下:
1.注意磁盘空间(临时表目录)
2.当前内存剩余量
3.当前有没有大的事务在执行
4.innodb_online_alter_log_max_size参数
5.然后在从上添加,再在主上添加(不记录binlog),处理完成后再开启

如果直接先在主上操作,那么会导致主从延迟很大(在量比较大的情况下)。因为主从复制,从库的SQL线程是单进程,它接收到主库的BINLOG,要一条一条执行,一条SQL卡住了,后面的SQL就会排队等待,这时同步就延迟了

附注:

在之前的版本,InnoDB引擎是通过以下步骤来进行DDL的:
1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)----> create table tmp_table like original_table;
2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等,一行行的把原表数据拷贝到临时表里,且更新索引)
3 执行insert into tmp_table select * from original_table
4 rename original_table和tmp_table,最后drop original_table
5 释放 write lock。

如查采用第三方工具推荐使用pt-online-schema-change

工作原理:
如果表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行。
1 判断各种参数,是否符合操作条件
2 创建一个和原表一样的空表结构(tmp_table)
3 执行表结构修改,然后从原表中copy数据到上面创建的新表中
4 在原表上创建3个触发器(名称格式为pt_osc_库名_表名_操作类型),当copy 数据的过程中,把原表的更新操作更新到新表 (注意:如果表中已经定义了触发器这个工具就不能工作了)
CREATE TRIGGER `pt_osc_dba_t_del` AFTER DELETE ON `dba`.`t` FOR EACH ROW DELETE IGNORE FROM `dba`.`_t_new` WHERE `dba`.`_t_new`.`id` <=> OLD.`id`
CREATE TRIGGER `pt_osc_dba_t_upd` AFTER UPDATE ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)
CREATE TRIGGER `pt_osc_dba_t_ins` AFTER INSERT ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)
5 copy 完成以后,用rename table 新表代替原表,默认删除原表 (可以指定参数不删除原表操作)
6 删除触发器
这里要注意的是。。如果是小表。。直接在主上添加了
深圳@邱治军 mysql 中文网 9:46:41

大表要结合业务和时间点考虑是否在主上还是先在从上添加

这个工具只能用在percona DB吗
深圳@邱治军 mysql中文网群2015/5/29 10:14:02
没啊
mysql percona mariadb都支持
只要是mysql版本
这工具要维护表的时候最适用了
定期整理mysql innodb 表碎片

你刚才说在线加字段,需要有前提条件
前提条件是什么
深圳@邱治军 mysql中文网群  10:29:32
没啥
添加主键要注意一下
普通字段没啥

时间: 2024-08-24 05:48:42

MySQL5.6在线DDL不锁表(在线添加字段)的相关文章

MySQL5.6 Online DDL 是否锁表、rebuild表、inplace的说明

Online DDL 是否锁表.是否rebuild表.inplace或copy算法的说明: 原文: https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html?spm=5176.100239.blogcont64664.13.SpL8lH Operation In-Place? Rebuilds Table? Permits Concurrent DML? Only Modifies Metadata? No

MySQL Workbench 创建数据库,添加新表,添加字段

建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出错,右键点击Tables 然后点击Create new tables ,填写表名,以及字段的信息,之后点击  apply ,一张表就建完了. PK: primary key (column is part of a pk)  主键 NN: not null (column is nullable) 

django连接mysql数据库,往数据库表中添加字段

1.在数据库已经连接好,并激活的情况下 2.在models已经写好之后 3.对manage的操作: python manage.py validate   验证模型的有效性,validate 命令检查你的模型的语法和逻辑是否正确 python manage.py sqlall chapter3(项目名)   查看对应的sql语句,可以将其复制到mysql命令客户端,用于创建对应的表,也可以用命令执行: python manage.py syncdb  同步数据库,创建表 4.往对应模块添加字段对

执行sql在一个表中添加字段,加备注

1.加字段: alter table 表名 ADD 字段名 类型; eg: alter table sys_cwzd ADD SCCLLJ VARCHAR2(50); 2.加备注: comment on column 表名.字段名 is '备注名'; eg:comment on column sys_cwzd.SCCLLJ is '上传材料路径'; 原文地址:https://www.cnblogs.com/Cuimc/p/11412191.html

sql向表中添加字段

--关于我们 if not exists (select * from syscolumns where id = object_id('dbo.[表名]') and name = 'aboutUs') begin alter table 表名 add aboutUs text NOT NULL DEFAULT('') with values  --关于我们 end

MySql 建表、添加字段、修改字段SQL语句写法

建表: DROP TABLE IF EXISTS bulletin; CREATE TABLE bulletin( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,             # 主键 uid INT(11) NOT NULL DEFAULT 0,    # 创建者id context VARCHAR(600) NOT NULL DEFAULT '',  # 公告详细内容(300字) begintime DEC(20) NOT NULL DEF

Activiti系列: 如何给内置表单添加字段类型

对于内置的表单,除了原来支持的几种数据类型(string, long, enum, date, boolean, collection)之外,还可以自定义数据类型,比如增加一个javascript数据类型 需要增加一个自定义数据类型的处理类 public class JavascriptFormType extends AbstractFormType { @override public string getName() { return "javascript";} @overri

DB2 建表,添加字段,删除字段,修改字段等常用操作

转载:http://blog.sina.com.cn/s/blog_67aaf4440100v01p.html,稍作修改. --创建数据库 create database Etp; --连接数据库 connect to Etp; --断开连接 disconnect Etp; --查看当前数据库下有哪些表 list tables; --删除表 drop table studentinfo; --创建表的同时添加约束方式1 create table studentinfo( stuNo int no

mysql sql数据库基本操作(创建表,添加字段等)

1.check表里添加update_time字段 ALTER TABLE `check` ADD `update_time` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '上一次更新的时间' AFTER `operator` ; 2.