MariaDB InnoDB批量INSERT缓慢超时

问题描述 投票:2回答:2

[目前,我有一个服务器A,它拥有约250亿条记录(几个TB的大小),其结构如下:

CREATE TABLE `table_x` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `a1` char(64) DEFAULT NULL, `b1` int(11) unsigned DEFAULT NULL, `c1` tinyint(1) DEFAULT NULL, `LastUpdate` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`), UNIQUE KEY `idxb1a1` (`b1`,`a1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

由于数据的增长太大,我试图通过按列INSERT INTO yourtable VALUES (1,2), (5,5), ...;的升序顺序插入10K记录(例如id)将这些记录迁移到具有相同架构结构的服务器B中。

最初,插入速度确实很快-但是,插入速度逐渐变慢,现在大约需要10秒才能批量插入10K记录(即1K /秒)。我猜是因为它在每次插入后都需要更新索引。

开始迁移之前,我已在服务器B上完成以下配置:

  • innodb_flush_log_at_trx_commit=2
  • SET unique_checks=0;
  • [autocommit=0并每50K提交一次

服务器B的硬件配置:

  1. 300GB +内存(innodb_buffer_pool_size使用240GB)
  2. 用于数据存储的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的原因是,我想将数据分解/分片到几个服务器中。因此,涉及发送数据快照或直接复制数据的解决方案似乎不可行。

mysql innodb bulk insertion
2个回答
0
投票
之所以变慢,可能是因为您的事务日志已满,清除没有跟上。增加innodb_log_file_size(需要使用innodb_fast_shutdown = 0关闭并删除日志),然后innodb_log_files_in_group将推迟减速。增加innodb_io_capacity和innidb_io_capacity_max以匹配您的存储可以实现的目标将有所帮助。

为什么不使用xtrabackup进行时间点复制和复制来完成同步?这将比插入mysqldump样式快几个数量级。


0
投票
除了@ Gordon-bobic的答案之外,删除索引并在末尾重新应用也使速度大大提高。
© www.soinside.com 2019 - 2024. All rights reserved.