Так получилось, что База Данных неудачно перезагрузилась, неожиданно закончилось место на диске или последний сегмент не смог записаться на диск, не запускается 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 восстановление базы.
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 «Настройка реплики завершена!»
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 "Настройка мастера завершена!"