当前mysql最大的记录数是7亿级

Executing:

1
2
3
4
ALTER TABLE `live_http_origin`.`o_xylive_flashsdk_one_20170414`   
ADD COLUMN `httpdns_resptime` DOUBLE NULL AFTER `httpdns_time`,  
ADD COLUMN `httpdns_clientip` VARCHAR(45) NULL AFTER `httpdns_resptime`,
ADD COLUMN `httpdns_host` VARCHAR(200) NULL AFTER `httpdns_clientip`;

杀死mysql连接

1
mysql -uroot -p123456 -e " show processlist " | grep graph_cluster | awk  '{print "mysql -uroot -p123456 -e \"kill "$1";\";"}' | sh
1
2
grant select,show view on *.* to data@'10.%' identified by '123456';
flush privileges;

虽然 MySQL 5.6 支持了在线 DDL 操作,不过还是有些需要注意的问题,
最为重要的就是参数 innodb_online_alter_log_max_size 的配置。
在进行 DDL 操作时会保存操作时间内产生的日志,这与 facebook OSC 的临时表,但是其保存在内存中,
而该内存的大小由参数 innodb_online_alter_log_max_size 定义,默认大小为 128M。
如果产生的日志超出该容量大小,则会抛出
根据测试经验,128M 通常在一个活跃的线上环境中是不够的,通常 512M 是比较推荐的值。
好在该参数是动态的,可以基于会话级别进行调整。
另外个人的体会是,在进行在线索引添加操作时,数据库性能会有 20~30%的下降。

另一个小技巧是使用
ALTER TABLE … LOCK=NONE 来强制使用在线 DDL 操作,若操作不支持,则会抛出异常,
如:

1
2
3
4
ALTER TABLE customers DROP PRIMARY KEY ,LOCK=NONE;

ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
ALTER TABLE t1 ADD COLUMN new_column int,ALGORITHM=INPLACE,LOCK=DEFAULT;

ALGORITHM 子句用来指定执行 DDL 采用的方式,可取值为 DEFAULT、INPLACE、COPY
ALGORITHM = DEFAULT| INPLACE| COPY
LOCK 子句描述持有的锁类型来控制 DML 的并发,取值 DEFAULT、NONE、SHARED、EXCLUSIVE
LOCK = DEFAULT| NONE | SHARED | EXCLUSIVE

tw1

tw1

Percona 工具 PT-OSC(Percona Toolkit Online Schema Change) PT-OSC 原理如下图:

tw1