MySQL大量数据insert失败的问题

昨天处理数据发现,有个表的主键是VARCHAR类型,数据量超一亿,不方便遍历,删主键再加主键操作超时,提示建议建个新表,然后 insert。

下面是我的步骤:

新建表:

CREATE TABLE `sai_new` (   
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   
    `fid` VARCHAR(20) NOT NULL,   
    `xxx` VARCHAR(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPRESSED;

插入数据:

INSERT INTO `sai_new` (`fid`, `xxx`, `live_city`) SELECT `id`, `xxx`, `live_city` FROM `sai_13_old`;

这步很慢,最后直接报错。

ERROR 1206 (HY000): The total number of locks exceeds the lock table size
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+-------------+
| Variable_name           | Value       |
+-------------------------+-------------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-------------+
1 row in set (0.08 sec)

调大:

SET GLOBAL innodb_buffer_pool_size = 13421772800;

看下有没有改成功:

可以使用上面的目录,也可以这样。12.5G,增大为原来的100倍。

 SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                          12.500000000000 |
+------------------------------------------+
1 row in set (0.26 sec)

继续 insert, 奖励了2小时45分36秒后,数据迁移成功。

话说这磁盘写入也是真的慢。

innodb_buffer_pool_size

innodb_buffer_pool_size 是缓冲池大小,必须始终等于 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances 或其倍数。主要影响读,且要注意这个参数增大会增大内存占用。

更多看手册: 15.8.3.1 Configuring InnoDB Buffer Pool Size


MySQL大量数据insert失败的问题
https://blog.puresai.com/2024/01/19/505/
作者
puresai
许可协议