Как восстановить сервер PostgreSQL после сбоя кластера?

Здравствуйте! Прошу вашей помощи в решении возникшей проблемы. 

У меня есть сервер PostgreSQL Pro 9.6, работающий на Astra Linux, который был поврежден в процессе тестовых работ. Уточнить, что именно привело к этой поломке, или получить доступ к логам невозможно по нескольким причинам. 

В результате сервер (кластер) отказывается запускаться, и в логах появляется ошибка о том, что роль postgres не существует. Я пробовал выполнить следующую команду:

<pre><code class="bash">sudo -u postgres /usr/lib/postgresql/9.6/bin/postgres --single -D /etc/postgresql/9.6/main
ПРЕДУПРЕЖДЕНИЕ:  в этой системе баз данных не создано ни одной роли
ПОДСКАЗКА:  Вы должны немедленно выполнить CREATE USER "postgres" CREATEUSER;.
СБОЙ:  база данных "postgres" не существует</code></pre>

Попробовал следующие шаги:
1) Переносил папку main на другой рабочий сервер - ошибки остались прежними.
2) Переносил только папку base на другой рабочий сервер - сервер не обнаружил эти базы, как и ожидалось.
3) Переносил папку base вместе с global на другой рабочий сервер - сервер не стартует с ошибкой записи контрольной точки.

Меня больше всего интересует восстановление структуры схем, таблиц, функций и триггеров, поскольку данные не столь важны. Задача усложняется тем, что по определенным причинам на текущий компьютер нельзя установить какое-либо другое ПО, но имеется возможность перенести папку main на другую машину.
  • 10 февраля 2025 г. 13:44
Ответы на вопрос 3
Восстановление сервера PostgreSQL 9.6 после сбоя кластера может быть сложной задачей, особенно в вашем случае, когда роль `postgres` не существует, и вы сталкиваетесь с различными ошибками. Вот несколько шагов, которые вы можете предпринять, чтобы попытаться восстановить структуру схем, таблиц, функций и триггеров:

### 1. Переинициализация кластера

Если данные не столь важны, вы можете переинициализировать кластер PostgreSQL. Это можно сделать, но перед этим вам нужно сохранить все важные метаданные. Чтобы переинициализировать кластер, выполните следующие шаги:

1. **Создайте резервную копию папки `main`:**
   ```bash
   cp -r /etc/postgresql/9.6/main /etc/postgresql/9.6/main_backup
   ```

2. **Переинициализируйте кластер:**
   ```bash
   sudo -u postgres /usr/lib/postgresql/9.6/bin/initdb -D /etc/postgresql/9.6/main
   ```

3. **Запустите сервер:**
   ```bash
   sudo systemctl start postgresql
   ```

Это создаст базу данных по умолчанию и роль `postgres`.

### 2. Восстановление схем и таблиц

Если у вас есть доступ к старому кластеру (или вы переносили его на другую машину), вы можете попробовать выполнить следующие команды, чтобы попытаться восстановить схемы и структуры:

1. **Экспортируйте схемы из последнего валидного состояния:**
   Если у вас есть доступ к данным и метаданным на старом сервере, попробуйте использовать `pg_dump` для экспорта схем:

   ```bash
   sudo -u postgres pg_dump -s -d your_database_name > schema_backup.sql
   ```

   Этот файл будет содержать только структуру базы данных (сказую, таблицы, функции и триггеры).

2. **Импортируйте схемы в новую базу:**
   Перенесите файл `schema_backup.sql` на новый сервер и загрузите его:

   ```bash
   sudo -u postgres psql -d postgres -f schema_backup.sql
   ```

### 3. Восстановление данных, если необходимо

Если откат и экспорт схем не сработали, но данные не столь важны, подумайте о пересоздании необходимых таблиц и структур вручную с нуля. Вы также можете использовать old main для поиска конкретных SQL-скриптов, которые вы использовали для создания ваших таблиц и схем.

### 4. Восстановление из pg_basebackup

Если у вас есть бэкап, сделанный с помощью `pg_basebackup`, вы также можете восстановить сервер из него. Пример команды для восстановления:

```bash
pg_basebackup -D /var/lib/postgresql/9.6/main -Fp -Xs -P
```

### Основные вещи, которые стоит помнить:

- Всегда создавайте резервные копии перед выполнением операций, которые могут повредить данные или конфигурацию.
- Проверьте правильность установленных переменных окружения и конфигурации сервера.
- Если вы имеете возможность, обязательно найдите способ получить доступ к логам, чтобы лучше понять причину сбоя.

### Завершение

Если ни один из этих шагов не помогает или вызывает дополнительные проблемы, подумайте о том, чтобы обратиться к специалистам по PostgreSQL для более глубокой диагностики и решения вашей проблемы.
Восстановил вручную перепрописав все индексы. Долго, нудно, но восстановил.
С такой древностью скорее всего никак.
Похожие вопросы