我需要将一个大文件(损坏的 MySQL 表~40GB)移动到单独的服务器上以便修复它。(当我尝试在生产服务器上修复时,它很快就杀死了服务器)。
为了做到这一点,我想将 .frm、.MYI 和 .MYD 文件从生产服务器 rsync 到云服务器。
我正在将文件从 /var/lib/mysql/{database}/ 复制到 /home/{myuser},这样我就不需要为 rsync 命令启用 root 访问权限,并且 100% 确保数据库文件未被使用(它不应该被写入或读取,但显然我不想关闭我的生产数据库来确保这一点)。
我尝试复制的第一个文件大约 10GB。我正在将其从生产服务器的一部分传输到另一部分,即传输到同一磁盘阵列。
不幸的是,复制命令“cp filename newfilename”占用了太多资源,导致服务器陷入停滞。
将文件复制到其他目录时如何才能使用更少的资源?(花多长时间并不重要)。
假设我设法做到这一点,那么将文件 rsync 到云端时我可以预期使用哪些资源?
有人能建议一个更好的方法来做到这一点吗?我的磁盘空间很快就用完了,所以需要尽快修复和归档这个表。
答案1
您是否尝试过nice -n10
在命令前加上前缀?
10
是默认值。范围从-20
(最高优先级)到19
(最低优先级)。
答案2
除了 rsync 带宽限制之外,还有两个选择:
ionice -c 3 cp foo bar
buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar
ionice
将与 I/O 调度程序交互。 buffer
是一个循环缓冲区,旨在帮助字符设备提高效率,但-u 150
写入之间会暂停 150 微秒,根据手册,这可能足以让磁盘有喘息的空间。
和都可在 Ubuntu 的原始版本中使用。如果你恰好在内核中配置了 CONFIG_TASK_DELAY_ACCT,ionice
那么它会很方便,但我的 Ubuntu 机器没有配置,这严重限制了命令的可用性。我已经知道了buffer
iotop
哪个命令正在淹没我的硬盘,我只想给它一些喘息的空间。
此外,在复制过程中,请查看(通常在 sysstat 包中)的输出iostat -x 1
,并查看设备的 %busy 字段在复制过程中是否为 90% 或更低。如果它处于 99-100%,则说明其他进程的 I/O 不足。
答案3
使用带有 --bwlimit=KBPS 开关的 rsync(限制 I/O 带宽;每秒千字节)。尝试使用较小的文件,并尝试找到传输速度和系统使用率之间的最佳组合。使用第二个 shell 进行监控“vmstat 1”
答案4
一个替代方案是:
scp -l ${KBPS} ${src} ${dest}
但如果 ${src} 是一个不断增长的文件,我认为它将不起作用......您能否建议一种复制并等待源关闭的方法......