Dre*_*rew 5 command-line shell ssh mysql
我正在尝试将数据库从一台服务器复制到另一台服务器。我尝试使用以下命令,但在输入 ssh 密码时遇到了问题。如果我输入一台服务器的密码,它会抱怨另一台服务器,反之亦然。
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
我设法通过在我的计算机上暂时保存转储来进行传输,只是想知道是否有办法让它工作。
密码提示很麻烦。使 ssh 更有用的方法是使用密钥进行身份验证,并运行一个密钥代理 ( ssh-agent
),您可以在其中为每个会话注册一次密钥(具有可选的超时)。然后就可以直接运行了
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
Run Code Online (Sandbox Code Playgroud)
如果可以从server1登录到server2,则应该直接在两台服务器之间传输数据。
ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
Run Code Online (Sandbox Code Playgroud)
(或者相反,如果您可以从 server2 登录到 server1)。同样,有一个用于身份验证的 SSH 密钥。在您的本地机器上,注册一个 SSH 私钥,让您可以访问 server1,另一个可以让您访问 server2;确保启用代理转发(AgentForwarding yes
in ~/.ssh/config
)。
如果实在无法避免输入密码,最好的办法是先建立连接,然后再传输数据。使用最新版本的 OpenSSH,您可以打开一个主连接,然后通过它路由从连接。从属连接不需要额外的身份验证。在您的~/.ssh/config
:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Run Code Online (Sandbox Code Playgroud)
启动与两台服务器的主连接:
ssh -N -M root@server1 &
ssh -N -M root@server2 &
Run Code Online (Sandbox Code Playgroud)
然后复制:
ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
Run Code Online (Sandbox Code Playgroud)
在此之后,如果您不再需要它们,您可以终止主连接。
ssh -O exit root@server1
ssh -O exit root@server2
Run Code Online (Sandbox Code Playgroud)
最有效的方法是从服务器进行管道传输mysqldump
。有点像这个命令列表......
ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
Run Code Online (Sandbox Code Playgroud)
如果您无法从远程计算机进行管道传输,由于某些配置相关的原因,您可以执行此命令列表...
ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'
Run Code Online (Sandbox Code Playgroud)
如果我被迫做后者,我会考虑对mysqldump
. 我相信这节省了我一些转移时间,尽管这不应该是第一选择。
ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'
Run Code Online (Sandbox Code Playgroud)
最后一个例子可能不是 100% 正确,我只是假设它应该有效。