PostgreSQL 9.1 Etkin Yedekleme Hatası: veritabanı sistemi başlatılıyor


16

Bir süredir Postgres 9.1 için bir sıcak yedekleme üzerinde çalışıyorum ve tutarlı bir sorunla karşılaştım. Slave sunucusunda Postgres yeniden başlatıldıktan sonra, pgstartup günlük dosyası ve pg_log dizini altındaki günlük günlük dosyası hatasız okunur. Ancak, psql komutunu kullanarak veritabanına girmeye çalıştığımda hatayı alıyorum:

FATAL: veritabanı sistemi başlatılıyor.

Recovery.conf dosyası da recovery.done dosyasına dönmez. Bu hatayı kapsamlı bir şekilde araştırdım ve sürekli olarak aynı yanıtı buldum: Postgres'i yeniden başlatmayı denemeden önce veritabanı temiz bir şekilde kapatılmadı. Postgres'i yeniden başlatmamın tek yolu service postgresql-9.1 restartveya /etc/init.d/postgresql-9.1 restartkomutlarıdır. Bu hatayı aldıktan sonra, tüm işlemleri öldürürüm ve veritabanını yeniden başlatmayı dener ve yine aynı hatayı alırım. Buradan nereye gideceğimi ve bu sorunu nasıl çözeceğimi kaybettim. Aşağıda, sıcak yedeklemeyi tamamlamak için yaptığım tam işlem yer almaktadır.

Ana Sunucu Yapılandırmaları:

pg_hba.conf, satırı ekledi:

ana bilgisayar çoğaltma postgres IPAddressOfSlaveServer güven

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_adresi = '*'
bağlantı noktası = 5432
max_wal_senders = 5
wal_keep_segments = 32

Bağımlı Sunucu Yapılandırmaları:

postgresql.conf:

hot_standby = açık

recovery.conf:

standby_mode = açık
Primary_conninfo = Ana bilgisayar = IPAdresiOfMasterServer
bağlantı noktası = 5432
kullanıcı = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Her iki sunucuyu yapılandırdıktan sonra

Ana sunucuda postgres kullanıcı olarak değiştirmek ve komutları çalıştırın:

psql -c "pg_start_backup ('label', true) 'u seçin;";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data köle: /var/lib/pgsql/9.1/data \
        - postmaster.pid adresini ekleyin
pgsql -c "select pg_stop_backup ();";

Veritabanını bağımlı sunucu ile senkronize ettikten sonra

Slave sunucuyu yeniden başlatıyorum ve başlatma başarısız. Pgstartup.log şunu okur:

Başarı. Artık veritabanı sunucusunu aşağıdakileri kullanarak başlatabilirsiniz:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
veya
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l günlük dosyası başlangıcı

geçerli günlüğün günlük dosyası olan postgresql-Thu.log şunu okur:

Günlük: kapatılıyor
Günlük: Veritabanı sistemi kapalı
Günlük: veritabanı sistemi 2012-4-10 kurtarma işleminde kapatıldı
Günlük: bekleme moduna girme
Günlük: arşivden geri yüklenen günlük dosyası "logFileName"
Günlük: 0 / BF0000B0 değerinde tutarlı kurtarma durumuna ulaşıldı
Günlük: yeniden başlatma 0 / BF000020'de başlar
Günlük: arşivden geri yüklenen günlük dosyası "logFileName"
Günlük: 0 günlük dosyasında beklenmeyen pageaddr 0/85000000, segment 192, ofset 0
Günlük: 0 günlük dosyasında beklenmeyen pageaddr 0/85000000, segment 192, ofset 0
Günlük: akış çoğaltması başarıyla birincil sunucuya bağlandı

Beklenmedik pageaddr'yi araştırdım ve postgres arşivlerinden, oldukça normal olduğunu ve WAL sonu tespit etmenin beklenen yollarından biri olduğunu düşünüyorum.

Herhangi bir tavsiye büyük mutluluk duyacağız.

Yanıtlar:


11

"Veritabanı sistemi başlatılıyor." bir hata olduğunu göstermez. FATAL seviyesinde olmasının nedeni, ayarlarından bağımsız olarak her zaman günlüğe yapmasıdır log_min_messages:

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

Rsync'ten sonra, gösterdiklerinizi gerçekten çalıştırdınız mı ?:

pgsql -c "select pg_stop_backup ();";

Bildiğim kadarıyla pgsql, yedeklemenin tamamlanmasına neden olacak yürütülebilir bir dosya olmadığından ve köle hiçbir zaman kurtarma modundan çıkmayacaktı. Öte yandan, belki de gerçekten koştunuz psql, çünkü aksi halde köle gibi başarı mesajlarını nasıl kaydedeceğini görmüyorum:

