使用私有 IP 时 mysqldump 速度极慢

使用私有 IP 时 mysqldump 速度极慢

我在使用 Mysql 时遇到一个非常奇怪的问题。

我有两台云服务器,它们位于同一区域和 VPC 网络,因此内部连接速度相当快。两台服务器都运行 CentOS 7.6,我进行了一个简单的测试,scp在它们之间复制一个大文件,速度约为 160MB/s。

然后我在其中一台服务器上安装了 MySQL 5.7。我将一个数据库(约 40GB)导入其中。

下次我尝试执行mysqldump(在数据库服务器上本地执行)时,我发现速度非常慢。大约 4~5 MB/s。花了 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~30MB/s。转储数据库只花了六分钟。

我尝试通过网络将数据库转储到其他服务器上,但速度也非常慢。

我的问题: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

答案1

mysqldump 将使用命名管道作为 localhost,而不是 TCP。您可以通过np:localhost与进行比较来仔细检查这是否是问题所在tcp:\\localhost。(我认为这是正确的语法,np:但您可能需要指定文件名,例如/tmp。我在某处读到了一些关于tcp:(local)和的内容np:(local),不确定这是否是字面意思,如果我的建议不起作用,值得一试。)如果tcp:\\localhost使用您的 IP 地址匹配,则差异在于使用 TCP 堆栈而不是命名管道的开销。

请注意,40GB 的数据库在磁盘上占用 40GB,这是一个相对紧凑的表示。在 SQL 中,这占用的字节要多得多!正如 mysqldump 文档中所说,这不是备份数据库的有效方法。有效的方法是备份 SQL 数据库使用的文件结构(这在许多方面都更有效率,包括允许增量备份。)

mysqldump 很有用,因为它很容易,并且适合概念验证工作,但不应该用作除小型数据库之外的任何数据库的常规备份方法。

如果性能tcp://localhost很快(类似于“localhost”),则使用以下命令验证与您的 IP 的通信是否使用环回接口:

tcpdump -i lo -n

请注意,如果流量使用环回接口(这是获得最佳性能所需的接口),这将生成大量输出。因此,请在不同的窗口中执行此操作,或通过管道或重定向它,并准备立即中止 mysqldump。如果这没有生成大量输出。您还必须清除正常的背景流量。如果有大量背景流量,请尝试以下操作:

tcpdump -i lo -n > junk

运行该命令两秒钟,然后在 mysqldump 未运行时按 ^C,检查垃圾的大小。运行该命令两秒钟后,如果它使用环回设备(您需要),则垃圾大小会比较大。

如果它没有使用环回设备作为您的外部 IP 地址,则您的本地系统网络配置存在问题,您可能需要就此提出一个新问题。

相关内容