MySQL-mysql 如何在alter修改表的时候允许insert或update操作

MySQL-mysql 如何在alter修改表的时候允许insert或update操作

想挽留 发布于 2017-05-20 字数 191 浏览 1185 回复 3

数据库里有一个数据量非常大的表,当对这个表进行alter的时候,这时候该表是只读的,由于数据量很大alter时间很长,如果这时候有insert或update操作,有什么办法在这期间可以进行insert或update操作

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浮生未歇 2017-10-01 3 楼

应该不行吧
alter是原子的,必须检查所有的已有数据符合修改后的结构
你修改表结构,怎么判断修改表结构后insert或者update是否合法?

比如 字段长度由100改为80;有十万条记录,需要十分钟,在这期间根本无法判断是否能够修改成功。
这时你新增了一条长度为90的记录,是报错呢还是让插进去呢??

瑾兮 2017-06-01 2 楼

MySQL在被alter时是可以insert和update的,但是操作会被延迟。以下我引用MySQL官网的解释:
*“ALTER TABLE运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。在执行ALTER TABLE时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表上。

注意,如果您在执行ALTER TABLE时使用除了RENAME以外的选项,则MySQL会创建一个临时表。即使数据并不需要进行复制(例如当您更改列的名称时),MySQL也会这么操作。对于MyISAM表,您可以通过把myisam_sort_buffer_size系统变量设置到一个较高的值,来加快重新创建索引(该操作是变更过程中速度最慢的一部分)的速度。

如果您使用ALTER TABLE tbl_name RENAME TO new_tbl_name并且没有其它选项,则MySQL只对与table tbl_name相对应的文件进行重命名。不需要创建一个临时表。(您也可以使用RENAME TABLE语句对表进行重命名。”*

所以可以看出MySQL在alter时是复制表结构进行的,所以我建议你一个可以节省时间的方案:
1、create table_new ,并且包含去掉了2个多余字段+新增5字段
2、insert into table_new select * from table 复制所有的数据到新的表结构里
3、drop table ; rename table_new to table; 删掉就表,并将新表名字改成原表名

当然,当大表的alter,我建议你还是放在较少人访问的时候去处理(比如:凌晨的时候)

瑾兮 2017-06-01 1 楼

应该是不可以的,手册是如下描诉:
While ALTER TABLE is executing, the original table is readable by other sessions. Updates and writes to the table that begin after the ALTER TABLE operation begins are stalled until the new table is ready, then are automatically redirected to the new table without any failed updates. The temporary table is created in the database directory of the new table.
建议还是暂停其他操作执行ALTER,实在不能停的话就使用两张表了。按新结构建表,将旧数据同步至新表。切换运用到新表,再将可能未同步完成的旧数据同步至新表。