Saya telah membuat dump db baru dari server produksi dengan --data-only
dan --column-inserts
flag, jadi saya hanya punya banyak pernyataan untuk memasukkan data ketika melakukan restore pada server staging.
pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql
Bagaimana cara menghapus semua data dalam database server pentas terlebih dahulu, sebelum mengembalikan data dari dump produksi?
Saya ingin menghapus semua data saja sehingga saya tidak perlu drop dan membuat database dan semua itu. Saya hanya ingin menghapus data dan memasukkan data baru itu saja.
Saya tidak memiliki opsi untuk menjatuhkan dan membuat database karena beberapa alasan. Saya harus menghapus semua data dan hanya memasukkan saja, jadi apa pun yang diperlukan untuk menemukan cara melakukan ini, saya bersedia melakukannya, tetapi perlu bantuan untuk memulainya.
Saya juga perlu mengotomatiskan proses ini. Akan mengotomatiskan "dumping data dari production db", lalu "menghapus data pada staging db", dan kemudian "mengembalikan data ke staging db". Saya hanya perlu bantuan pada bagian "menghapus data tentang pementasan db".
Saya menjalankan PostgreSQL 9.5.2
sumber
TRUNCATE table1, table2, ... <list of all tables>;
? apakah mereka berdua melakukan hal yang sama?pg_restore memiliki flag --clean (atau mungkin --create) yang akan secara otomatis menghapus data sebelum menjalankan operasi ..
Dokumentasi yang Luar Biasa akan sangat membantu Anda ...
Hanya untuk memperjelas, jika itu membingungkan:
Ini tidak akan menghapus database aktual .. hanya tabel / tampilan / etc.
Jika, karena alasan tertentu, menjatuhkan dan membuat ulang tabel tidak dapat diterima, maka Anda harus membuatnya lebih banyak pekerjaan untuk secara manual membuat skrip yang membuat
data only
dump dari sumber db, masalahTRUNCATE
atauDELETE
dalam database target, dan kemudian memuat dump data. Tidak ada cara cepat / licin untuk melakukan ini, sejauh yang saya ketahui.sumber
Kueri di atas akan menghasilkan kueri terpotong untuk semua tabel dalam database.
sumber
Catatan: jawaban saya adalah tentang menghapus tabel dan objek database lainnya; untuk menghapus semua data dalam tabel, yaitu memotong semua tabel , Endre Both telah memberikan pernyataan (eksekusi langsung) yang dijalankan dengan baik sebulan kemudian.
Untuk kasus-kasus di mana Anda tidak bisa hanya
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
atau sesuatu, di sini adalah skrip SQL yang berdiri sendiri yang saya tulis, yang aman untuk transaksi (yaitu Anda dapat meletakkannya di antaraBEGIN;
dan baikROLLBACK;
untuk mengujinya atauCOMMIT;
untuk benar-benar melakukan perbuatan) dan membersihkan "semua" objek basis data ... baik, semua yang digunakan dalam basis data yang digunakan aplikasi kita atau yang dapat saya tambahkan dengan bijaksana, yaitu:CHECK
,,UNIQUE
)VIEW
s (normal atau terwujud)public
atau DB-internal) “we” own: script berguna ketika dijalankan sebagai “bukan superuser basis data”; superuser dapat menghapus semua schemata (yang benar-benar penting masih secara eksplisit dikecualikan)Tidak jatuh adalah (beberapa disengaja; beberapa hanya karena saya tidak punya contoh dalam DB kami):
public
skema (misalnya untuk hal-hal ekstensi yang disediakan di dalamnya)Ini sangat berguna untuk kasus-kasus ketika dump yang ingin Anda pulihkan adalah versi skema database yang berbeda (misalnya dengan Debian
dbconfig-common
, Flyway atau Liquibase / DB-Manul) daripada database yang ingin Anda pulihkan.Saya juga punya versi yang menghapus "semuanya kecuali dua tabel dan apa yang menjadi milik mereka" (urutan, diuji secara manual, maaf, saya tahu, membosankan) jika ada yang tertarik; perbedaannya kecil. Hubungi saya atau periksa repo ini jika tertarik.
SQL
Diuji, kecuali penambahan selanjutnya (
extensions
disumbangkan oleh Clément Prévost ), di PostgreSQL 9.6 (jessie-backports
). Penghapusan agregat diuji pada 9.6 dan 12.2, penghapusan prosedur juga diuji pada 12.2. Selamat datang di perbaikan bug dan perbaikan lebih lanjut!sumber