更改mysql表字段属性的方法

你可能会说不就是alter table么,当然这个alter操作的确可以实现,但是当你数据库的表的记录有很多的时候,这样做会阻塞mysql服务。而且如果数据量很大,这个操作是相当缓慢的,因为通常情况下alter操作会引起表重建。
但其实所有的表结构都是保存在.frm这个文件中的,这种方式就是直接替换.frm的方式。操作如下:


环境:mysql 5.5.20

基本的原理就是为想要修改的表创建一个新的.frm文件,然后用它替换掉已经存在的那张表的.frm文件:
1.创建一张有相同结构的空表,然后进行需要的修改。create table xxxx like xxx;
2.执行flush tables with read lock关闭正在使用的表,禁止写入,禁止任何表被打开。
3.交换.frm文件
4.unlock tables解除第二步的锁定。

demo:
1.create table user_new like user;
2.alter table column perm set('can_read','can_write','can_delete','can_update') default 'can_read';
3.flush tables with read lock;
这段操作的做用是,在perm权限字段添加了can_update这个只是做了一个例子,可能和实践业务关系不大,具体问题具体分析,
4.然后mv user.frm user_tmp.frm
mv user_new.frm user.frm
mv user_tmp.frm user_new.frm
这样做如果发现出现问题也可以快速的切换过来。
5.unlock tables;
6.重启服务
7.如果没有问题删除中间表drop table user_new;
这个在innodb引擎测试下没有问题,但是myisam测试好像是不行的,此方法比较骇客,慎用。并且做好备份工作。

标签: 原创, mysql

添加新评论