mysql5.6在线ddl说明_自己实现在线ddl


参考rul:https://www.cnblogs.com/zengkefu/p/5674945.html


总结如下:

1,除了主键修改,字段类型与长度变更,字符集变更,其他都支持ddl.部分操作占用资源较多.

2,修改前确保没有大事务发生.

3,通过row_log记录ddl过程dml.

4,ddl过程被kill,没有影响.异常掉电,因有临时表影响,需特殊手动修复.



自己实现在线ddl逻辑如下:

1,创建新表
2,根据主键id导入数据;
3,记录关键时间戳
4,改名.编写好改名回滚sql:
5,再次导入数据;
6,测试校验.


(或者模拟percona工具,

1,创建目标表

2,原表创建触发器

3,同事追加数据到目标表

4,完全一致后表名切换)


1,创建新表
CREATE TABLE `rs_plate_trace_vchar` (
  `PLATE_TRACE_ID` varchar(36) NOT NULL COMMENT '主键',
  `PARK_ID` char(36) NOT NULL COMMENT '停车场ID',
  `PARK_CODE` char(36) NOT NULL COMMENT '停车场编码',
  `BAR_CODE` varchar(36) NOT NULL COMMENT '视频设备编码',
  `BERTH_NUMBER` varchar(12) DEFAULT NULL COMMENT '泊位号',
  `PARK_SPACE_ID` char(36) DEFAULT NULL COMMENT '泊位ID',
  `DATA_SOURCE` tinyint(4) DEFAULT NULL COMMENT '数据来源:',
  `IMAGE_TYPE` tinyint(1) NOT NULL COMMENT '图片类型:1=全景,2=特写',
  `IMG_PATH` varchar(200) NOT NULL COMMENT '图片路径',
  `UPLOAD_TIME` datetime DEFAULT NULL COMMENT '上传时间',
  `CREATOR_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '系统创建时间',
  PRIMARY KEY (`PLATE_TRACE_ID`),
  KEY `idx_rs_plate_trace_uploadTime` (`UPLOAD_TIME`),
  KEY `IDX_PLATE_TRACE_BAR_CODE` (`BAR_CODE`),
  KEY `idx_hardCode_imageType_uploadTime` (`BAR_CODE`,`IMAGE_TYPE`,`UPLOAD_TIME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='路侧车牌图片跟踪记录'




2,根据主键id导入数据:


生成导入数据的关键sql:
SELECT group_concat(column_name) FROM `information_schema`.`COLUMNS` where TABLE_NAME ='rs_plate_trace'  and table_schema  ='sjzzhhtdb_temp' LIMIT 0,50;


insert into rs_plate_trace_vchar(
PLATE_TRACE_ID,PARK_ID,PARK_CODE,BAR_CODE,BERTH_NUMBER,PARK_SPACE_ID,DATA_SOURCE,IMAGE_TYPE,IMG_PATH,UPLOAD_TIME,CREATOR_TIME)
 select * from rs_plate_trace where plate_trace_id like 'ffff%';


3,记录关键时间戳 'ffff%'


4,改名.
RENAME  table rs_plate_trace to rs_plate_trace_old;
RENAME  table rs_plate_trace_vchar to rs_plate_trace;


改名回滚sql:
RENAME  table rs_plate_trace  to rs_plate_trace_vchar;
RENAME  table rs_plate_trace_old   to rs_plate_trace;


5,再次导入数据;
insert into rs_plate_trace_vchar(
PLATE_TRACE_ID,PARK_ID,PARK_CODE,BAR_CODE,BERTH_NUMBER,PARK_SPACE_ID,DATA_SOURCE,IMAGE_TYPE,IMG_PATH,UPLOAD_TIME,CREATOR_TIME)
 select * from rs_plate_trace where plate_trace_id like 'ffff%';


6,测试校验.
通知测试人员进行测试.


你可能感兴趣的:(Mysql综合)