目前,我的服务器 A 保存着大约 250 亿条记录(几 TB 大小),其结构如下:
创建表 `table_x` (
`id` bigint(20) 无符号非空自动增量,
`a1` char(64) 默认为 NULL,
`b1` int(11) 无符号默认为 NULL,
`c1`tinyint(1) 默认为 NULL,
`LastUpdate` 时间戳 NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
主键(`id`),
唯一 key `idxb1a1`(`b1`,`a1`)
) ENGINE=InnoDB 默认字符集=utf8;
由于数据变得太大,我尝试使用批量插入 10K 记录将这些记录迁移到具有相同模式结构的服务器 B 中(例如 INSERT INTO yourtable VALUES (1,2), (5, 5), ...;
) 按 id
列升序排列。
最初,插入速度非常快 - 然而,它逐渐减慢,现在需要大约 10 秒才能批量插入 10K 记录(即 1K/秒)。 我猜测是因为它需要在每次插入后更新索引。
在开始迁移之前,我已在服务器 B 上完成了以下配置:
innodb_flush_log_at_trx_commit=2
SET unique_checks=0;
autocommit=0
并每 50K 提交一次
服务器B硬件配置:
- 300GB+ 内存(240GB 用于
innodb_buffer_pool_size
) - 用于数据存储的 SSD
服务器B my.cnf:
innodb_buffer_pool_size=240G
innodb_buffer_pool_instances=64
innodb_page_cleaners=32
innodb_purge_threads=1
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_use_native_aio=0
innodb_flush_log_at_trx_commit=2
innodb_doublewrite=0
innodb_autoinc_lock_mode=2
innodb_file_per_table=1
max_connections=10000
skip_name_resolve=1
tmp_table_size=134217728
max_heap_table_size=134217728
back_log=1000
wait_timeout=900
innodb_log_buffer_size=32M
innodb_log_file_size=768M
还有什么我可以做或配置来加速插入吗?
更新#1:
我尝试将记录迁移到服务器 B 的原因是因为我想将数据分解/分片到少数服务器中(以使用 MariaDB SPIDER 引擎分片解决方案)。因此,涉及发送数据快照或直接复制数据的解决方案似乎不可行。
最佳答案
速度变慢的原因可能是因为您的事务日志已满并且清除速度跟不上。增加 innodb_log_file_size (需要使用 innodb_fast_shutdown=0 关闭并删除日志)和 innodb_log_files_in_group 将推迟减速。增加 innodb_io_capacity 和 innidb_io_capacity_max 以匹配您的存储可以达到的目标应该会有所帮助。
为什么不使用 xtrabackup 进行时间点复制和复制来完成同步?这将比 INSERT-ing mysqldump 方式快几个数量级。
关于mysql - MariaDB InnoDB批量INSERT慢超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61906783/