[目前,我有一个服务器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的硬件配置:
innodb_buffer_pool_size
使用240GB)服务器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的原因是,我想将数据分解/分片到几个服务器中。因此,涉及发送数据快照或直接复制数据的解决方案似乎不可行。
为什么不使用xtrabackup进行时间点复制和复制来完成同步?这将比插入mysqldump样式快几个数量级。