PostgreSQL 9.1 Hot Backup Error: sistem database mulai dinyalakan

16

Saya telah mengerjakan cadangan panas untuk Postgres 9.1 untuk sementara dan mengalami masalah yang konsisten. Setelah memulai kembali Postgres di server slave, file log pgstartup dan file log harian di bawah direktori pg_log dibaca tanpa kesalahan. Namun, ketika saya mencoba masuk ke database menggunakan perintah psql, saya mendapatkan kesalahan:

FATAL: sistem database mulai dinyalakan.

File recovery.conf juga tidak beralih ke recovery.done. Saya telah meneliti secara ekstensif kesalahan ini dan secara konsisten menemukan respons yang sama: database belum ditutup dengan benar sebelum saya mencoba me-restart Postgres. Satu-satunya cara saya me-restart Postgres adalah melalui perintah service postgresql-9.1 restartatau /etc/init.d/postgresql-9.1 restart. Setelah saya menerima kesalahan ini, saya membunuh semua proses dan mencoba lagi untuk me-restart database dan masih menerima kesalahan yang sama. Saya bingung harus ke mana dari sini dan bagaimana memperbaiki masalah ini. Di bawah ini adalah proses tepat yang telah saya lakukan untuk menyelesaikan cadangan panas.

Konfigurasi Master Server:

pg_hba.conf, menambahkan baris:

host replikasi postgres kepercayaan IPAddressOfSlaveServer

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address = '*'
port = 5432
max_wal_senders = 5
wal_keep_segments = 32

Konfigurasi Server Slave:

postgresql.conf:

hot_standby = aktif

recovery.conf:

standby_mode = aktif
primary_conninfo = host = IPAddressOfMasterServer
port = 5432
user = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Setelah mengkonfigurasi kedua server

Saya mengubah ke pengguna postgres di server master dan menjalankan perintah:

psql -c "Pilih pg_start_backup ('label', true);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data slave: /var/lib/pgsql/9.1/data \
        --exclude postmaster.pid
pgsql -c "pilih pg_stop_backup ();";

Setelah menyinkronkan database dengan server slave

Saya me-restart server slave dan memulai tidak gagal. Pgstartup.log berbunyi:

Keberhasilan. Anda sekarang dapat memulai server database menggunakan:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
atau
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l mulai logfile

file log hari ini, postgresql-Thu.log, membaca:

Log: mematikan
Log: Sistem basis data dimatikan
Log: sistem basis data dimatikan dalam pemulihan pada 2012-4-10
Log: memasuki mode siaga
Log: file log yang dipulihkan "logFileName" dari arsip
Log: kondisi pemulihan konsisten mencapai pada 0 / BF0000B0
Log: ulang dimulai pada 0 / BF000020
Log: file log yang dipulihkan "logFileName" dari arsip
Log: halamanaddr tak terduga 0/85000000 dalam file log 0, segmen 192, offset 0
Log: halamanaddr tak terduga 0/85000000 dalam file log 0, segmen 192, offset 0
Log: replikasi streaming berhasil terhubung ke primer

Saya meneliti pageaddr yang tidak terduga dan dari arsip postgres, adalah pemahaman saya bahwa itu cukup normal dan salah satu cara yang diharapkan untuk mendeteksi akhir-WAL.

Saran apa pun akan sangat dihargai.

Ola Ström
sumber

Jawaban:

11

Pesan "Sistem basis data sedang dimulai." tidak menunjukkan kesalahan. Alasannya adalah pada tingkat FATAL adalah agar ia akan selalu membuatnya ke log, terlepas dari pengaturan log_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

Setelah rsync, apakah Anda benar-benar menjalankan apa yang Anda perlihatkan ?:

pgsql -c "pilih pg_stop_backup ();";

Karena ada, sejauh yang saya tahu, tidak ada yang pgsqldapat dieksekusi, yang akan membuat cadangan tidak selesai, dan budak tidak akan pernah keluar dari mode pemulihan. Di sisi lain, mungkin Anda benar-benar lari psql, karena kalau tidak, saya tidak melihat bagaimana budak akan mencatat pesan sukses seperti:

Log: kondisi pemulihan konsisten mencapai pada 0 / BF0000B0

dan:

Log: replikasi streaming berhasil terhubung ke primer

Apakah Anda mencoba menghubungkan ke budak pada titik ini? Apa yang terjadi?

