欢迎投稿

今日深度:

MariaDB 10.3.8 INSTANT ADD COLUMN(即时加字段),mariadb10.3.8

MariaDB 10.3.8 INSTANT ADD COLUMN(即时加字段),mariadb10.3.8


运行环境:CentOS7.4+MariaDB 10.3.8
背景:
INSTANT ADD COLUMN 功能由 Tencent Games DBA Team贡献.
在MySQL 5.6(MariaDB10.0+)是第一个release支持 inplace DDL。在此之前增加字段是逐行复制。
原来的加字段的方式有如下不足:
1.在MySQL replication场景下大表加字段将花费很长时间并且会导致从库延迟;
2.磁盘空间需要原有表的两倍或更多。
3.DDL操作导致资源紧张,对CPU、IO、内存有更高的要求。DDL操作还会从用户的事务中盗取资源。
4.涉及到replication,slave需要很久才可以看到数据结构的变更,只有等slave的DDL操作完毕才可以。
使用Instant ADD Column的好处:
1.高效的本机二进制格式存储
2.安全的数据类型
3.支持本地索引重建
4.支持约束:唯一约束、检查约束、外键约束
5.支持指定默认值
6.触发器(triggers)更加安全。
使用instant ADD COLUMN 可以享受结构化存储的便利而无需重建表。
限制:
1.加字段只能加到所有列的最后,若指定了列after或者before此时加列的操作需要表重建;
2.表是空表 则使用老的方式重建。
3.不支持ROW_FORMAT=COMPRESSED.
4.instant ADD COLUMN 操作之后的InnoDB 数据文件不能导入到旧格式的MySQL或者MariaDB。任何重建表的操作都会转为老版格式。
5.ALTER TABLE…DROP COLUMN目前的版本还需要重建。
instant ADD COLUMN当前支持的功能:
1.修改索引
2.表重命名
3.set/drop defalt
4.modify column
5.Add/drop virtual columns
6.Add columns(non-generated)
MySQL 版本支持:
MySQL 8.0.12版本加入INSTANT ADD COLUMN功能;MariaDB 10.3.2版本支持该功能。但是二者的语法可能不同。

--示例:
# sysbench --version
sysbench 1.0.15
--生成测试数据:
#sysbench /usr/share/sysbench/oltp_write_only.lua --mysql-host=node4 --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password=oracle --table_size=100000000 --tables=1 --threads=24 --time=120 --report-interval=10 --db-driver=mysql prepare

# sysbench /usr/share/sysbench/oltp_write_only.lua --mysql-host=node4 --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password=oracle --table_size=100000000 --tables=1 --threads=24 --time=120 --report-interval=10 --db-driver=mysql run

MariaDB [(none)]> show variables like '%version%';
+---------------------------------+------------------------------------------+
| Variable_name                   | Value                                    |
+---------------------------------+------------------------------------------+
| innodb_version                  | 10.3.8                                   |
| protocol_version                | 10                                       |
| slave_type_conversions          |                                          |
| spider_version                  | 3.3.13                                   |
| system_versioning_alter_history | ERROR                                    |
| system_versioning_asof          | DEFAULT                                  |
| version                         | 10.3.8-MariaDB-log                       |
| version_comment                 | MariaDB Server                           |
| version_compile_machine         | x86_64                                   |
| version_compile_os              | Linux                                    |
| version_malloc_library          | system                                   |
| version_source_revision         | eaab98f7022732b26b4ea590e1bb44308e253be8 |
| version_ssl_library             | YaSSL 2.4.4                              |
| wsrep_patch_version             | wsrep_25.23                              |
+---------------------------------+------------------------------------------+
14 rows in set (0.157 sec)

MariaDB [sbtest]> select count(1) from sbtest1;
+-----------+
| count(1)  |
+-----------+
| 100000000 |
+-----------+
1 row in set (6 min 59.593 sec)

MariaDB [sbtest]> desc sbtest1;
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int(11)   | NO   | PRI | NULL    | auto_increment |
| k     | int(11)   | NO   |     | 0       |                |
| c     | char(120) | NO   |     |         |                |
| pad   | char(60)  | NO   |     |         |                |
+-------+-----------+------+-----+---------+----------------+
4 rows in set (0.001 sec)

--测试在主库添加字段到从库查看延迟:
1.加字段:
MariaDB [sbtest]> alter table sbtest1 add column cityname varchar(20);
Query OK, 0 rows affected (0.115 sec)
Records: 0  Duplicates: 0  Warnings: 0
2.同时添加多个字段并赋予默认值:
MariaDB [sbtest]> alter table sbtest1 add column createtime  datetime not null DEFAULT CURRENT_TIMESTAMP(),add column lastmodifytime datetime not null DEFAULT CURRENT_TIMESTAMP();
Query OK, 0 rows affected (0.004 sec)
Records: 0  Duplicates: 0  Warnings: 0
3.添加索引(添加索引的过程可以看到进度):
MariaDB [sbtest]> alter table sbtest1 add index ix_sbtest1_lastmodifytime (lastmodifytime);  
Stage: 1 of 1 'Altering table'   99.8% of stage done
Query OK, 0 rows affected (12 min 29.555 sec)       
Records: 0  Duplicates: 0  Warnings: 0
MariaDB添加索引还需要耗时较久导致主从延迟。

4.监控即时加字段:
MariaDB [(none)]> show status like 'innodb_instant_alter_column';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Innodb_instant_alter_column | 2     |
+-----------------------------+-------+
1 row in set (0.001 sec)
这里的表示的监控是快速加字段的执行语句的个数,而不是即时加字段的字段个数。上面我加了3个字段,2个alter语句。


资料参考:
https://mariadb.com/kb/en/library/instant-add-column-for-innodb/
https://mysqlserverteam.com/mysql-8-0-innodb-now-supports-instant-add-column/

 

www.htsjk.Com true http://www.htsjk.com/mariadb/34293.html NewsArticle MariaDB 10.3.8 INSTANT ADD COLUMN(即时加字段),mariadb10.3.8 运行环境:CentOS7.4+MariaDB 10.3.8背景:INSTANT ADD COLUMN 功能由 Tencent Games DBA Team贡献.在MySQL 5.6(MariaDB10.0+)是第一个release支持 inplace DDL。...
相关文章
    暂无相关文章
评论暂时关闭