題 如何使用SSH隧道編寫數據庫遷移腳本?


我正在努力創造一個 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菜鳥。我猜,如果我只是改變我的方法的結構,我應該沒有問題。我只是不確定該怎麼做......


7
2018-03-14 16:37


起源




答案:


只需使用一個命令拉出轉儲:

ssh user @ host'mysqldump -u -p databasename'> /path/to/local/file.sql

如果您的數據庫很大,您也可以壓縮它們:

ssh user @ host'mysqldump -u -p databasename | gzip'> /path/to/local/file.sql.gz

然後槍殺牠。


7
2018-03-14 17:23



哦,該死的,似乎我沒有看到森林的樹木;-) - Marian
這要求 mysqldump 安裝在遠程計算機上,是所需的版本等。 - AndreKR


ssh -L 3307:remote:3306 user@remote 命令永遠不會返回,因為它只會打開一個shell並保持打開狀態。

SSH的行為如下:只要執行命令或使用隧道,它就會保持連接打開。 所以你想要做的是 ssh user@remote sleep 10 &。這為mysqldump命令提供了足夠的時間來打開連接,但是一旦mysqldump關閉了該連接,隧道就會被使用並且SSH會退出。

順便說一下,如果服務器不允許外部連接,則可能必須使用3307:localhost:3306。 (這是有效的,因為主機名在服務器端解析,而不是在客戶端解析)


4
2018-03-14 17:05



運用 -f 代替 & 允許先輸入密碼 - AndreKR


也許另一種方法是有保證的 - 兩個腳本。腳本A將是需要在遠程主機上執行的腳本。腳本B將是一個控制腳本,1)將Sctipt A複製到遠程服務器,2)SSH到遠程服務器並執行複制的腳本,3)複製生成的轉儲文件,4)加載本地數據庫


0
2018-03-14 17:15