mysql - MariaDB InnoDB批量INSERT慢超时

标签 mysql innodb bulk insertion

目前,我的服务器 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硬件配置:

  1. 300GB+ 内存(240GB 用于 innodb_buffer_pool_size)
  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 的原因是因为我想将数据分解/分片到少数服务器中(以使用 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/

相关文章:

Mysql查询调优(大数据集)及解释计划

php - 如何解决InnoDB引擎中的死锁问题?

RESTful API 和批量操作

sql - InnoDB 和为表创建关系 - 一个不会加入

MySQL查询慢查询主键上的表

sql - 将文本文件的内容读取到 varchar 中而不使用 BULK

java - 通过计划任务进行批量操作的正确方法?

mysql - 如何正确绑定(bind) MySQL 表

PHP 和 MySQL 数据格式化

php - 为什么 fputcsv 会产生重复的列?