我正在尝试将 30GB 的数据库从一台服务器迁移到另一台服务器。
简而言之,在整个过程的某个时刻,导入记录所需的时间会急剧增加。以下是使用 SOURCE 命令导入一大块 50 万条记录(整个数据库中大约有 25-30 万条记录),这些记录作为 sql 文件导出,通过 ssh 隧道传输到新服务器:
...
Query OK, 2871 rows affected (0.73 sec)
Records: 2871 Duplicates: 0 Warnings: 0
Query OK, 2870 rows affected (0.98 sec)
Records: 2870 Duplicates: 0 Warnings: 0
Query OK, 2865 rows affected (0.80 sec)
Records: 2865 Duplicates: 0 Warnings: 0
Query OK, 2871 rows affected (0.87 sec)
Records: 2871 Duplicates: 0 Warnings: 0
Query OK, 2864 rows affected (2.60 sec)
Records: 2864 Duplicates: 0 Warnings: 0
Query OK, 2866 rows affected (7.53 sec)
Records: 2866 Duplicates: 0 Warnings: 0
Query OK, 2879 rows affected (8.70 sec)
Records: 2879 Duplicates: 0 Warnings: 0
Query OK, 2864 rows affected (7.53 sec)
Records: 2864 Duplicates: 0 Warnings: 0
Query OK, 2873 rows affected (10.06 sec)
Records: 2873 Duplicates: 0 Warnings: 0
...
峰值最终平均为每 ~2800 行受影响 16-18 秒。当然,我通常不会将 Source 用于大量导入,但为了显示合法输出,我用它来了解峰值何时发生。使用 mysql 命令或 mysqlimport 产生相同的结果。即使将结果直接输送到新数据库而不是通过 sql 文件,也会出现这些峰值。
据我所知,这种情况发生在将一定数量的记录插入到表中之后。我第一次启动服务器并导入这么大的 block 时,一切顺利。提供或获取它处理的估计数量,直到出现这些峰值。我无法将其关联起来,因为我没有始终如一地复制该问题以明确得出结论。当通过单个命令导入这 20 个表时,有大约 20 个表具有低于 500,000 条记录的所有导入都很好。这似乎只发生在数据量过多的表中。当然,到目前为止我遇到的解决方案似乎只解决了随着时间的推移导入时发生的自然 DR(我的预期输出是最终在导入 500k 条记录结束时,需要 2-3 秒每 ~2800,而问题似乎在最后解决了它不应该花那么长时间)。这来自一个名为“campaign_log”的 sugarCRM 表,它有大约 900 万条记录。我能够将 500k 的 block 导入回我正在迁移的旧服务器上,而不会出现这些峰值,所以我认为这与我的新服务器配置有关。另一件事是,每当出现这些峰值时,它被导入到的表似乎有一种通过计数显示记录数的笨拙方式。我知道 InnoDB 给出了计数估计,但是数字没有在 ~ 之后,表示估计。它通常是准确的,每次刷新表格时,它都不会改变它显示的数量(这基于它通过 PHPMyAdmin 报告的内容)
这是我在新服务器上的以下命令/InnoDB 系统变量:
INNODB 系统变量:
+---------------------------------+------------------------+
| Variable_name | Value |
+---------------------------------+------------------------+
| have_innodb | YES |
| ignore_builtin_innodb | OFF |
| innodb_adaptive_flushing | ON |
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 8388608 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_size | 8589934592 |
| innodb_change_buffering | all |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_doublewrite | ON |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | OFF |
| innodb_flush_log_at_trx_commit | 1 |
| innodb_flush_method | fsync |
| innodb_force_load_corrupted | OFF |
| innodb_force_recovery | 0 |
| innodb_io_capacity | 200 |
| innodb_large_prefix | OFF |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_old_blocks_pct | 37 |
| innodb_old_blocks_time | 0 |
| innodb_open_files | 300 |
| innodb_print_all_deadlocks | OFF |
| innodb_purge_batch_size | 20 |
| innodb_purge_threads | 1 |
| innodb_random_read_ahead | OFF |
| innodb_read_ahead_threshold | 56 |
| innodb_read_io_threads | 8 |
| innodb_replication_delay | 0 |
| innodb_rollback_on_timeout | OFF |
| innodb_rollback_segments | 128 |
| innodb_spin_wait_delay | 6 |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | ON |
| innodb_stats_sample_pages | 8 |
| innodb_strict_mode | OFF |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 0 |
| innodb_thread_sleep_delay | 10000 |
| innodb_use_native_aio | ON |
| innodb_use_sys_malloc | ON |
| innodb_version | 5.5.39 |
| innodb_write_io_threads | 8 |
+---------------------------------+------------------------+
系统规范:
Intel Xeon E5-2680 v2 (Ivy Bridge) 8 Processors
15GB Ram
2x80 SSDs
CMD 导出:
mysqldump -u <olduser> <oldpw>, <olddb> <table> --verbose --disable-keys --opt | ssh -i <privatekey> <newserver> "cat > <nameoffile>"
感谢您的帮助。如果我可以提供任何其他信息,请告诉我。
最佳答案
我想通了。我将 innodb_log_file_size 从 5MB 增加到 1024MB。虽然它确实显着增加了我导入的记录量(从不超过每 3000 行 1 秒),但它也修复了峰值。我导入的所有记录中只有 2 条,但发生后,它们立即恢复到不到 1 秒。
关于MySQL Import into Innodb table 在某个点严重尖峰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26823490/