用户抱怨当mysqldump进行时系统运行缓慢


9

MYSQL数据库(ibdata1)的大小为73 GB,并配置为在Windows 2008 O / S上作为INNODB表的专用数据库服务器运行。我们正在使用mysqldump运行备份mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert-设置字符集-压缩--log-error = Proddb0635.err -u根-pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

备份文件Proddb0635.sql存储在与数据库服务器不同的服务器上。RAM是12 GB。INNODB缓冲池大小为6 GB。额外的mem.pool为32 MB。查询缓存大小为2 GB,净缓冲区长度为最大16M。数据包大小1 GB。

mysql版本是5.0.67。

当备份未运行时,用户会对性能感到满意。

备份运行时,INNODB缓冲池命中率很高,接近100%。没有挂起的读取或挂起的写入。innodb free free等待时间为0。CPU使用率不高,最低9%到最高15%,无论是否运行mysqlbackup,查询缓存命中率都较低,约为40%。当前,Windows任务管理器显示正在使用10GB的RAM。是否应该仅使用2GB RAM来增加查询缓存?mysqlld-nt占用9.2 GB的RAM,而mysqldump占用5 MB的RAM。Alos注意到,存在--compress选项时,转储文件的大小是相同的。

我应该减少iNNODB缓冲池的大小吗?

谢谢

Answers:


8

Windows中存在一个已知问题,当您将大文件推送到另一台服务器时,所有内存最终都将分配给系统缓存,而不是用户进程。您可以查看任务管理器的“物理内存(MB)”部分,以查看有多少内存分配给系统缓存。

可以通过备份到本地磁盘,然后让远程计算机提取该文件来解决。


谢谢,玛德妮。我们将磁盘存储在SAN上,这也有所不同吗?
dbachacha,2011年

1
无论存储如何呈现,这都是一个问题。由于存储是SAN存储,因此无需通过网络将文件复制到另一台计算机。向MySQL服务器提供新的LUN,然后备份到该计算机。如果需要将文件获取到另一台计算机上进行磁带备份,请使用SAN。快照LUN,将快照提供给备份服务器,备份文件,然后删除快照。重复第二天。这可能全部用脚本编写。
mrdenny

您的第一个建议:#号在系统缓存中没有改变。关于LUN,我会将其传达给系统和网络团队的同事。
dbachacha 2011年

我将备份脚本移到了其他服务器上运行,并且有了很大的改进。此外,我们发现应用程序代码不是在重用单一连接,而是以分组到数据库服务器的一个请求中的多个功能打开/关闭。另外,我发现备份数据和联机事务数据共享一个NIC卡。因此,我们计划有一个专用的NIC仅用于备份。非常感谢。
dbachacha 2011年

7

鉴于您的情况,这是我对提高mysqldump性能的一些想法。这是您的命令:

mysqldump --skip-opt --quick-单个事务--create-options --extended-insert --disable-keys --add-drop-table --complete-insert --set-charset --compress- -log-error = Proddb0635.err -u根-pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

我注意到的第一件事是您将输出重定向到文件系统。它说的是'devNas',所以我假设这是网络连接存储。我是NAS的备份爱好者,但必须将其与生产流量连接在单独的物理NIC上。您可能没有饱和带宽,但是它们仍然可以竞争。由于--quick标志,这将是一个更大的问题,因为它会刷新每一行而不是将其保存在内存中。

我看到的第二件事是您调用了--compress。由于您未使用-h开关,因此您似乎在本地运行mysql。这可能会使用在这种情况下不必要的本地CPU。--compress是否必要?它仅压缩mysqldump客户端和mysql服务器之间的数据,而不压缩文件内容。

接下来,我看到您正在使用--single-transaction标志。这将导致额外的CPU,因为它是对mysqldump的一部分进行的每个选择的测试。

这与性能无关,但是您使用的--disable-keys仅适用于MyISAM(手册)。

您可能要尝试从脱机主机远程运行mysqldump并将完成后的转储文件移至NAS,以尽可能多地执行此操作。


