MySQL 5.7: 新增的online DDL操作

(这是个汇总文章,后续有新的Online DDL操作 会不断更新…)

1. 支持ALTER TABLE t1 RENAME INDEX idx1 to idx2;

(Server层)语法支持的worklog: http://dev.mysql.com/worklog/task/?id=6555
(Innodb层)Online DDL的worklog: http://dev.mysql.com/worklog/task/?id=6752

新增了语法支持RENAME INDEX操作:

mysql> create table t1 (a int, b int, index x1(a));
Query OK, 0 rows affected (0.00 sec)

mysql> alter table t1 rename index x1 to x2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

主要包含三个过程:
1. Renaming in InnoDB data dictionary (SYS_INDEXES)

2. Renaming in InnoDB data dictionary cache (the dict_table_t/dict_index_t
objects)
3. Renaming in InnoDB persistent stats storage

ref patch: http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/5116

WL#6752WL#6555

2. 支持在线增加VARCHAR列的长度 (反之,如果缩小列长度,则只支持copy ALGORITHM)
worklog: http://dev.mysql.com/worklog/task/?id=6554
目前只支持在255字节内的长度使用IN-PLACE算法,原因是超过255字节,innodb层存储数据表示列长度的部分就得多扩展一个字节。
不支持IN-PLACE 减小字段长度:
在满足上述情况下,直接更新Innodb 系统表SYS_COLUMNS即可。

mysql> create table t1 (a varchar(100));
Query OK, 0 rows affected (0.00 sec)

mysql> alter table t1 ALGORITHM=INPLACE, CHANGE COLUMN a a varchar(5);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

mysql> alter table t1 ALGORITHM=INPLACE, CHANGE COLUMN a a varchar(200);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table t1 ALGORITHM=INPLACE, CHANGE COLUMN a a varchar(256);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

ref patch:http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/5107.1.230

WL#6554

时间: 2024-11-02 07:00:43

MySQL 5.7: 新增的online DDL操作的相关文章

Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

1.  Hive基本操作 1.1  DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type[COMMENT col_comment], ...)] +    [COMMENT table_comment]    [PARTITIONED BY (col_namedata_type [COMMENT col_comment], ...)]    [CLUST

【MySql】M-M 架构下的 DDL 一则

        一个应用的表 auto_inrement 字段为int 类型的,当前已经用了完了!需要重建表结构,又因为生产环境是M-M 架构,为了不影响应用对所操作表的访问,先操作一个备库,执行切换,再操作另一个数据库! 注意 使用  set sql_log_bin=0; 防止对另外的master的影响! 大致的步骤如下: 1 连接备库    use monitor;   set sql_log_bin=0; 2 创建临时表  CREATE TABLE `rrd_value_tmp` (  

如何使用触发器实现数据库级守护,防止DDL操作

触发器|数据|数据库      如何使用触发器实现数据库级守护,防止DDL操作 --对于重要对象,实施DDL拒绝,防止create,drop,truncate,alter等重要操作 Last Updated: Sunday, 2004-10-31 12:06 Eygle        不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失. 通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作. 以下是一个简单的范例,供参

Oracle记录用户DDL操作的脚本

--当前普通用户创建 issgzt create table TAB_DDL ( LOGIN_USER VARCHAR2(60), AUDSID NUMBER, MACHINE VARCHAR2(60), IPADDRESS VARCHAR2(20), SCHEMA_USER VARCHAR2(60), SCHEMA_OBJECT VARCHAR2(60), DDL_TIME DATE, DDL_SQL VARCHAR2(4000), MODULE VARCHAR2(100), SCHEMA_O

如何实现trigger集中记录所有库ddl操作

今天客户说了一个我感觉有意思的需求:在一个库上的一张表记录所有库的ddl操作,实现方式:在一个库上建立表和触发器,其他库上通过dblink+同义词+触发器实现ddl操作记录到远程的表中.他当时写了一个触发器,但是有错误,想让我协助解决.在我们的一起努力下,解决了该触发器在dblink同义词的库上出错的问题.我这里测试使用的是10g的库做为存储所有库的ddl记录的库,11g库做为一个通过dblink插入ddl操作记录的库. 在10g数据库库中操作 1.创建记录ddl操作表 SQL> conn ch

mysql在cmd命令下执行数据库操作

windows+r 运行cmd命令,执行以下操作! 当mysql 数据库文件相对于来说比较大的时候,这个时候你可能在正常环境下的mysql中是导入不进去的,因为mysql数据库本身就有默认的导入文件大小 , 这个时候就要用到 cmd命令去操作mysql数据库了 , 以下我就简单介绍下 , 如何去对mysql 数据库 进行增删改查的操作! 操作一: cd D:\phpStudy\MySQL\bin //使用cd 命令进行查找 mysql 下的bin文件 找到你的安装目录查找即可 操作二: mysq

ibatis-IBATIS像mysql中批量新增问题

问题描述 IBATIS像mysql中批量新增问题 这是ibatis sqlmap中的 sql parameterClass="com.spci.po.MemberMerchant"> <![CDATA[ insert INTO t_member_credit (ID,MEMBER_ID,TRADE_ID,BALANCE) VALUES (#id#,#memberId#,#tradeId#,#balance#) ON DUPLICATE KEY UPDATE BALANCE=

mysql存储过程中变量的定义赋值操作

昨天我们讲了mysql教程存储过程创建修改与删除,下面我们这篇教程是讲关于mysql存储过程中变量的定义赋值操作哦. 一.变量的定义 定义一个变量语法如下: declare var_name[,...] type[default value] 看一个变量定义实例 declare last date; 二.mysql存储过程变量赋值 变量的赋值可直接赋值与查询赋值来操作,直接赋值可以用set来操作,可以是常量或表达式如果下 set var_name= [,var_name expr]... 给上面

MYSQL查看和新增表分区

MYSQL查看和新增表分区 1.查看表分区 SELECT  partition_name part,   partition_expression expr,   partition_description descr,   FROM_DAYS(partition_description) lessthan_sendtime,   table_rows FROM  INFORMATION_SCHEMA.partitions WHERE  TABLE_SCHEMA = SCHEMA()   AND