MySQL大表加字段,新增字段迁移过程报错the total number of locks exceeds the lock table size错误解决方案

 

报错原因:the total number of locks exceeds the lock table size错表明mysql的默认配置无法满足大表的操作的需求了,然后需要我们手动去配置InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。

1.查询innodb_buffer_pool_size参数缓冲池字节大小,执行命令:show variables like "%_buffer_pool_size%";

   默认的innodb_buffer_pool_size=8388608。

2.修改 innodb_buffer_pool_size的值为 67108864 (3*1024*1024*1024 = 3G)

      执行命令:SET GLOBAL innodb_buffer_pool_size=67108864;

3.重启MySQL服务

现在再给复制表结构、复制数据。

给一张表加字段执行以下 sql 就可以了:

1

ALTER TABLE tbl_tpl ADD title(255) DEFAULT 0 COMMENT '标题' AFTER id;

普通的添加索引sql

ALTER TABLE `table_name` ADD INDEX `num` (`num`) ;

但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了。

那么,给 MySQL 大表加字段的思路如下:

① 创建一个临时的新表,首先复制旧表的结构(包含索引)

create table new_table like old_table;

② 给新表加上新增的字段

③ 把旧表的数据复制过来

insert into new_table(filed1,filed2…) select filed1,filed2,… from old_table

④ 删除旧表,重命名新表的名字为旧表的名字

不过这里需要注意,执行第三步的时候,可能这个过程也需要时间,这个时候有新的数据进来,所以原来的表如果有字段记录了数据的写入时间就最好了,可以找到执行这一步操作之后的数据,并重复导入到新表,直到数据差异很小。不过还是会可能损失极少量的数据。

所以,如果表的数据特别大,同时又要保证数据完整,最好停机操作。

 

 

你可能感兴趣的:(数据库)