我必须通过没有那么多带宽并且其他人需要同时使用的网络管道转储一个大型数据库。如果我尝试它,它会吸收所有的带宽,延迟会飙升,其他人都会搞砸。
我知道 mysqldump 的 --compress 标志有点帮助。
如何在不占用此连接的所有带宽的情况下做到这一点?
更新:
使用带有 -l 标志的 scp 复制转储文件的建议是一个很好的建议,但我应该注意我没有对数据库服务器的SSH访问权限。
我必须通过没有那么多带宽并且其他人需要同时使用的网络管道转储一个大型数据库。如果我尝试它,它会吸收所有的带宽,延迟会飙升,其他人都会搞砸。
我知道 mysqldump 的 --compress 标志有点帮助。
如何在不占用此连接的所有带宽的情况下做到这一点?
更新:
使用带有 -l 标志的 scp 复制转储文件的建议是一个很好的建议,但我应该注意我没有对数据库服务器的SSH访问权限。
涓流是一种便携式轻量级用户空间带宽整形器
您没有提到您实际上是如何传输数据库转储的,但是如果传输是通过 TCP/IP 进行的,那么涓流应该可以工作。例如,如果您使用nc
(例如nc -L 1234 > backup.sql
:)以下命令将以不超过 20KB/s 的速度传输备份:
mysqldump [database name] | trickle -u 20 nc backup.example.com:1234
您将必须有权访问 linux 机器(对不起,我是一个 linuxy 类型的人)。
入口策略可以减少传入流量,但另一端的服务器需要有一个性能良好的 TCP/IP 堆栈。
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip prio 50 \
u32 match ip src server.ip.address/32 police rate 256kbit \
burst 10k drop flowid :1
tc qdisc add dev eth0 root tbf \
速率 256kbit 延迟 25ms 突发 10k
您可以在高级路由指南中找到有关入口过滤器的更多信息。
http://www.linux.org/docs/ldp/howto/Adv-Routing-HOWTO/index.html
如果你在 linux 中做,你可以将文件转储到本地,压缩它并使用 scp 复制文件,并使用 -l 开关来限制使用的带宽:
-l limit 限制使用的带宽,以 Kbit/s 为单位。
例如
scp -l 16 转储文件远程主机:文件路径和名称
我使用的一个技巧是指定 CSV 格式而不是插入。它不会改变您每单位时间使用多少带宽,但它可以减少您提取的字节总数。
如果您通过 TCP 发送,带宽将在各方之间平均共享。如果您想进一步降低速度,您需要将设备调整为只允许一定数量的数据输出。
在客户端上,您可以运行将限制下载速度的代理。您还可以控制连接数等。
如果您在 Windows 上,这应该可以很好地工作:
你在使用像 InnoDB 这样的事务表引擎吗?这是您的主数据库吗?要非常小心!mysqldump 将持有表锁并中断数据库的生产使用。减慢备份速度只会导致这段中断时间变长。总是 mysqldump 到本地磁盘,然后从那里复制转储。
另一种方法可能是在您的远程站点设置一个复制从站,并从中获取备份。然后数据库更新将通过您的竞争链接涓涓细流,而不是一大块下来。
另一种选择:当没有其他人使用网络时进行备份:)