生产环境加字段

问题

在工作中随着业务的扩展,对表加字段是在所难免的,要怎么加字段呢?执行下面这行语句?

ALTER TABLE 表名 ADD COLUMN 字段 字段类型 DEFAULT 默认值 COMMENT 注释

开发环境想怎么加都可以,生产环境你这样加个试试?表数据稍微大一点直接锁表!!! 后果有多严重可想而知。

解决

1、先确定生产环境的mysql版本,我司项目比较老,使用的mysql是5.1.46。5.6以下版本的mysql是没有online ddl。

针对5.6以下版本的mysql加字段的思路(以people表为例):

CREATE TABLE `people` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
  `age` int(11) DEFAULT '0' COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB 

1)创建一张临时表(people_tmp),idCar是将要新增字段。

CREATE TABLE `people_tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
  `age` int(11) DEFAULT '0' COMMENT '年龄',
  `idCard` varchar(20) DEFAULT '0' COMMENT '身份证',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

2)创建三个触发器,分别是people表插入、修改、删除后触发:

CREATE TRIGGER people_insert_trigger AFTER INSERT ON people FOR EACH ROW 
INSERT INTO people_tmp (id, name, age) VALUE(NEW.id, NEW.name, NEW.age);

CREATE TRIGGER people_update_trigger AFTER UPDATE ON people FOR EACH ROW 
REPLACE INTO people_tmp(id, name, age) VALUE(NEW.id, NEW.name, NEW.age);

CREATE TRIGGER people_delete_trigger AFTER DELETE ON people FOR EACH ROW 
DELETE FROM people_tmp where id = OLD.id; 

3)把people表的数据导入到people_tmp表通过脚本来导入数据(脚本略)

4)重命名,把people->people_bak,people_tmp->people。

RENAME tables people TO people_bak,people_tmp TO people;

5)删除三个触发器

DROP TRIGGER people_insert_trigger;
DROP TRIGGER people_update_trigger;
DROP TRIGGER people_delete_trigger;

总结

生成环境对DB操作一定要慎重,不要随意执行有锁表的sql语句,对于5.6及以上的mysql同样可以通过以上方式进行加字段,不过有更好的解决方案。


版权声明:本文为qq_34928644原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。