Pesan "Sukses. Sekarang Anda dapat mulai ..." yang Anda sebutkan dihasilkan oleh initdb, yang seharusnya tidak dijalankan sebagai bagian dari pengaturan seorang budak; jadi saya pikir Anda mungkin bingung tentang sesuatu di sana. Saya juga khawatir tentang pernyataan yang tampaknya bertentangan ini:

Satu-satunya cara saya me-restart Postgres adalah melalui layanan restart postgresql-9.1 atau /etc/init.d/postgresql-9.1 restart perintah. Setelah saya menerima kesalahan ini, saya membunuh semua proses dan mencoba lagi untuk me-restart database ...

Apakah Anda mencoba menghentikan layanan melalui skrip layanan? Apa yang terjadi? Mungkin membantu dalam memahami log jika Anda awali baris dengan informasi lebih lanjut. Kita gunakan:

log_line_prefix = '[%m] %p %q<%u %d %r> '

The recovery.confScript tampak aneh. Apakah Anda menyalin dari direktori pg_xlog master, direktori pg_xlog aktif slave, atau direktori arsip?

kgrittn
sumber
8

Saya memiliki beberapa masalah dengan ini, kecuali saya berada di 9.3, bukan 9.1. Bagaimanapun, perbaikannya ternyata cukup sepele:

The postgresql.confFile sedang disalin dari master ke slave, dan aku meninggalkannya dimodifikasi pada budak. Saya pikir yang harus Anda lakukan adalah menambahkan recovery.conffile dan semuanya akan berfungsi (baik itu berhasil, tapi saya tidak bisa masuk ke server slave yang direplikasi, tetapi, itu sedang direplikasi).

Saya mengedit file budak postgresql.confdan:

  • berkomentar archive_mode=on
  • berkomentar archiveperintah; dan
  • berkomentar hot_standby=on

Itu berhasil: Saya bisa menjadikan database sebagai server hanya baca yang siap menerima permintaan hanya baca.

Ada skrip bernama pg_basebackupyang akan membuat direktori bootstrap untuk slave. Ini adalah direktori data dengan database di dalamnya. Anda perlu memodifikasi postgresql.conffile sebelum dapat digunakan sebagai budak seperti yang dijelaskan, sesuatu yang cukup sederhana untuk pg_basebackupskrip posting .

Greg
sumber
1
Ketika Anda menulis "berkomentar hot_standby = pada" Saya kira maksud Anda "menghapus tanda # -comment sebelumnya, untuk benar-benar mengaktifkan hot_standby" :) Jika tidak dalam hot_standby, db akan selalu "memulai" dengan desain (hangat) siaga, siap untuk kegagalan, tetapi tidak menanyakan). Perhatikan, bahwa jika Anda membuat basis-cadangan dump tanpa memiliki wal_level = hot_standby pada master dan kemudian menyalakan hot_stanby pada slave, Anda harus membuang kembali dan memasukkan kembali slave db untuk hot_standby untuk bangkit dan berjalan. Kalau tidak, Anda akan mendapatkan beberapa kesalahan fatal.
Frederik Struck-Schøning
hot_standby = pada diperlukan, itu harus ada
Abhilash Mishra
7

Menariknya saya memecahkan ini dengan cara yang berlawanan dengan yang dilakukan Paulus.

Saya tambahkan:

hot_standby = on

atau, lebih tepatnya, diubah #hot_standby = offke atas. (Ini menggunakan 9.5)

pengguna41734
sumber
1

Saya mendapatkan ini dalam log:

MSK FATAL:  the database system is starting up

Untuk memperbaiki mulai server yang tak terbatas lakukan ini: Hentikan layanan (jika ada), matikan proses 'postgres' (biasanya ada). Jalankan ini di konsol:

pg_resetxlog.exe -D ../Data -f

Ussue ini muncul karena direktori xLog memiliki data, yang tidak ditulis sebelum layanan ditutup. Dan kemudian pada startup layanan dia mencoba memperbaiki data itu. Kadang-kadang membekukan startup dan tidak pernah berakhir .. Perintah di atas membersihkan data yang tidak tetap ini, yang menerapkan layanan untuk memulai dengan data tetap saja. Mungkin beberapa bagian dari data yang tidak tetap akan hilang, tetapi server database akan berjalan secara normal dan dapat diakses oleh aplikasi.

Andrew Zolotarev
sumber