我正在尝试创建一个sync.sh
脚本来协调我们网站不太理想的版本控制。此脚本将把数据库的实时副本迁移到我们的开发环境和其他一些东西。我在 mysql 迁移部分遇到了麻烦。
该脚本在开发机器上运行。 remote
是现场主持人。
# --------------
# database
# ssh tunnel
ssh -L 3307:remote:3306 user@remote
# mysql dump
mysqldump -u someuser -h remote -P 3307 -p"p4ssw0rd" db > localfile.sql
# somehow close ssh tunnel ???
# populate local db with sql dump file
mysql -ulocal db < localfile.sql
# -----------------
# other sync stuff
# ...
当我仅运行脚本的 mysql 部分时,我得到了以下输出:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter password:
我们设置了 ssh 密钥,我可以正确地 ssh 到远程。但是,在脚本上下文中运行时,事情就出错了。我想我完全是个 bash 菜鸟。我猜如果我只是改变我的方法的结构,应该不会有问题。我只是不确定该怎么做……
答案1
只需使用一个命令即可提取转储:
ssh 用户@主机'mysqldump -u -p 数据库名称' > /path/to/local/file.sql
如果你的数据库很大,你也可以压缩这些内容:
ssh 用户@主机'mysqldump -u -p 数据库名称 | gzip' > /path/to/local/file.sql.gz
然后将其拉上拉链。
答案2
该ssh -L 3307:remote:3306 user@remote
命令永远不会返回,因为它只会打开一个 shell 并保持其打开。
SSH 的行为如下:只要执行命令或使用隧道,它就会保持连接打开。因此,您要做的就是ssh user@remote sleep 10 &
。这为 mysqldump 命令提供了足够的时间来打开连接,但是一旦 mysqldump 关闭该连接,隧道就不再使用,SSH 就会退出。
顺便说一句,如果服务器不允许外部连接,您可能必须使用 3307:localhost:3306。(这是因为主机名是在服务器端解析的,而不是在客户端解析的)
答案3
也许另一种方法是合理的——两个脚本。脚本 A 是需要在远程主机上执行的脚本。脚本 B 是一个控制脚本,它 1) 将脚本 A 复制到远程服务器,2) 通过 SSH 连接到远程服务器并执行复制的脚本,3) 将生成的转储文件复制回来,4) 加载本地数据库