Так получилось, что База Данных неудачно перезагрузилась, неожиданно закончилось место на диске или последний сегмент не смог записаться на диск, не запускается Postgresql.

Восстановление PostgreSQL после повреждения файлов XLOG.

По логами видим сообщения:

(18777)2017-04-04 09:36:11 MSK:LOG: database system shutdown was interrupted; last known up at 2017-03-30 11:43:56 MSK
(18777)2017-04-04 09:36:11 MSK:LOG: could not open file "pg_xlog/000000010000005100000028" (log file 81, segment 40): No such file or directory
(18777)2017-04-04 09:36:11 MSK:LOG: invalid primary checkpoint record
(18777)2017-04-04 09:36:11 MSK:LOG: could not open file "pg_xlog/000000010000005100000028" (log file 81, segment 40): No such file or directory
(18777)2017-04-04 09:36:11 MSK:LOG: invalid secondary checkpoint record
(18777)2017-04-04 09:36:11 MSK:PANIC: could not locate a valid checkpoint record
(18754)2017-04-04 09:36:11 MSK:LOG: startup process (PID 18777) was terminated by signal 6: Aborted
(18754)2017-04-04 09:36:11 MSK:LOG: aborting startup due to startup process failure

Смотрим pg_controldata /var/lib/pgsql/data (каталог с установленным postgresql)

Интересует:
Latest checkpoint’s NextXID: 0/690
Latest checkpoint’s NextOID: 74741

затем, от имени пользователя, с которого запускается сервис postgresql выполняем команду:

su postgres
pg_resetxlog -o 74741 -x 690 -f /var/lib/pgsql/data

подставляем свои значения согласно pg_resetxlog -o [NextOID] -x [NextXID] [путь до Базы Данных].
Таким образом мы сделали postgresql восстановление базы.

2 thoughts on “Восстановление PostgreSQL после повреждения файлов pg_xlog.

  1. Replica

    #!/bin/bash

    # Параметры
    MASTER_IP=»192.168.100.125″
    REPLICA_IP=»192.168.100.150″
    REPL_USER=»replicator»
    REPL_PASSWORD=»SecurePass123!» # Должен совпадать с мастером
    PG_VERSION=15

    # Установка PostgreSQL через DNF
    echo «Установка PostgreSQL…»
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf -qy module disable postgresql
    sudo dnf install -y postgresql$PG_VERSION-server postgresql$PG_VERSION-contrib

    # Остановка службы
    sudo systemctl stop postgresql-$PG_VERSION

    # Очистка каталога данных
    echo «Подготовка каталога данных…»
    DATA_DIR=»/var/lib/pgsql/$PG_VERSION/data»
    sudo rm -rf $DATA_DIR/*
    sudo chown postgres:postgres $DATA_DIR
    sudo chmod 700 $DATA_DIR

    # Копирование данных с мастера
    echo «Копирование данных с мастера…»
    sudo -u postgres PGPASSWORD=»$REPL_PASSWORD» pg_basebackup \
    -h $MASTER_IP -U $REPL_USER -D $DATA_DIR \
    -P -R -X stream -S replica_slot

    # Запуск PostgreSQL
    echo «Запуск службы PostgreSQL…»
    sudo systemctl start postgresql-$PG_VERSION

    # Проверка
    echo «=== Проверка установки ===»
    echo «Состояние службы:»
    sudo systemctl status postgresql-$PG_VERSION | grep active

    echo «Проверка режима репликации:»
    sudo -i -u postgres psql -c «SELECT pg_is_in_recovery();»

    echo «Проверка подключения к мастеру:»
    sudo -i -u postgres psql -c «SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();»

    echo «Настройка реплики завершена!»

  2. Master

    #!/bin/bash

    # Параметры
    MASTER_IP=»192.168.100.125″
    REPLICA_IP=»192.168.100.150″
    REPL_USER=»replicator»
    REPL_PASSWORD=»SecurePass123!» # Замените на реальный пароль
    PG_VERSION=15

    # Установка PostgreSQL через DNF
    echo «Установка PostgreSQL…»
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf -qy module disable postgresql
    sudo dnf install -y postgresql$PG_VERSION-server postgresql$PG_VERSION-contrib

    # Инициализация БД
    echo «Инициализация БД…»
    if [ -d «/var/lib/pgsql/$PG_VERSION/data» ]; then
    echo «Каталог данных уже существует. Пропускаем инициализацию.»
    else
    sudo /usr/pgsql-$PG_VERSION/bin/postgresql-$PG_VERSION-setup initdb
    fi

    # Запуск службы
    sudo systemctl enable postgresql-$PG_VERSION —now

    # Настройка конфигурации
    echo «Настройка postgresql.conf…»
    PG_CONF=»/var/lib/pgsql/$PG_VERSION/data/postgresql.conf»
    sudo sed -i «s/^#\?listen_addresses.*/listen_addresses = ‘localhost,$MASTER_IP’/» $PG_CONF
    sudo sed -i «s/^#\?wal_level.*/wal_level = replica/» $PG_CONF
    sudo sed -i «s/^#\?max_wal_senders.*/max_wal_senders = 3/» $PG_CONF
    sudo sed -i «s/^#\?hot_standby.*/hot_standby = on/» $PG_CONF

    # Настройка доступа для реплики
    echo «Настройка pg_hba.conf…»
    PG_HBA=»/var/lib/pgsql/$PG_VERSION/data/pg_hba.conf»
    if ! sudo grep -q «replication.*$REPL_USER.*$REPLICA_IP» $PG_HBA; then
    echo «host replication $REPL_USER $REPLICA_IP/32 scram-sha-256» | sudo tee -a $PG_HBA
    fi

    # Открытие порта в firewall
    echo «Настройка firewall…»
    sudo firewall-cmd —add-service=postgresql —permanent
    sudo firewall-cmd —reload

    # Перезапуск PostgreSQL
    sudo systemctl restart postgresql-$PG_VERSION

    # Создание пользователя репликации
    echo «Создание пользователя репликации…»
    sudo -i -u postgres psql <<EOF
    DO \$\$
    BEGIN
    IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '$REPL_USER') THEN
    CREATE USER $REPL_USER WITH REPLICATION ENCRYPTED PASSWORD '$REPL_PASSWORD';
    END IF;
    END
    \$\$;

    SELECT * FROM pg_create_physical_replication_slot('replica_slot')
    WHERE NOT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = 'replica_slot');
    EOF

    # Проверка
    echo "=== Проверка установки ==="
    echo "Состояние службы:"
    sudo systemctl status postgresql-$PG_VERSION | grep active

    echo "Проверка репликации:"
    sudo -i -u postgres psql -c "SELECT client_addr, state, sync_state FROM pg_stat_replication;"

    echo "Проверка слотов:"
    sudo -i -u postgres psql -c "SELECT * FROM pg_replication_slots;"

    echo "Проверка подключения:"
    sudo -i -u postgres psql -c "SELECT pg_is_in_recovery();"

    echo "Настройка мастера завершена!"

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.