Я столкнулся с очень странной проблемой с Mysql.
У меня есть два облачных сервера, и они находятся в одном регионе и в сети VPC, поэтому скорость внутреннего соединения довольно высокая. Оба сервера работают под управлением CentOS 7.6. Я провел простой тест, используя scp
скопировать между ними один большой файл со скоростью около 160 МБ / с.
Затем я установил MySQL 5.7 на один из серверов. Я импортировал в него базу данных (около 40 ГБ).
В следующий раз, когда я попытался сделать mysqldump
(локально на сервере db) Я обнаружил, что скорость очень низкая. Это примерно 4 ~ 5 МБ / с. Это заняло более 30 минут.
Вот команда, которую я использовал:
mysqldump -q --master-data=2 --single-transaction -utest -p'xxxxx' -h192.168.1.47 testdb > testdb.sql
192.168.1.47 - это частный IP-адрес сервера.
Затем я удалил часть «-h192.168.1.47» и использовал вместо нее «localhost», скорость очень высокая и составляла около 20 ~ 30 МБ / с. Выгрузка базы данных заняла всего шесть минут.
Я попытался сбросить базу данных по сети на другом моем сервере, и это тоже очень медленно.
Мой вопрос: есть ли какие-либо настройки или ограничения на стороне Linux или MySQL, которые могут вызвать такое поведение? Ниже приведен файл конфигурации mysql.
symbolic-links=0
skip-name-resolve
bind-address=192.168.1.47
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
table_open_cache=4096
open_files_limit=65535
max_connections=1500
interactive_timeout=3600
wait_timeout=3600
interactive_timeout=3600
innodb_lock_wait_timeout=300
max_allowed_packet=64M
innodb_log_file_size=512M
innodb_log_buffer_size=1M
tmp_table_size=1024M
max_heap_table_size=1024M
innodb_buffer_pool_size=80G
query_cache_type=0
query_cache_size=0
log-bin=/data/mysql/dbmaster
server-id=1
binlog_format=mixed
expire_logs_days=5
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
mysqldump будет использовать именованные каналы для localhost, а не TCP. Вы можете дважды проверить, что это проблема, сравнив np:localhost
с участием tcp:\\localhost
. (Я думаю, что это правильный синтаксис для np:
но вам может потребоваться указать имя файла, например, в /tmp
. Я что-то читал о tcp:(local)
и np:(local)
где-то, и я не уверен, было ли это буквальным, стоит попробовать, если мои предложения не работают.) Если tcp:\\localhost
совпадает с вашим IP-адресом, то разница заключается в накладных расходах на использование стека TCP, а не именованных каналов.
Обратите внимание, что база данных 40 ГБ - это 40 ГБ на диске, что является относительно компактным представлением. В SQL это занимает НАМНОГО больше байтов! Как сказано в документации для mysqldump, это неэффективный способ резервного копирования базы данных. Эффективный способ - создать резервную копию файловой структуры, которую использует база данных SQL (что намного эффективнее во многих отношениях, включая возможность инкрементного резервного копирования).
mysqldump полезен, потому что он прост и хорош для проверки концепции, но не должен использоваться в качестве обычного метода резервного копирования для чего-либо, кроме небольших баз данных.
Если исполнение tcp://localhost
работает быстро (похоже на просто localhost), затем убедитесь, что связь с вашим IP-адресом осуществляется с помощью интерфейса обратной петли, используя это:
tcpdump -i lo -n
Обратите внимание, что при этом будет генерироваться МНОГО выходных данных, если трафик использует интерфейс обратной петли (это то, что вам нужно для наилучшей производительности). Так что сделайте это в другом окне, конвейере или перенаправлении, и будьте готовы сразу же прервать mysqldump. Если это НЕ дает много вывода. Вам также придется отсеять обычный фоновый трафик. Если фонового трафика много, попробуйте что-нибудь вроде этого:
tcpdump -i lo -n > junk
Запустите это в течение двух секунд и нажмите ^ C, когда mysqldump не запущен, и проверьте размер нежелательной почты. Попробуйте еще раз в течение двух секунд, когда он есть, и мусор должен быть огромным по сравнению, если он использует устройство обратной связи (которое вы хотите).
Если он не использует устройство обратной петли для вашего внешнего IP-адреса, что-то не так с сетевой конфигурацией вашей локальной системы, и вы хотите открыть новый вопрос по этому поводу.