【发布时间】:2015-01-05 13:23:27
【问题描述】:
我正在尝试将 30GB 的数据库从一台服务器迁移到另一台服务器。
简而言之,在整个过程中的某个时刻,导入记录所需的时间会急剧增加。以下是使用 SOURCE 命令导入一大块 500k 记录(整个数据库中约 25-3000 万条记录),这些记录以 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 文件也有这些峰值。
据我所知,这是在向表中插入一定数量的记录后发生的。我第一次启动服务器并导入一个大小的块时,它运行得很好。给出或接受它处理的估计数量,直到出现这些峰值。我无法将其关联起来,因为我没有始终如一地复制这个问题来明显得出结论。当通过单个命令导入这 20 个表时,大约有 20 个表具有不到 500,000 条记录,所有这些记录都可以正常导入。这似乎只发生在数据量过多的表上。当然,到目前为止我遇到的解决方案似乎只解决了随着时间的推移导入时发生的自然 DR(在我的情况下,预期的输出是最终在导入 500k 记录结束时,需要 2-3 秒每〜2800,而问题似乎最终解决了它不应该花那么长时间)。这来自一个名为“campaign_log”的单一 SugarCRM 表,该表有大约 900 万条记录。我能够将 500k 的块导入到我要迁移的旧服务器上,而不会发生这些峰值,所以我认为这与我的新服务器配置有关。另一件事是,每当出现这些峰值时,它被导入的表似乎有一种尴尬的方式来通过计数显示记录数。我知道 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>"
感谢您的帮助。如果有任何其他信息可以提供,请告诉我。
【问题讨论】:
标签: mysql database innodb mysqldump server