У меня есть сценарий, который удаляет данные из облачного литейного db, и он работает следующим образом:
cf ssh -L 33001:db.host:3306 --skip-remote-execution App &
TUNNEL_PID=$!
mysqldump --protocol TCP --port= 33001 ..... db_name > /tmp/my-db-dump.sql
kill $TUNNEL_PID
Проблема в том, что mysqldump
не работает с
mysqldump: получена ошибка: 2003: невозможно подключиться к серверу MySQL на "localhost" (61) при попытке подключения
Я ожидаю, что проблема в том, что туннель еще не установлен. Когда я sleep 5
перед mysqldump, все работает. Но я не хочу полагаться на случайные 5 секунд. Можно ли дождаться начала туннеля?
Можете ли вы запустить mysqldump через команду ssh вместо открытия туннеля?
Mysqldump напишет на его stdout, который будет передан обратно на ваш клиентский хост через команду ssh.
ssh App "mysqldump db_name" > /tmp/my-db-dump.sql
Или вы даже можете сбросить сжатый файл на сервере, а затем извлечь файл дампа с помощью scp. Это поможет ускорить передачу.
ssh App "mysqldump db_name | gzip -c > /tmp/my-db-dump.sql.gz"
scp App:/tmp/my-db-dump.sql.gz .
ssh App "rm /tmp/my-db-dump.sql.gz"
Это непроверено, но я надеюсь, что это дает вам некоторые идеи для экспериментов.
cf ssh
вы делаете это немного иначе, чем стандартный SSH. Вместоssh <host> "command"
, этоcf ssh <app-name> -c "command"
. В качестве альтернативы вы можете использовать стандартныйssh
/scp
/sftp
, но команды немного запутаны -> github.com/cloudfoundry/…