Anda dapat melakukannya dengan SSH Tunneling, menyiapkan instans MongoDB jarak jauh Anda untuk berjalan di salah satu port lokal Anda. Secara default, MongoDB berjalan pada 27017, jadi dalam contoh di bawah ini, saya telah memilih untuk memetakan instance MongoDB jarak jauh saya ke port 27018 lokal saya.
Jika Anda mencoba menyalin database dari SERVER1 ke LOCALHOST, Anda dapat menjalankan perintah ini di LOCALHOST Anda:
ssh -L27018:localhost:27017 SERVER1
(Jelas ganti SERVER1 dengan server Anda yang sebenarnya atau alias ssh)
Ini membuka koneksi SSH ke SERVER1, tetapi juga memetakan port 27018 di LOCALHOST ke port jarak jauh 27017 di SERVER1. Jangan tutup koneksi SSH itu, dan sekarang coba sambungkan ke MongoDB di mesin localhost Anda dengan port 27018, seperti ini:
mongo --port 27018
Anda akan melihat ini sekarang adalah data di SERVER1, kecuali Anda mengaksesnya dari mesin lokal Anda.
Hanya menjalankan MongoDB secara normal:
mongo
(atau mongo --port 27107
)
Akan menjadi mesin lokal Anda.
Sekarang, karena secara teknis Anda memiliki (di LOCALHOST, tempat Anda menjalankan terowongan SSH):
- MongoDB (LOCALHOST) pada 27017
- MongoDB (SERVER1) pada 27018
Anda cukup menggunakan db.copyDatabase()
berfungsi di dalam MongoDB (LOCALHOST) untuk menyalin data.
DARI LOCALHOST PADA PORT 27017 (Menjalankan secara langsung akan MENGHAPUS DATA ANDA)
// Use the right DB
use DATABASENAME;
// Drop the Existing Data on LOCALHOST
db.dropDatabase();
// Copies the entire database from 27018
db.copyDatabase("DATABASENAME", "DATABASENAME", "localhost:27018");
Anda harus dapat membungkus ini semua menjadi skrip shell yang dapat menjalankan semua perintah ini untuk Anda. Saya sendiri memilikinya, tetapi sebenarnya ada beberapa langkah tambahan yang mungkin akan membuatnya sedikit lebih membingungkan :)
Melakukan ini, dan menggunakan fungsi db.copyDatabase() asli MongoDB akan mencegah Anda dari keharusan membuang/zip/mengembalikan. Tentu saja, jika Anda masih ingin menempuh rute itu, tidak akan terlalu sulit untuk menjalankan mongodump
, ekspor data, tar/gzip, lalu gunakan scp TARGETSERVER:/path/to/file /local/path/to/file
untuk menariknya ke bawah dan menjalankan mongorestore
di atasnya.
Sepertinya lebih banyak pekerjaan!
Sunting - Ini adalah file SH dan JS yang digabungkan untuk membuat skrip shell yang dapat Anda gunakan untuk menjalankannya. Jalankan ini di LOCALHOST Anda , jangan menjalankannya secara langsung atau itu akan melakukan db.dropDatabase secara langsung. Letakkan kedua file ini di folder yang sama, dan ganti YOURSERVERNAME di pull-db.sh
dengan alias domain/ip/ssh, lalu di pull-db.js
ubah DBNAMEHERE menjadi apa pun nama database Anda.
Saya biasanya membuat folder bernama scripts
dalam proyek saya, dan menggunakan Textmate, saya hanya perlu menekan ⌘+R
sambil memiliki pull-db.sh
terbuka untuk diedit untuk menjalankannya.
pull-db.sh
ssh -L27018:localhost:27017 YOURSERVERNAME '
echo "Connected on Remote End, sleeping for 10";
sleep 10;
exit' &
echo "Waiting 5 sec on local";
sleep 5;
echo "Connecting to Mongo and piping in script";
cat pull-db.js | mongo
pull-db.js
use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
Saya menambahkan beberapa kode tambahan ke skrip Shell untuk menggemakan apa yang dilakukannya (agak). Pengatur waktu tidur dalam skrip hanya untuk memberikan waktu koneksi SSH untuk terhubung sebelum baris berikutnya dijalankan. Pada dasarnya, inilah yang terjadi:
- Baris pertama kode membuat terowongan di mesin Anda, dan mengirimkan ECHO, SLEEP, lalu EXIT ke sesi SSH jarak jauh.
- Kemudian menunggu 5 detik, yang memungkinkan sesi SSH di langkah 1 untuk terhubung.
- Kemudian kita menyalurkan file pull-db.js ke dalam shell mongo lokal. (Langkah #1 harus selesai dalam 5 detik...)
- Pull-db.js seharusnya berjalan di mongo sekarang, dan terminal SSH pada Langkah #1 mungkin telah berjalan selama 10 detik setelah koneksi dibuka, dan EXIT dikirim ke sesinya. Perintah dikeluarkan, NAMUN, sesi SSH akan tetap terbuka sampai aktivitas dari Langkah #3 selesai.
- Segera setelah skrip pull-db.js Anda selesai menarik semua data Anda dari server jauh, perintah EXIT yang dikeluarkan pada Langkah #1 di server jauh akhirnya diizinkan untuk menutup koneksi, melepaskan 27108 di host lokal Anda.
Anda sekarang seharusnya memiliki semua data dari database jarak jauh di localhost Anda.