Günlük: 0 / BF0000B0 değerinde tutarlı kurtarma durumuna ulaşıldı

ve:

Günlük: akış çoğaltması başarıyla birincil sunucuya bağlandı

Bu noktada köleye bağlanmayı denedin mi? Ne oldu?

initdbBir köle kurmanın bir parçası olarak çalıştırılmaması gereken, bahsettiğiniz "Başarılı. Şimdi başlayabilirsiniz ..." mesajı oluşturulur ; bu yüzden orada bir şey hakkında kafanız karışmış olabilir. Görünüşe göre bu çelişkili ifadelerden de endişe duyuyorum:

Postgres'i yeniden başlatmanın tek yolu, postgresql-9.1 restart veya /etc/init.d/postgresql-9.1 restart komutlarını kullanmaktır. Bu hatayı aldıktan sonra, tüm işlemleri öldürürüm ve veritabanını yeniden başlatmayı denerim ...

Hizmeti hizmet komut dosyası aracılığıyla durdurmayı denediniz mi? Ne oldu? Daha fazla bilgi içeren satırlara önek eklediyseniz, günlüklerin anlaşılmasına yardımcı olabilir. Kullanırız:

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

recovery.confSenaryo tuhaf görünüyor. Master'ın pg_xlog dizininden, slave'in etkin pg_xlog dizininden veya bir arşiv dizininden mi kopyalama yapıyorsunuz?


8

Bu konuda da bazı sorunlar yaşadım, 9,1 değil 9,3'tüm. Her neyse, düzeltmenin oldukça önemsiz olduğu ortaya çıktı:

postgresql.confDosya köleye ustadan üzerine kopyalanan ediliyordu ve ben köle üzerinde değiştirilmemiş bunu ayrıldığını. Tüm yapmanız gereken bir recovery.confdosya eklemek olduğunu düşündüm ve her şey işe yarayacaktı (iyi oldu, ama çoğaltılmış köle sunucusuna giriş yapamadım, ancak çoğaltılıyordu).

Köle'nin postgresql.confdosyasını düzenledim ve:

  • yorumladı archive_mode=on
  • yorum archivekomutu; ve
  • yorum yaptı hot_standby=on

Bunu yaptı: Ben veritabanını salt okunur sorguları kabul etmeye hazır salt okunur bir sunucu olarak elde edebildi.

pg_basebackupSlave için bootstrap dizini oluşturacak bir komut dosyası var . Bu, içinde veritabanı bulunan veri dizinidir. postgresql.confAçıklandığı gibi köle olarak kullanılmadan önce dosyayı değiştirmeniz gerekir, bu bir yazı pg_basebackupkomut dosyası için oldukça basit bir şey .


1
"Commented out hot_standby = on" Ben demek istediğini sanırım "yazdığınızda, daha önce hot_standby'yi etkinleştirmek için # -comment işaretini kaldırdık :) :) hot_standby içinde değilse, db her zaman tasarım tarafından" başlatılır " bekleme, yük devretmeye hazır, ancak sorgulama yapmaz). Master üzerinde wal_level = hot_standby olmadan ve sonra slave üzerinde hot_stanby'yi açmadan temel yedekleme dökümü yaptıysanız, kalkmak ve çalıştırmak için hot_standby için slave db'yi yeniden dökmeniz ve yeniden başlatmanız gerekeceğini unutmayın. Aksi takdirde bazı önemli hatalar alırsınız.
Frederik Struck-Schøning

hot_standby = on gerekli, orada olmalı
Abhilash Mishra

7

İlginç bir şekilde bunu Paul'ün tersi şekilde çözdüm.

Ekledim:

hot_standby = on

ya da daha doğrusu #hot_standby = offyukarıdakilere değiştirildi . (Bu 9.5 kullanıyordu)


1

Bunu günlüklerde aldım:

MSK FATAL:  the database system is starting up

Sunucunun sonsuz başlangıcını düzeltmek için şunu yapın: Hizmeti durdurun (varsa), 'postgres' işlemini (genellikle var) durdurun. Bunu konsolda çalıştırın:

pg_resetxlog.exe -D ../Data -f

Bu durum, xLog dizininde, hizmet kapatılmadan önce yazılmayacak bir veri olduğu için görünür. Sonra servis başlangıcında bu verileri düzeltmeye çalışır. Bazen başlatma dondurur ve asla bitmez .. Yukarıdan komut sadece sabit verilerle başlamak için hizmet uygulayan bu düzeltilmemiş verileri temizleyin. Düzeltilmemiş verilerin bazı bölümleri kaybolabilir, ancak veritabanı sunucusu normal olarak çalışır ve uygulamalar tarafından erişilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.