精华内容
下载资源
问答
  • MySQL系列-DDL语句运维少年 运维少年系列文章说明MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节为数据库...

    MySQL系列-DDL语句

    运维少年 运维少年

    系列文章说明

    MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节为数据库DDL语句。

    DDL语法

    DDL(数据定义语言)主要用于数据库和表的管理。主要语法为drop、alter和create。

    DDL CREATE

    create主要用于创建数据库或者表。

    创建数据库

    语法:create database 数据库名 charset 字符集;

    create database yunweidb charset utf8mb4;

    查看所有数据库

    show databases;

    e20a7a4ca7de14a7b54ce51c513384e5.png

    查看创建数据库语句

    show create database yunweidb;

    eb731f35f480898dafb1ad7e256223e9.png

    创建表

    语法:create table 数据库.表名(列名1 数据类型,列名2 数据类型...) engine=引擎 charset=字符集;

    create table yunweidb.t1(id int,sname varchar(20)) engine=innodb charset='utf8mb4';

    查看表结构

    desc yunweidb.t1;

    85eff90e3b64bfce53f4cbc66ff06e4f.png

    查看数据库中的所有表

    use yunweidb;

    show tables;

    6f5987106d60f08c17f2c0c5976e2108.png

    查看建表语句

    show create table t1;

    656c1af5b59040f1fc68d25f3a9c2eb2.png

    DDL DROP

    DROP主要是用于删除数据库或表。

    删除数据库

    语法:drop database 数据库名称;

    drop database yunweidb;

    删除表

    语法:drop table 表名;

    drop table t1;

    DDL alter

    alter主要用于对数据库和表进行修改。

    MySQL中,DDL语句对表进行创建、删除、修改表等DDL操作时,是需要锁元数据表的,锁定时,所有对该表修改类的命令都无法正常运行,所以在对于大表、业务较繁忙的表进行线上DDL操作时,要谨慎。

    修改数据库

    语法:alter database 数据库表名 属性;

    alter database yunweidb charset utf8;

    查看表结构

    387908097555832798c68e5f96ec300d.png

    增加列

    语法:alter table 表名 add column 列名 数据类型 属性 ;

    alter table t1 add column phone char(11);

    查看表结构

    81706a5c4422a989dcb8c3dbae016c11.png

    修改列

    语法:alter table 表名 modify 列名 属性;

    alter table t1 modify phone bigint;

    查看表结构

    b3f85007d9ec1069aa1062cf97cfe484.png

    注意

    修改列时,应该把原先的属性加上,以免属性丢失

    删除列

    语法:alter table 表名 drop 列名;

    alter table t1 drop sname;

    查看结构

    e30d345f28a035e4054b0c7aee298777.png

    标签:语句,数据库,DDL,语法,MySQL,table,create,alter

    来源: https://blog.51cto.com/15082392/2656136

    展开全文
  • 用于Mysql DDL的Intellij IDEA插件和PlantUML转换。 安装 从插件市场和磁盘安装此插件 定义符号 象征 解释 例子 # 首要的关键 # ID:BIGINT(20) << pk>> 首要的关键 id:bigint(20) <<pk>> * 非空 ...
  • OGG DML 安装配置请参考:在Windows中 基于Oracle GoldenGate (OGG)进行MySQL-&gt;MySQL数据库同步配置...MySQL DDL同步,试验环境: 试验环境 源端软件版本 目标端软件版本 操作系统 Windows 10 64...
    OGG DML 安装配置请参考:在Windows中 基于Oracle GoldenGate (OGG)进行MySQL->MySQL数据库同步配置(超详细)

    下列操作默认已配置 OGG DML

    Oracle GoldenGate Windows平台MySQL->MySQL DDL同步,试验环境:
    试验环境源端软件版本目标端软件版本
    操作系统Windows 10 64位Windows 10 64位
    IP地址172.16.94.37127.21.112.125
    数据库mysql-5.7.25mysql-5.7.25
    数据库账号projectprojectTarget
    数据库表projectproject_target
    GoldenGateOracle GoldenGate 12.3.0.1.2 for MySQL on Windows (64bit) (72 MB)Oracle GoldenGate 12.3.0.1.2 for MySQL on Windows (64bit) (72 MB)
    dirdat目录D:\OGG\oggmsql\dirdatF:\OGG\oggmsql\dirdat

    注意:DDL 目前只支持 mysql 5.7 版本
    mysql 5.7下载地址:https://dev.mysql.com/downloads/windows/installer/5.7.html

    一、【配置】

    1、修改 MySQL 配置文件my.ini

    • mysql 配置文件 my.ini 中找到 [mysqld] 添加以下内容:

    binlog-ignore-db=oggddl
    binlog_format=row

    my.ini文件位置(Windows):https://jingyan.baidu.com/article/7e4409531f75292fc0e2efe7.html

    2、安装 DDL 插件

    • 在ogg安装目录执行 :ddl_install.cmd install project "project" 3306
    D:\OGG\oggmsql>ddl_install.cmd install project "project" 3306
    You have selected the option: "install"
    checking MySQL version number
    DDL is supported for your installed MySQL version.
    plugin_dir: C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\
    The metadata_server started successfully.
    Copying ddl_rewriter plugin
    已复制         1 个文件。
    copying of ddl_rewriter.dll succeeded
    
    Copying ddl_metadata plugin
    已复制         1 个文件。
    copying of ddl_metadata.dll succeeded
    
    Plugins installation was successful.
    Installation was successful.
    

    ddl插件命令指南
    ddl_install.cmd start project “project” 3306 > 启动ddl插件
    ddl_install.cmd stop project “project” 3306 > 停止ddl插件
    ddl_install.cmd restart project “project” 3306 > 重启ddl插件
    ddl_install.cmd status project “project” 3306 > 查询ddl插件状态
    ddl_install.cmd install project “project” 3306 > 安装ddl插件
    ddl_install.cmd uninstall project “project” 3306 > 卸载ddl插件

    注意这里完成后需要重启mysql服务,使参数生效

    3、配置extract抽取进程,输入edit params eora将会弹出文本编辑器并写入:

    GGSCI (SC-201708231409 DBLOGIN as project) 15> edit params eora
    

    以下是添加内容:

    extract eora
    sourcedb project@127.0.0.1:3306 userid project password project
    TranLogOptions AltLogDest D:\OGG\mysqlbin\binlog.index
    exttrail D:\OGG\oggmsql\dirdat\et
    ddl include mapped
    table project.*;

    输入命令:alter extract eora, tranlog, begin now

    GGSCI (SC-201708231409 DBLOGIN as project) 15> alter extract eora, tranlog, begin now
    

    4、重启各进程,修改表结构,检测是否修改成功

    二、【GoldenGate 错误解决方案】

    1、问题:'cp' 不是内部或外部命令,也不是可运行的程序或批处理文件、找不到 C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\ddl_rewriter.dll、找不到 C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\ddl_metadata.dll

    D:\OGG\oggmsql>ddl_install.cmd install project "project" 3306
    You have selected the option: "install"
    checking MySQL version number
    DDL is supported for your installed MySQL version.
    plugin_dir: C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\
    The metadata_server started successfully.
    Copying ddl_rewriter plugin
    'cp' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    找不到 C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\ddl_rewriter.dll
    找不到 C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\ddl_metadata.dll
    成功: 给进程 "metadata_server.exe" 发送了终止信号,进程的 PID 为 4948。
    "ERROR: The copy of the ddl_rewriter.dll failed."
    We encounter problem while installation. Run install again to set up the ddl replication.
    

    原因:ddl_install.cmd 脚本使用了 linux 命令“cp”

    解决方法:使用编辑器打开 ddl_install.cmd 脚本,将修改 “cp” 为 “copy”

    'cp' 不是内部或外部命令.png

    2、问题:ERROR OGG-00146 Oracle GoldenGate Capture for MySQL, EORA.prm: Call to VAMControl returned with error status 600: VAM Client Report <CAUSE OF FAILURE : The DDL version is not found in the binlog.Please check if the ddl plugins installed

    解决方法:GGSCI (DESKTOP-LDTMM0I) 18> alter extract eora, tranlog, begin now

    展开全文
  • mysql ddl 与临时文件

    2017-01-23 16:39:30
    本篇博客主要通过测试的方式对比说明明几种常见mysql ddl操作对临时表的使用情况(所有测试都是基于mysql 5.6.26版本)。测试将分为两个大部分,第一部分测试非 online ddl对临时表的使用情况,第二部分测试几种online...

        本篇博客主要通过测试的方式对比说明明几种常见mysql ddl操作对临时表的使用情况(所有测试都是基于mysql 5.6.26版本)。测试将分为两个大部分,第一部分测试非 online ddl对临时表的使用情况,第二部分测试几种online ddl对临时表的使用

    一:非online ddl

    1. modify column

    1.1 执行前后tmpdir空间使用情况对比

    执行 modify column命令前
    mysqld    15163     mysql    5u      REG              253,0           0    1705027 /tmp/ibyZaEuD (deleted)
    mysqld    15163     mysql    6u      REG              253,0           0    1709281 /tmp/ibvS2yru (deleted)
    mysqld    15163     mysql    7u      REG              253,0           0    1709283 /tmp/ibwFauol (deleted)
    mysqld    15163     mysql    8u      REG              253,0           0    1711007 /tmp/ibLzqVO4 (deleted)
    mysqld    15163     mysql   13u      REG              253,0           0    1711035 /tmp/ibphDN2X (deleted)
    
    执行后(之前前后没有变化,/tmp 目录下也没有观察到生产新的临时文件,说明非online ddl没有使用tmpdri目录)
    mysqld    15163     mysql    5u      REG              253,0           0    1705027 /tmp/ibyZaEuD (deleted)
    mysqld    15163     mysql    6u      REG              253,0           0    1709281 /tmp/ibvS2yru (deleted)
    mysqld    15163     mysql    7u      REG              253,0           0    1709283 /tmp/ibwFauol (deleted)
    mysqld    15163     mysql    8u      REG              253,0           0    1711007 /tmp/ibLzqVO4 (deleted)
    mysqld    15163     mysql   13u      REG              253,0           0    1711035 /tmp/ibphDN2X (deleted)

    1.2 命令执行前后df -h情况对比

    df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-LogVol01
                           34G  6.9G   25G  22% /
    tmpfs                 1.9G   12K  1.9G   1% /dev/shm
    /dev/sda1             190M   33M  148M  19% /boot
    
    ...执行modify column后,命令未结束之前test_s所在目录(/data)空间使用率一直在增长

    1.3 命令执行前后test_s表所在目录文件情况

    执行前
    -rw-rw---- 1 mysql mysql       25918 Jan 23 10:45 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 11:32 test_s.ibd
    
    执行中
    表所在目录下查看发现(其中#sql-3b3b_2.ibd文件大小一直在增加)
    -rw-rw---- 1 mysql mysql       25918 Jan 23 10:45 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 11:32 test_s.ibd
    -rw-rw---- 1 mysql mysql       25918 Jan 23 14:08 #sql-3b3b_2.frm
    -rw-rw---- 1 mysql mysql  6194987008 Jan 23 14:20 #sql-3b3b_2.ibd
    
    在命令接近完成时连续多次执行ls -lrt发现
    -rw-rw---- 1 mysql mysql       25918 Jan 23 10:45 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 11:32 test_s.ibd
    -rw-rw---- 1 mysql mysql       25918 Jan 23 14:08 #sql-3b3b_2.frm
    -rw-rw---- 1 mysql mysql 15179186176 Jan 23 14:44 #sql-3b3b_2.ibd  >>命令完成后test_s.ibd大小为15179186176
    ......
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 11:32 #sql2-3b3b-2.ibd >>注意此时应该是在进行rename操作
    -rw-rw---- 1 mysql mysql       25918 Jan 23 14:08 test_s.frm
    -rw-rw---- 1 mysql mysql 15179186176 Jan 23 14:44 test_s.ibd
    
    modify命令完成后查看test_s表所在目录
    -rw-rw---- 1 mysql mysql       25918 Jan 23 14:08 test_s.frm
    -rw-rw---- 1 mysql mysql 15179186176 Jan 23 14:45 test_s.ibd  >>test_s.ibd大小变为15179186176
    ##总结:mysql执行非online ddl时不会在tmpdir目录下生成临时表,而是在表所在目录生成以两个“#sql-”为前缀的临时表(一个frm一个ibd),并且这两个临时表是可以通过ls 命令查看到的,非online ddl所需的临时空间大小大致为所操作表的大小。


    二:online ddl

    1. add column

    1.1 执行前后tmpdir空间使用情况对比

    执行前
    mysqld    15163     mysql    5u      REG              253,0           0    1705027 /tmp/ibyZaEuD (deleted)
    mysqld    15163     mysql    6u      REG              253,0           0    1709281 /tmp/ibvS2yru (deleted)
    mysqld    15163     mysql    7u      REG              253,0           0    1709283 /tmp/ibwFauol (deleted)
    mysqld    15163     mysql    8u      REG              253,0           0    1711007 /tmp/ibLzqVO4 (deleted)
    mysqld    15163     mysql   13u      REG              253,0           0    1711035 /tmp/ibphDN2X (deleted)
    
    执行中(比执行前/tmp目录下多出几个被标记为deleted的,并且大小一直在增大)
    mysqld    15163     mysql    5u      REG              253,0           0    1705027 /tmp/ibyZaEuD (deleted)
    mysqld    15163     mysql    6u      REG              253,0           0    1709281 /tmp/ibvS2yru (deleted)
    mysqld    15163     mysql    7u      REG              253,0           0    1709283 /tmp/ibwFauol (deleted)
    mysqld    15163     mysql    8u      REG              253,0           0    1711007 /tmp/ibLzqVO4 (deleted)
    mysqld    15163     mysql   13u      REG              253,0           0    1711035 /tmp/ibphDN2X (deleted)
    mysqld    15163     mysql   21u      REG              253,0           0    1711046 /tmp/ibgMEUXQ (deleted)
    mysqld    15163     mysql   22u      REG              253,0  6137315328    1721136 /tmp/iby9PKuZ (deleted)
    mysqld    15163     mysql   23u      REG              253,0   360710144    1721137 /tmp/ibxuuB17 (deleted)
    mysqld    15163     mysql   24u      REG              253,0   128974848    1721139 /tmp/ibvZmsyg (deleted)
    mysqld    15163     mysql   25u      REG              253,0   115343360    1721151 /tmp/ibBKuj5o (deleted)
    mysqld    15163     mysql   26u      REG              253,0           0    1721152 /tmp/ibF8QaCx (deleted)
    
    在命令执行6分钟后大小定格在(此时df -h目录使用率也不在变化)
    mysqld    15163     mysql    5u      REG              253,0           0    1705027 /tmp/ibyZaEuD (deleted)
    mysqld    15163     mysql    6u      REG              253,0           0    1709281 /tmp/ibvS2yru (deleted)
    mysqld    15163     mysql    7u      REG              253,0           0    1709283 /tmp/ibwFauol (deleted)
    mysqld    15163     mysql    8u      REG              253,0           0    1711007 /tmp/ibLzqVO4 (deleted)
    mysqld    15163     mysql   13u      REG              253,0           0    1711035 /tmp/ibphDN2X (deleted)
    mysqld    15163     mysql   21u      REG              253,0           0    1711046 /tmp/ibgMEUXQ (deleted)
    mysqld    15163     mysql   22u      REG              253,0 11622416384    1721136 /tmp/iby9PKuZ (deleted)
    mysqld    15163     mysql   23u      REG              253,0   662700032    1721137 /tmp/ibxuuB17 (deleted)
    mysqld    15163     mysql   24u      REG              253,0   235929600    1721139 /tmp/ibvZmsyg (deleted)
    mysqld    15163     mysql   25u      REG              253,0   184549376    1721151 /tmp/ibBKuj5o (deleted)
    mysqld    15163     mysql   26u      REG              253,0 11622416384    1721152 /tmp/ibF8QaCx (deleted)

    1.2 命令执行前后df -h情况对比

    执行前
      df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-LogVol01
                           34G  6.9G   25G  22% /
    tmpfs                 1.9G   12K  1.9G   1% /dev/shm
    /dev/sda1             190M   33M  148M  19% /boot
    /dev/mapper/data_vg-data_lv
                          296G  180G  102G  64% /data
    执行中(/data/使用率没有变化,根目录使用率一直上升,最后定格在)
    df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-LogVol01
                           34G   30G  2.0G  94% /
    tmpfs                 1.9G   12K  1.9G   1% /dev/shm
    /dev/sda1             190M   33M  148M  19% /boot
    /dev/mapper/data_vg-data_lv
                          296G  180G  102G  64% /data

    1.3 命令执行前后test_s表所在目录文件情况

    命令执行前后对比test_s表所在目录文件
    执行前
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 17:08 test_s.ibd
    
    执行中多出1个以"#sql-"开头的frm临时文件,一个以#sql-ib开头的ibd临时文件,但是这两个临时文件大小一直不变(如果此时没有其他队test_s表的操作,test_s.frm和test_s.ibd文件大小也是一直不变的)
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 17:08 test_s.ibd
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 #sql-3b3b_c.frm
    -rw-rw---- 1 mysql mysql      147456 Jan 24 08:58 #sql-ib113-483112083.ibd
    
    
    ......当/tmp下临时文件大小稳定不变一段时间后,我们发现test_s目录下#sql-ib113-483112083.ibd文件渐渐增长
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 17:08 test_s.ibd
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 #sql-3b3b_c.frm
    -rw-rw---- 1 mysql mysql  3124756480 Jan 24 09:25 #sql-ib113-483112083.ibd
    
    
    接近完成时
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 17:08 test_s.ibd
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 #sql-3b3b_c.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 24 09:40 #sql-ib113-483112083.ibd  >>注意新的ibd文件一般不会同旧的大小一致,这里只是巧合
    
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 23 17:08 #sql-ib114-483112084.ibd  >>这时在进行rename操作了
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 #sql-3b3b_c.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 24 09:40 test_s.ibd
    
    ...
    -rw-rw---- 1 mysql mysql       25918 Jan 23 16:28 test_s.frm
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 #sql-3b3b_c.frm  >>这时临时的ibd文件已经不存在
    -rw-rw---- 1 mysql mysql 14331936768 Jan 24 09:40 test_s.ibd
    
    ...
    -rw-rw---- 1 mysql mysql       25972 Jan 24 08:58 test_s.frm
    -rw-rw---- 1 mysql mysql 14331936768 Jan 24 09:40 test_s.ibd  >>此时add column这个online ddl动作已经完成

    ##总结,在进行online ddl操作时,会在表所在数据库目录下生成#sql中间表(同非online ddl不一样的是ibd中间表前缀为#sql-ib),同时也会在tmpdir目录下生成临时文件(但是只能通过lsof命令观察)。在进行add column,optimize table等online ddl时,在tmpdir目录下,大致需要两倍表大小的空间。在表所在数据库下大概需要一倍表大小的空间


    2. add index

    2.1 执行前后tmpdir空间使用情况对比



    2.2 命令执行前后df -h情况对比


    2.3 命令执行前后test_s表所在目录文件情况





    ##目前发现 mysql中online ddl操作和order by操作(内存中无法完成的排序)都会在tmpdir目录下生成临时文件(losf观察)

    展开全文
  • Mysql DDL常见操作汇总

    2020-12-14 07:06:07
    库的管理 创建库 create database [if not exists] 库名...mysql> show databases like 'javacode2018'; +-------------------------+ | Database (javacode2018) | +-------------------------+ | javacode2018 | +-
  • MySQL ddl语句的使用

    2020-12-14 07:01:35
    DDL 数据定义语言 create、drop、alter 数据定义语言 create、drop、alter 语句 。 DML 数据操纵语言 insert、delete、update 定义对数据库记录的增、删、改操作。 DQL 数据库查询语言 select 定义对数据库...
  • MySQL DDL详情揭露

    2020-01-17 10:55:03
    MySQLDDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变更。本篇文章会揭露各类DDL...

    前言: 

    MySQL中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变更。本篇文章会揭露各类DDL语句执行的详细情况。

    1.Online DDL简介

    在MySQL的早期版本中,DDL操作因为锁表会和DML操作发生锁冲突,大大降低并发性。在早期版本中,大部分DDL操作的执行原理就是通过重建表的方式,因为要复制原表数据,所以会长时间锁表,只能读不能写,DDL操作和DML操作有很严重的冲突。从MySQL5.6开始,很多DDL操作过程都进行了改进,出现了Online DDL,用于支持DDL执行期间DML语句的并行操作,提高数据库的吞吐量。

    MySQL 在线DDL分为 INPLACECOPY 两种方式,通过在ALTER语句的ALGORITHM参数指定。

    • ALGORITHM=INPLACE,可以避免重建表带来的IO和CPU消耗,保证ddl期间依然有良好的性能和并发。
    • ALGORITHM=COPY,需要拷贝原始表,所以不允许并发DML写操作,可读。这种copy方式的效率还是不如 inplace ,因为前者需要记录undo和redo log,而且因为临时占用buffer pool引起短时间内性能受影响。

    上面只是 Online DDL 内部的实现方式,此外还有 LOCK 选项控制是否锁表,根据不同的DDL操作类型有不同的表现:默认MySQL尽可能不去锁表,但是像修改主键这样的昂贵操作不得不选择锁表。

    • LOCK=NONE,即DDL期间允许并发读写涉及的表,比如为了保证 ALTER TABLE 时不影响用户注册或支付,可以明确指定,好处是如果不幸该 alter语句不支持对该表的继续写入,则会提示失败,而不会直接发到库上执行。
    • LOCK=SHARED,即DDL期间表上的写操作会被阻塞,但不影响读取。
    • LOCK=DEFAULT,让mysql自己去判断lock的模式,原则是mysql尽可能不去锁表
    • LOCK=EXCLUSIVE,即DDL期间该表不可用,堵塞任何读写请求。如果你想alter操作在最短的时间内完成,或者表短时间内不可用能接受,可以手动指定。

    但是有一点需要说明,无论任何模式下,Online DDL开始之前都需要一个短时间排它锁(exclusive)来准备环境,所以alter命令发出后,会首先等待该表上的其它操作完成,在alter命令之后的请求会出现等待waiting meta data lock。同样在DDL结束之前,也要等待alter期间所有的事务完成,也会堵塞一小段时间。所以尽量在ALTER TABLE之前确保没有大事务在执行,否则一样出现连环锁表。

    2.不同类DDL操作详情

    不同种类DDL语句具体的执行情况是不同的,下表列举出常见DDL语句具体的执行详情,包括是否允许读写及是否锁表。这个表格希望大家可以详细对比看下,特别要关注下需要copy table的DDL操作。

    操作支持方式Allow R/W说明
    add/create indexonline允许读写当表上有FULLTEXT索引除外,需要锁表,阻塞写
    drop indexonline允许读写操作元数据,不涉及表数据。所以很快,可以放心操作
    optimize tableonline允许读写当带有fulltext index的表用copy table方式并且阻塞写
    alter table...engine=innodbonline允许读写当带有fulltext index的表用copy table方式并且阻塞写
    add columnonline允许读写(增加自增列除外)1、添加auto_increment列要锁表,阻塞写;2、虽采用online方式,但是表数据需要重新组织,所以增加列依然是昂贵的操作
    drop columnonline允许读写(增加自增列除外)同add column,重新组织表数据,,昂贵的操作
    Rename a columnonline允许读写操作元数据;不能改列的类型,否则就锁表
    Reorder columnsonline允许读写重新组织表数据,昂贵的操作
    Make column NOT NULLonline允许读写重新组织表数据,昂贵的操作
    Change data type of column copy table仅支持读,阻塞写 创建临时表,复制表数据,昂贵的操作
    Set default value for a columnonline允许读写操作元数据,因为default value存储在frm文件中,不涉及表数据。所以很快,可以放心操作
    alter table xxx auto_increment=xx online允许读写操作元数据,不涉及表数据。所以很快,可以放心操作 
    Add primary keyonline允许读写昂贵的操作
    Convert character set copy table仅支持读,阻塞写如果新字符集不同,需要重建表,昂贵的操作

    3.DDL最佳实践

    虽然MySQL 5.6和5.7版本提供了Online DDL操作,但Online DDL仍存在以下问题:

    • 主从复制延迟,只有主库上DDL执行成功才会写入到binlog中,而DDL操作在从库上不能并发执行,因此即使主库执行DDL时允许并发DML操作,对于大表操作,仍会引发严重的复制延迟。
    • 主库执行Online DDL时,不能根据负载暂停DDL操作。
    • 使用Inplace方式执行的DDL,发生错误或被KILL时,需要一定时间的回滚期,执行时间越长,回滚时间越长。
    • 使用Copy方式执行的DDL,需要记录过程中的undo和redo日志,同时会消耗buffer pool的资源,效率较低,优点是可以快速停止。
    • Online DDL并不是所有时间段的Online,在特定时间段需要加元数据锁或其他锁。
    • 允许并发DML的DDL,可能会导致Duplicate entry问题。

    针对DDL,下面整理下几点干货建议,之后执行DDL语句时可以参考下:

    1. 执行DDL前查看下该表有没有被事务占用,防止出现MDL锁。
    2. 执行DDL前确保datadir,tmpdir磁盘空间足够。
    3. 能业务低峰期操作的DDL,都尽量安排在业务低峰期进行。
    4. 对于大表和较大表,如果对复制延迟和主库性能敏感,建议改为gh-ost或pt-osc工具。
    5. 对于并发操作较高的表,无论表数据量多少,不能在业务高峰期操作。
    6. 同个表的多个DDL语句可以合并在一起进行,避免多次table rebuild带来的消耗。但是也要注意分组,比如需要copy table和只需inplace就能完成的,应该分两个alter语句。

    参考: 

    公众号.jpg

    展开全文
  • MySQL DDL记录

    千次阅读 2019-03-14 17:45:31
    DDL(data definition language)数据库定义语言:其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上 二...
  • mysqlDDL操作

    2017-05-11 15:44:34
    校验是否安装成功登录:mysql -u...启动mysql服务 net stop mysql;关闭mysql服务 services.msc;打开本地服务界面 对数据库进行操作 创建数据库 create database 数据库名; create database 数据库名 character se
  • mysqlddl的使用

    2018-04-01 21:19:14
    数据库是按照数据的结构来组织,存储,和管理数据的仓库,简而言之,就是存放数据的仓库
  • MySQL DDL 基础语句

    2020-04-27 18:41:21
    (MySQL) SQL 语句基础 假设现在有数据库 lian_xi 里面有表 user 和 orders; 1.1登陆MySQL环境 在cmd窗口中输入mysql -u root -p登录MySQL环境 1.2查看数据库 Show databases; 1.3使用数据库 User 表名; Use lian_...
  • # 删除名为 db_name 的数据库 drop database db_name; # 若 db_name 存在则删除 drop database if exists db_name;
  • Is there any free tool for Windows that converts MySQL DDL to Oracle DDL? 解决方案 This site really worked for me and it can convert a bunch of different DDL commands from Oracle, MySql, M$ Sql ...
  • Mysql DDL DML DCL DQL语句

    千次阅读 2020-12-27 18:33:05
    DDL语句 数据库定义语言 创造框架 数据库、表、视图、索引、存储过程 创建库 select version(),current_date #查询数据库的版本和系统时间 create database 库名; # 创建库 show databases; # 列出所有的库 use ...
  • 该文档基于windows DOS命令行环境下进行DDL,DCL,DML基础语法练习,包括数据库,表的创建,删除,修改,子查询,表连接,用户创建,授权等。
  • 1.创建MySQL的连接: # ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 到ogg的目录安装插件: #cd /usr/local/ogg_mysql # ./ddl_install.sh install root oracle 3306 5.7.25-log checking MySQL version ...
  • mysql DDL语言执行过程

    2016-03-01 17:02:17
    由于mysql在线ddl(加字段、加索引等修改表结构之类的操作)过程如下:  A.对表加锁(表此时只读) B.复制原表物理结构 C.修改表的物理结构 D.把原表数据导入中间表中,数据同步完后,锁定中间表,并删除原表 E.rename...
  • MySQL DDL锁表规则

    2020-12-09 10:28:22
    MySQL修改索引、主键、增加删除列会锁表吗? 要细分各种场景的。而且不同版本也有所差异。以下我们针对5.6和5.7两个版本详细说明。
  • 添加字段 ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件][备注]; 末尾新增字段 ALTER TABLE student ADD age INT(4) COMMENT '年龄';...ALTER TABLE student ADD age INT(4) COMMENT '年龄...
  • MySQL DDL锁表情况

    千次阅读 2019-01-31 15:54:24
    DDL的表存在慢查询时,此时对该表做DDL,由于无法获得metadata锁,所以会等待该锁,造成锁表,后续DML操作全部进入等待状态。session1:session2:session3:session4: tips:select sleep(N) from t;表示查询t的...
  • mysql ddl之增加字段

    2021-05-19 10:32:10
    单个字段增加实例 ALTER TABLE `z_board_network_log` add `ip_site` varchar(255) DEFAULT NULL COMMENT 'ip地址' 如果要增加多个字段怎么办呢? 可以像这样,把要增加的字段信息用括号括起来 ...
  • MYSQL DDL DML DCL TCL操作

    2017-02-16 10:39:41
    DDL ----Data Definition Language 数据库定义语言 如 create procedure之类 创建数据库 CREATE DATABASE [IF NOT EXISTS] DBNAME [CHARACTER SET 'CHAR_NAME'] [COLLATE 'COLL_NAME'] 修改:...
  • 工作过程中,经常需要把一些sql的DDL 建表语句,导出到EXCEL,或者表格文档中,当作数据字典,供其他人员进行查看和分析,对于在 windows 或者mac 环境的一些mysql可视化工具差异,导致有的可以直接导出,有的则不行...
  • mysql ddl是否会锁表的问题

    千次阅读 2020-05-12 00:59:48
    今天和同事讨论mysql在线ddl是否会锁表的问题,查了下资料 Mysql在5.6版本之前,直接修改表结构的过程中会锁表,具体的操作步骤如下: (1)首先创建新的临时表,表结构通过命令ALTAR TABLE新定义的结构 (2)然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,376
精华内容 40,550
关键字:

MySQLddl