参考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,测试校验.
通知测试人员进行测试.