Postgres memungkinkan penggunaan basis data apa pun yang ada di server sebagai templat saat membuat basis data baru. Saya tidak yakin apakah pgAdmin memberi Anda opsi pada dialog buat database tetapi Anda harus dapat menjalankan yang berikut di jendela kueri jika tidak:
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
Namun, Anda mungkin mendapatkan:
ERROR: source database "originaldb" is being accessed by other users
Untuk memutuskan sambungan semua pengguna lain dari basis data, Anda dapat menggunakan kueri ini:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Servers
-> (server saya) ->Databases
, klik kanan Databases, dan pilih "Database Baru". Salah satu opsi adalah templat, dan SQL yang digunakan untuk membuat database adalah setara. Hal ini sangat jauh lebih cepat daripada dump / restore pada server yang sama.Versi baris perintah dari jawaban Bell :
Ini harus dijalankan di bawah hak master database, biasanya postgres.
sumber
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
jika Anda mencoba melakukannya pada basis data produksi dan seperti yang diharapkan Anda tidak ingin mematikannya untuk membuat salinan.Untuk mengkloning database yang ada dengan postgres, Anda dapat melakukannya
ITU akan mematikan semua koneksi ke sumber db menghindari kesalahan
sumber
procpid
denganpid
agar ini berfungsiDalam lingkungan produksi, di mana basis data asli berada di bawah lalu lintas, saya hanya menggunakan:
sumber
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html$ createdb newdb
Tidak tahu tentang pgAdmin, tetapi
pgdump
memberi Anda dump database di SQL. Anda hanya perlu membuat database dengan nama yang sama dan lakukanuntuk mengembalikan semua tabel dan datanya serta semua hak akses.
sumber
pg_dump -U postgres sourcedb | psql -U postgres newdb
walaupun efisiensi teknik ini mungkin dipertanyakan (karena Anda mungkin pada akhirnya mengubah konteks antara membaca dan menulis)ssh dbserver pg_dump DBNAME | psql NEWDB
... ataupg_dump DBNAME | ssh otherserver pgsql NEWDB
... Izin dan otentikasi tentu saja perlu ditangani namun Anda ingin menanganinya.Pertama,
sudo
sebagai pengguna basis data:Pergi ke baris perintah PostgreSQL:
Buat database baru, berikan hak dan keluar:
Salin struktur dan data dari database lama ke yang baru:
sumber
\l+
. Mengapa perbedaan ukuran?Saya kumpulkan pendekatan ini bersama dengan contoh-contoh dari atas. Saya sedang mengerjakan server "di bawah beban" dan mendapatkan kesalahan ketika saya mencoba pendekatan dari @zbyszek. Saya juga mencari solusi "command line only".
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
.Inilah yang bekerja untuk saya ( Perintah yang diawali dengan
nohup
untuk memindahkan output ke file dan melindungi dari putuskan server ):nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
nohup psql exampledbclone_01 < example-01.sql
sumber
Di pgAdmin Anda dapat membuat cadangan dari database asli Anda, dan kemudian hanya membuat database baru dan mengembalikan dari cadangan yang baru saja dibuat:
sumber
Apa cara yang benar untuk menyalin seluruh basis data (struktur dan datanya) ke yang baru di pgAdmin?
Menjawab:
Sudah dicoba dan diuji.
sumber
Dari dokumentasi , tidak disarankan menggunakan
createdb
atauCREATE DATABASE
dengan templat:pg_dump
ataupg_dumpall
merupakan cara yang baik untuk menyalin database DAN SEMUA DATA. Jika Anda menggunakan GUI seperti pgAdmin, perintah ini dipanggil di belakang layar saat Anda menjalankan perintah cadangan. Menyalin ke database baru dilakukan dalam dua fase: Pencadangan dan Pemulihanpg_dumpall
menyimpan semua database di cluster PostgreSQL. Kerugian dari pendekatan ini adalah bahwa Anda berakhir dengan file teks berpotensi sangat besar yang penuh dengan SQL yang diperlukan untuk membuat database dan mengisi data. Keuntungan dari pendekatan ini adalah Anda mendapatkan semua peran (izin) untuk cluster secara gratis. Untuk membuang semua database, lakukan ini dari akun pengguna superdan mengembalikan
pg_dump
memiliki beberapa opsi kompresi yang memberi Anda file yang jauh lebih kecil. Saya memiliki basis data produksi yang saya backup dua kali sehari dengan menggunakan cron jobdi mana
compress
level kompresi (0 hingga 9) dancreate
memberitahupg_dump
untuk menambahkan perintah untuk membuat database. Pulihkan (atau pindah ke cluster baru) dengan menggunakandi mana newdb adalah nama database yang ingin Anda gunakan.
Hal-hal lain untuk dipikirkan
PostgreSQL menggunakan ROLES untuk mengelola izin. Ini tidak disalin oleh
pg_dump
. Kami juga belum menangani pengaturan di postgresql.conf dan pg_hba.conf (jika Anda memindahkan database ke server lain). Anda harus mencari tahu pengaturan conf sendiri. Tetapi ada trik yang baru saya temukan untuk mendukung peran. Peran dikelola di tingkat gugus dan Anda dapat memintapg_dumpall
cadangan hanya peran dengan--roles-only
sakelar baris perintah.sumber
PostgreSQL 9.1.2:
sumber
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
dan sebagai akibatnya mengharuskan database asli harus idle (tidak ada koneksi dengan akses tulis) dan koneksi baru ke database asli dicegah saat penyalinan sedang dalam proses. Jika Anda senang dengan itu, ini berhasil.Bagi mereka yang masih tertarik, saya telah membuat skrip bash yang melakukan (kurang lebih) apa yang diinginkan penulis. Saya harus membuat salinan database bisnis harian pada sistem produksi, skrip ini tampaknya melakukan trik. Ingatlah untuk mengubah nama database / nilai pengguna / pw.
sumber
Untuk membuat dump basis data
Untuk memulihkan dump database
sumber
Inilah seluruh proses pembuatan salinan melalui database hanya menggunakan pgadmin4 GUI (via backup dan restore)
Postgres hadir dengan Pgadmin4. Jika Anda menggunakan macOS Anda dapat menekan
CMD
+SPACE
dan mengetikpgadmin4
untuk menjalankannya. Ini akan membuka tab browser di chrome.Langkah-langkah untuk menyalin
1. Buat cadangan
Lakukan ini dengan mengklik kanan basis data -> "cadangan"
2. Beri nama file.
Seperti
test12345
. Klik cadangan. Ini menciptakan dump file biner, tidak dalam.sql
format3. Lihat di mana itu diunduh
Seharusnya ada sembulan di kanan bawah layar Anda. Klik halaman "selengkapnya" untuk melihat ke mana cadangan unduhan Anda
4. Temukan lokasi file yang diunduh
Dalam hal ini, itu
/users/vincenttang
5. Kembalikan cadangan dari pgadmin
Dengan asumsi Anda melakukan langkah 1 hingga 4 dengan benar, Anda akan memiliki file biner yang dipulihkan. Mungkin suatu saat rekan kerja Anda ingin menggunakan file pemulihan di mesin lokal mereka. Telah mengatakan orang pergi ke pgadmin dan memulihkan
Lakukan ini dengan mengklik kanan basis data -> "restore"
6. Pilih pencari file
Pastikan untuk memilih lokasi file secara manual, JANGAN seret dan jatuhkan file ke bidang pengunggah di pgadmin. Karena Anda akan mengalami izin kesalahan. Alih-alih, cari file yang baru saja Anda buat:
7. Temukan file tersebut
Anda mungkin harus mengubah filter di kanan bawah ke "Semua file". Temukan file setelahnya, dari langkah 4. Sekarang tekan tombol "Pilih" kanan untuk mengonfirmasi
8. Kembalikan file tersebut
Anda akan melihat halaman ini lagi, dengan lokasi file dipilih. Silakan dan kembalikan
9. Sukses
Jika semuanya baik, kanan bawah akan memunculkan indikator yang menunjukkan pengembalian yang berhasil. Anda dapat menavigasi ke tabel Anda untuk melihat apakah data telah dipulihkan layak pada setiap tabel.
10. Jika tidak berhasil:
Jika langkah 9 gagal, coba hapus skema publik lama Anda di database Anda. Pergi ke "Alat Kueri"
Jalankan blok kode ini:
Sekarang coba langkah 5 hingga 9 lagi, itu akan berhasil
EDIT - Beberapa catatan tambahan. Perbarui PGADMIN4 jika Anda mendapatkan kesalahan saat mengunggah dengan sesuatu di sepanjang baris "header pengarsipan 1,14 versi yang tidak didukung" selama pemulihan
sumber
Jika database memiliki koneksi terbuka, skrip ini dapat membantu. Saya menggunakan ini untuk membuat database uji dari cadangan database produksi langsung setiap malam. Ini mengasumsikan bahwa Anda memiliki file cadangan .SQL dari db produksi (saya melakukan ini dalam webmin).
sumber
Menggunakan pgAdmin, lepaskan basis data yang ingin Anda gunakan sebagai templat. Kemudian Anda memilihnya sebagai templat untuk membuat database baru, ini menghindari kesalahan yang sudah digunakan.
sumber
Jika Anda ingin menyalin seluruh skema, Anda dapat membuat pg_dump dengan perintah berikut:
pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password
Dan ketika Anda ingin mengimpor dump itu, Anda dapat menggunakan:
psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql
Info lebih lanjut tentang string koneksi: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
Atau hanya menggabungkannya dalam satu liner:
sumber
Putuskan koneksi basis data "templated" yang ingin Anda gunakan sebagai templat.
Jalankan 2 kueri seperti di bawah ini
(Pernyataan SQL di atas akan menghentikan semua sesi aktif dengan TemplateDB dan kemudian Anda sekarang dapat memilihnya sebagai templat untuk membuat database TargetDB baru, ini menghindari kesalahan yang sudah digunakan.)
sumber
Coba ini:
gl XD
sumber