使用`mysqldump`缓慢写入数据库

tim*_*ima 6 mysql azure

我正在尝试自动执行 .mysql 中所有数据库的 mysql 转储Azure Database for MySQL Server。当前数据库大小:

mysql> SELECT table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
       FROM information_schema.tables GROUP  BY table_schema;
+--------------------+---------------+
| DB Name            | DB Size in MB |
+--------------------+---------------+
| db1                |         278.3 |
| db2                |          51.8 |
| information_schema |           0.2 |
| mysql              |           8.9 |
| performance_schema |           0.0 |
| db3                |          43.3 |
| sys                |           0.0 |
+--------------------+---------------+
7 rows in set (31.80 sec)
Run Code Online (Sandbox Code Playgroud)

我在不同的 VM 上有一个 python 脚本,它调用mysqldump将所有这些转储到一个文件中。但是,我遇到了db1. 它正在转储到文件中,但速度非常慢,30 分钟内不到 4MB。然而db2db3几乎立即倾倒,单位为秒。

我已经尝试了以下所有选项和组合来查看写入速度是否发生变化,但没有变化:

--compress
--lock-tables (true / false)
--skip-lock-tables
--max-allowed-packet (512M)
--quick
--single-transaction
--opt
Run Code Online (Sandbox Code Playgroud)

我目前甚至没有使用脚本,只是在 shell 中运行命令,结果相同。

mysqldump -h <host> -P <port> -u'<user>' -p'<password>' db1 > db1.sql
Run Code Online (Sandbox Code Playgroud)

db1 有约 500 张桌子。

我知道它大于db2db3但不是那么多,我想知道是否有人知道这里可能存在什么问题?

编辑

在这些有用的答案和 google 研究表明数据库很可能没问题后,我通过db1将服务器上的数据库复制到测试数据库中,然后逐个删除表以减小大小来运行测试。在大约 50MB 时,写入变得像其他数据库一样即时。这让我相信 Azure 中存在一些限制,因为数据库很好,我们将与他们的支持团队一起处理。我还在谷歌上发现了很多关于 Azure 数据库速度的帖子。

同时,我更改了脚本以忽略大型数据库。我们将尝试将数据库移动到SQL ServerAzure 提供的或带有 mysql 服务器的简单 VM,以查看我们可以在何处获得更好的性能。

Bil*_*win 3

MySQL 服务器端的速度可能很慢,但这似乎不太可能。您可以打开第二个 shell 窗口,连接到 MySQL 并使用SHOW PROCESSLISTSHOW ENGINE INNODB STATUS检查卡住的查询或锁定。

如果存储速度非常慢,也可能在将数据写入 db1.sql 时遇到问题。但4MB就是30分钟。太荒谬了。确保保存到运行 mysqldump 的实例的本地存储中。不要保存到远程存储。另请注意,如果您要写入转储的存储卷有其他大量 I/O 流量使其饱和,这可能会减慢写入速度。

测试数据写入缓慢的另一种方法是尝试一下,mysqldump ... > /dev/null如果速度很快,那么这是一个很好的线索,表明缓慢是磁盘写入的错误。

最后,网络速度也有可能是造成速度缓慢的原因。如果将转储文件保存到 /dev/null 仍然很慢,我会怀疑网络。


https://serverfault.com/questions/233963/mysql-checking-permission-takes-a-long-time中的答案 表明“检查权限”缓慢可能是由于 MySQL 授权表中的数据过多造成的(例如mysql.user)。如果您有数千个用户凭据,这可能就是原因。您可以尝试消除这些条目(然后运行FLUSH HOSTS)。