我正在尝试将数据库从一台服务器复制到另一台服务器。我尝试使用以下命令,但它与输入 ssh 密码有关。如果我输入一台服务器的密码,它会抱怨另一台服务器,反之亦然。
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
我设法通过将转储暂时保存在计算机上来完成传输,只是想知道是否有办法让它发挥作用。
答案1
密码提示很麻烦。使 ssh 更可用的方法是使用密钥进行身份验证,并运行密钥代理 ( ssh-agent
),您可以在每个会话中注册一次密钥(具有可选的超时)。然后就可以直接运行
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
如果您可以从server1登录到server2,则应该直接在两台服务器之间传输数据。
ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
(或者如果您可以从 server2 登录到 server1,则相反)。同样,拥有用于身份验证的 SSH 密钥。在本地计算机上,注册一个可让您访问 server1 的 SSH 私钥和一个可让您访问 server2 的 SSH 私钥;确保代理转发已启用(AgentForwarding yes
在 中~/.ssh/config
)。
如果您确实无法避免输入密码,最好的办法是先建立连接,然后再传输数据。使用足够新的 OpenSSH 版本,您可以打开主连接,然后通过它路由从连接。从属连接不需要额外的身份验证。在你的~/.ssh/config
:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
启动到两台服务器的主连接:
ssh -N -M root@server1 &
ssh -N -M root@server2 &
然后进行复制:
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
此后,如果不再需要主连接,您可以终止它们。
ssh -O exit root@server1
ssh -O exit root@server2
答案2
最有效的方法是从mysqldump
服务器进行管道传输。有点像这个命令列表......
ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
如果您无法从远程计算机进行管道传输,由于某些配置相关的原因,您可以执行此命令列表...
ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'
如果我是被迫为了做到后者,我会考虑对mysqldump
.我相信这节省了我一些转移时间,尽管这不应该是第一选择。
ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'
最后一个例子可能不是 100% 正确,我只是假设它应该有效。
答案3
如果您被迫从A到乙对于类似代理的机器,没有灵丹妙药:您必须使用代理,作为您的计算机或中间服务器。
这可能很烦人,但 ssh 非常灵活,可以变得透明。如果您nc
在代理上安装程序,则可以将其添加到您~/.ssh/config
的A:
Host B
ProxyCommand ssh -q my_proxy nc -q0 B 22
之后,您将能够从A,使经典的 ssh/scp 命令乙就像根本没有代理一样。
因此,通过此配置,您将能够使用sshfs。
sshfs B: /mnt/B_fs
使用 sshfs,您的转储命令最终可以如下所示:
mysqldump --databases db ... > /mnt/B_fs/db.dump
遗憾的是,它不会加速代理的带宽。使用 ssh 可以做的最好的事情就是启用Compression
并引发CompressionLevel
。
看这个帖子有关 ssh 多跳的更详细说明。
答案4
所说的关键解决方案是最好的选择。但是,如果您出于任何原因无法做到这一点,您可以将命令行修改为
ssh root@server1 mysqldump --databases db | {sleep 5; ssh root@server2 mysql; }
为了让第二个命令等待。5
根据您输入第一个密码的速度来调整。
请注意,这只是一个后备解决方案,关键解决方案要好得多。