pg_restore membutuhkan waktu lebih lama dari pg_dump

9

Saya secara teratur menyimpan dan kemudian memulihkan database PostgreSQL yang lebih kecil, yang digunakan untuk pengujian. Datanya dimutakhirkan secara teratur sebagai hasil dari pengujian, kemudian dump baru harus dibuat, dan dump secara teratur digunakan untuk membuat ulang database dalam keadaan yang terdefinisi dengan baik.

Saya mencatat bahwa dump (menggunakan pg_dump -Fc database) hanya membutuhkan beberapa detik, tetapi restore ( pg_restore -d database) membutuhkan waktu sekitar satu menit. Ini sepertinya aneh. Saya akan mengharapkan keduanya untuk mengambil waktu yang sama (dengan asumsi kedua tugas I / O-terikat).

Apakah ada masalah dengan pemulihan? Bisakah saya membuatnya lebih cepat? Atau apakah normal untuk mengembalikan lebih lama daripada dump? (Dan jika ya, lalu mengapa?)

File dump biasanya memiliki sekitar 3-4 MiB; DBMS adalah PostgreSQL V8.4, berjalan pada Pentium4 3GHz dengan RAM 1GiB di bawah Ubuntu Linux.

sleske
sumber

Jawaban:

9

Konten indeks bukan bagian dari cadangan, hanya definisi indeks. Dan itu hanya akan memakan waktu beberapa byte. Ketika indeks dibuat selama pemulihan dan semua data diindeks, itu akan jauh lebih besar. Ini akan memakan waktu, tetapi tergantung pada situasi Anda, berapa banyak waktu.

pg_restore memang memiliki opsi untuk pemulihan bersamaan (seperti versi 8.4), gunakan--jobs=number-of-jobs

Frank Heikens
sumber
Menarik, terima kasih. Apakah ada cara untuk membuang indeks juga, untuk mempercepat pengembalian (dengan biaya file dump yang lebih besar)?
sleske
Tidak, konten indeks tidak dapat menjadi bagian dari cadangan. Untuk database yang sangat kecil seperti milik Anda (3-4 MiB), toh seharusnya tidak menjadi masalah.
Frank Heikens
Informasi tambahan: pg_dump tidak memiliki akses ke konten indeks. pg_dump menggunakan pernyataan SELECT untuk mendapatkan semua konten dari tabel dan konten dari tabel sistem untuk membuat cadangan. Ini "hanya" pembungkus di sekitar beberapa pernyataan SELECT dan beberapa fungsi untuk menulis hasilnya ke disk.
Frank Heikens
@ Frank: Terima kasih. Tidak tahu tentang implementasi pg_dump. Dalam kasus kami, mempercepat pengembalian akan sangat membantu, karena perlu dijalankan berulang kali sebagai bagian dari tes otomatis, jadi menurunkannya dari 1 menit untuk mengatakan 10s akan membantu. Namun ternyata itu tidak layak. Saya harus mencari solusi yang berbeda ...
sleske
2
@sleske Anda mungkin mencoba dengan pendekatan cadangan sistem file . Ini harus menjaga indeks dan, di samping itu, mungkin berjalan sedikit lebih cepat untuk cadangan dan pemulihan
Stefano
4

Untuk pemulihan, database harus melakukan banyak pekerjaan tambahan:

Beberapa hal langsung terlintas dalam pikiran:

  • Menulis lebih lambat daripada membaca
  • Mengurai input membutuhkan waktu
  • Memperbarui indeks dan struktur internal lainnya
  • Mempertahankan integritas referensial

Namun, tidak yakin apakah ini merupakan perbedaan waktu.

Sven
sumber