MySQL5.6在线DDL不锁表(在线添加字段)
解答你也看一下
MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作?
操作如下:
1.注意磁盘空间(临时表目录 参数 tmpdir ,因为需要创建临时表使用 algorithm=default,inplace,copy copy是用临时表的方法
lock=default,none,shared,exclusive)
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
表上不能有任何的外键和触发器,否则不能在线DDL
OSC为facebook的php脚本,用来mysql 在线DDL
触发器将在线DDL期间的DML操作记录到缓存日志rowlog中,到copy的最后redo这些DML日志到表上,实现数据一致
pt-osc工作原理:
如果表有外键,除非使用 --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
大表要结合业务和时间点考虑是否在主上还是先在从上添加
深圳@邱治军 mysql中文网群2015/5/29 10:14:02
没啊
mysql percona mariadb都支持
只要是mysql版本
这工具要维护表的时候最适用了
定期整理mysql innodb 表碎片
前提条件是什么
深圳@邱治军 mysql中文网群 10:29:32
没啥
添加主键要注意一下
普通字段没啥
在从库上添加,再在主库上添加
1、在从库设置stop slave; set sql_log_bin=0;
2、在从库添加字段,不要用pt-osc,从库不能创建触发器,直接加字段就行alter table add column
3、在从库设置start slave; set sql_log_bin=1;
4、用mha做在线主从切换
5、在主库设置set sql_log_bin=0;stop slave;
6、主库加字段 ,不要用pt-osc,从库不能创建触发器,直接加字段就行alter table add column
7、在主库设置start slave; set sql_log_bin=1;
MySQL5.6在线DDL不锁表(在线添加字段)的更多相关文章
- mysql 在线加索引 锁表
mysql在线修改表结构大数据表的风险与解决办法归纳 - 王滔 - 博客园 http://www.cnblogs.com/wangtao_20/p/3504395.html MySQL 加索引 加字段 ...
- MySQL Workbench 创建数据库,添加新表,添加字段
建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!! 一下刚刚建立好的数据库,然后再创建表,不然会出 ...
- mysql5.6创建索引导致锁表阻塞查询
结论:添加索引时,若果有对该表的慢查询,会导致索引添加延时等待 添加索引语句:alter table tb_name add index idx_xx(col_name); 执行添加索引的SQ ...
- 往sql数据库表中添加字段
通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] add 字段名 smallin ...
- MySQL之数据库和表的基本操作(建立表、删除表、向表中添加字段)
介绍关于数据库和表的一些基本操作 添加字段.给字段添加注释 ); ) COMMENT '统一社会信用代码录入单位'; ,) 更改字段类型 ,) COMMENT '一头签收,@0或空不用,1必须'; 有 ...
- Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
最近项目中使用了GreenDAO的3.0以上的版本,出现需要增加删除表的需求,刚开始用,发现官方对增加和删除的方法是每次去修改数据库版本号,版本一旦升级,那么原来数据库中的表会全部删除再重建.太麻烦, ...
- Oracle创建表、删除表、修改表(添加字段、修改字段、删除字段)语句总结
创建表: create table 表名 ( 字段名1 字段类型 默认值 是否为空 , 字段名2 字段类型 默认值 是否为空, 字段名3 字段类型 默认值 是否为空, ...... ); 创建一个us ...
- oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性
1.创建表 create table 表名( classid number() primary key, 表字段 数据类型 是否允许为空(not null:不为空/null:允许空) 默认值(defa ...
- SQL 向表中添加字段
如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字段属 ...
随机推荐
- 【资料搜集】DirectX学习
[网站推荐:]GameRes游资网-游戏开发者门户 http://www.gameres.com/ [基础知识:] <游戏编程>第一部 基础篇 - GameRes.com http://d ...
- Mysql 实列结构-进程
一.MySQL后台进程简介 master thread与四大I/O线程:read thread.write thread.redo log thread.change buffer thread与 p ...
- MATLAB 图像归一化
matlab图像处理为什么要归一化和如何归一化一.为什么归一化1. 基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响.也就是转换成唯一的标准形式以抵抗仿射变换 ...
- python字符串转换成数字
Action(){ int i; char *s="{str}"; i=atoi(lr_eval_string(s)); lr_output_message("%d&qu ...
- 牛客多校第四场 A Ternary String
题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a t ...
- 20165326 java第七周学习笔记
第七周学习笔记 MySQL(数据管理系统)学习 知识点总结: 不能通过关闭MySQL数据库服务器所占用的命令行窗口来关闭MySQL数据库. 如果MySQL服务器和MySQL管理工具驻留在同一台计算机上 ...
- synchronized(七)
package com.bjsxt.base.sync006; /** * 死锁问题,在设计程序时就应该避免双方相互持有对方的锁的情况 * @author alienware * */public c ...
- 界面设计-Edit控件的Style设置
以下文字转贴ChinaCock QQ 223717588群: 1. 首先在Form上放一个TEdit类型控件Edit1,最终的效果如下图: 2.选中控件Edit1,点击鼠标右键,在弹出菜单中选择“Ed ...
- 1--Jmeter4.0连接Oracle数据库
一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...
- [工作日志] 2018-11-21 主要: 改bug 自测 :校验图片后缀名
正则表达式 用以下方式去校验图片的后缀 String reg = ".+(.JPEG|.jpeg|.JPG|.jpg)$";String imgp= "Redocn_20 ...