是的,我确实与网络和系统管理员联系过。它是网络附加存储。我可以尝试将mysqldump移动到其他服务器。另外,现在我对--compress的用法很有意义。该手册说--compress适用于客户端和服务器,但是我看它是否有任何区别。什么样的数据在运行mysqldump的客户端和mysql数据库服务器之间流动。数据在mysql数据库服务器和devNas之间流动。MySQl文档和数据库设计和调优书籍更喜欢对INNODB表使用单一事务。
dbachacha 2011年

我将备份脚本移到了其他服务器上运行,并且有了很大的改进。此外,我们发现应用程序代码不是在重用单一连接,而是以分组到数据库服务器的一个请求中的多个功能打开/关闭。另外,我发现备份数据和联机事务数据共享一个NIC卡。因此,我们计划有一个专用的NIC仅用于备份。非常感谢。
dbachacha

我很高兴这对您有所帮助。最好的祝愿。
randomx 2011年

在这里,我需要帮助来了解以下情况:mysql数据库位于服务器A上。mysqldump在服务器B上运行,该服务器在服务器C上转储数据。我们有从服务器A到服务器C的专用NIC。这是否正确?我不确定,所以昨晚mysqldump在服务器A上运行。我想在其他服务器上运行它以减少CPU争用。
dbachacha,2011年

mysqldump是一个“客户端实用程序”,意味着您可以从任何有权访问数据库表的主机上运行它。您的策略是从服务器C的外壳针对服务器A的表运行mysqldump。当然,您必须授予从服务器C到要转储的架构的访问权限。
randomx 2011年

2

观察#1

针对InnoDB执行mysqldump时,请记住以下几点。

InnoDB缓冲池中存在的任何脏页都必须先刷新到磁盘。mysqldump将触发刷新其中仍包含脏页的InnoDB表。

有一个名为innodb_max_dirty_pages_pct的服务器选项。默认值为75,是MySQL 5.5;在5.5之前的MySQL版本中,默认值为90。在生产环境中,可以将此数字保留为默认值。

要查看InnoDB缓冲池中是否有很多脏页,请运行以下命令:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

BTW页面为16K,如下所示:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

当出现InnoDB和mysqldump时,可以在两种情况下降低此数字。

情况1:将其永久设置为0

只需将其添加到my.ini中:

[mysqld]
innodb_max_dirty_pages_pct=0

这将使InnoDB缓冲池保持精简和合理。刷新正在转储的InnoDB表的步骤将很快,因为在mysqldump对其进行操作之前,需要清除一些脏页(可能为0)。

唯一的缺点是,如果从流量较高的数据库中进行mysqldump,则由于更频繁地清除脏页,因此写入I / O的增加可能较小。您可以通过运行以下命令来确定是否在没有restartnig mysql的情况下是这样的:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

将该设置保留12-24小时,如果可以接受写入性能,则可以使用。如果没有,请使用以下命令将其重新设置:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

情况2:在mysqldump前约1小时将其设置为0

SET GLOBAL innodb_max_dirty_pages_pct = 0;

运行mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 90;

观察#2

您有--complete-insert作为mysqldump选项。这会将列名嵌入到VALUES子句之前的每个INSERT语句中。即使使用--extended-insert,在插入的每一批行上,列名称都将发送到mysqldump中。您可以通过删除--complete-insert来减少发送到mysqldump的字节数。

建议

如果您有另一个可以设置为从站的Windows Server,请从该从站而不是从生产计算机执行mysqldumps。


谢谢。我忘了提到用户抱怨“保存”需要时间而不是阅读。我将立即执行您的观察#2。我绝对喜欢您的建议,要有一个奴隶,然后从奴隶采取mysqldump。
dbachacha 2011年

备份开始之前,innodb_buffer_pool_dirty_pages不太高。大约是9到最大值。196.主从也是一个很好的建议。
dbachacha 2011年

1
我将备份脚本移到了其他服务器上运行,并且有了很大的改进。此外,我们发现应用程序代码不是在重用单一连接,而是以分组到数据库服务器的一个请求中的多个功能打开/关闭。另外,我发现备份数据和联机事务数据共享一个NIC卡。因此,我们计划有一个专用的NIC仅用于备份。非常感谢。如果没有任何工作,那么我相信主从服务器也将是好的。
dbachacha 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.