Я столкнулся с очень странной проблемой с 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-адреса,что-то не так с сетевой конфигурацией вашей локальной системы, и вы хотите задать новый вопрос по этому поводу.