我正在尝试使用 gzip 压缩将数据从一个 MySQL 服务器传输到另一个。到目前为止,我所做的是:
mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c | mysql -h [host] -u [user] -p[pwd]
当然,这行不通,因为压缩数据正在导入到远程数据库中。在导入之前,我该如何解压远程服务器上的数据 - 或者这行不通,我需要使用 SSH 吗?
谢谢
答案1
您可以通过多个 SSH 管道。
例如:
ssh user@host1 "mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c" | ssh user@host2 "gzip -c -d | mysql -h [host] -u [user] -p[pwd]"
稍微分解一下,您有两个 SSH 命令,它们互相连接:
- 第一个运行
mysqldump
,然后将结果通过管道传输到gzip
,后者又将结果发送到 STDOUT。 - 第二条命令采用 STDIN 并将其解压缩,然后将其通过管道传送到
mysql
命令。
当您结合这两个命令时,您可以直接使用 SSH 在两个主机之间传递数据。
以下是实践示例:
cwatson@zeus:~$ ssh tyr
cwatson@tyr:~$ echo stuff123tyr > testfile.txt
cwatson@tyr:~$ cat testfile.txt
stuff123tyr
cwatson@tyr:~$ logout
ssh tyr "cat ~/testfile.txt | gzip -c" | ssh thor "gzip -c -d > ~/testfile.txt"
cwatson@zeus:~$ ssh thor
Last login: Fri Feb 26 17:28:01 2016 from host217-44-218-9.range217-44.btcentralplus.com
cwatson@thor:~$ cat testfile.txt
stuff123tyr
答案2
通过使用参数--compress
,MySQL客户端可以将压缩数据发送到远程服务器。因此,传输命令行可以修改为:
mysqldump -u [user] -p[pwd] --compress --no-create-db --no-create-info [db] [table] | \
mysql --compress -h [host] -u [user] -p[pwd]
请注意,数据将以未加密的形式通过网络发送。如果您担心,通过 SSH 传输转储是更好的选择。
答案3
是的,您需要使用某种远程执行才能让远程端进行解压缩:
mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | gzip -c | ssh [host] "gunzip | mysql -h localhost -u [user] -p[pwd]"
然而请记住,ssh 默认会透明地进行压缩 - g(un)zip 步骤是不必要的。
mysqldump -u [user] -p[pwd] --no-create-db --no-create-info [db] [table] | ssh [host] mysql -h localhost -u [user] -p[pwd]
应该足够了
答案4
预先请求
- 如果不存在,则创建发件人数据库
- 如果不存在则创建接收方数据库
- 如果路径未改变,文件将保存在主目录中
- 确保你使用了正确的凭证
- 要获取接收者用户,请在命令行上键入此内容(ctrl+alt+t)--->
whoami
- 要获取接收器 IP 地址,请在命令行中输入此内容 (ctrl+alt+t) --->
ifconfig |grep "inet addr"|head -1
mysqldump -u{sender dbuser} -p{sender dbpassword} {sender database name} | gzip -cf | ssh {receiver user}@{receiver ip address} ' cat >/home/myfilename.gz | gzip -dc < myfilenamegz |mysql -u{receiver username} -p{receiver dbuser} {receiver dbname} '
- 从命令中删除
{ }
并插入您的值