Почему логическая репликация в Postgres не работает?

Здравствуйте! У меня есть база данных размером 17 Гб в 1С. Я настраиваю логическую репликацию этой базы на другой кластер. Один сервер (192.*.*161) работает как мастер, установлен Postgresql 16, и на нём база данных. Другой сервер (192.*.*.132) предназначен для репликации, также установлен Postgresql 16. 
На мастере (где находится база) в файле postgresql.conf установлен параметр wal_level="logical", а в файле pg_hba.conf есть следующая запись: "host    db_name    postgres    192.*.*.132/32     trust". 
Я перезапустил мастер после внесения изменений в конфигурационные файлы и выполню команду:
```
pg_dumpall --database=postgres --host=192.168.250.161 --no-password --globals-only --no-privileges | pg_dump --dbname "1s_copy" --host=192.168.250.161 --no-password --create --schema-only   | psql
``` 
Затем подключаюсь к базе через psql и создаю публикацию:
```
CREATE PUBLICATION 1s_copy FOR ALL TABLES;
```
После этого, через pgadmin, подключаюсь к серверу-реплике (192.*.*.132) и вижу, что нужная база 1s_copy была создана. Подключаюсь к ней через psql и создаю подписку:
```
CREATE SUBSCRIPTION db_1s_copy CONNECTION 'host=192.*.*.161 dbname=1s_copy' PUBLICATION "1s_copy";
```
И получаю ошибку:
```
ERROR:  отношение "public._refsinf16672" не существует 
ОШИБКА:  отношение "public._refsinf16672" не существует
SQL state: 42P01
```
Пожалуйста, подскажите, в чём может быть проблема?
Изображение к вопросу
  • 8 февраля 2024 г. 12:48
Ответы на вопрос 3
Ошибка `ERROR: отношение "public._refsinf16672" не существует` означает, что на сервере-подписчике (то есть на реплике) не найдено отношение (таблицу) с именем `public._refsinf16672`, которое ожидается на сервере-издателе (мастере). Существует несколько возможных причин, по которым такое может произойти:

1. Необходимые таблицы не были скопированы или созданы на реплике перед подпиской на публикацию. Необходимо убедиться, что схема базы данных (но не данные) была полностью скопирована на сервер-подписчик.

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

3. Изменения в метаданных или в схеме базы данных, которые произошли после создания схемы на реплике, но до начала репликации. В вашем случае это может быть несоответствие из-за того, что таблицы были удалены или переименованы на сервере-издателе после создания схемы на подписчике.

Для устранения ошибки следует:

- Проверьте, что все необходимые объекты схемы (таблицы, последовательности, индексы, типы данных и так далее) корректно скопированы и существуют на сервере-подписчике.
- Проверьте, что структура таблиц одинакова на сервере-издателе и сервере-подписчике.
- Если произошли изменения в схеме после создания репликации, возможно потребуется повторно начать процесс репликации, чтобы все изменения отразились на реплике.
- Убедитесь, что на сервере-издателе нет ошибок или недостающих объектов.

Если данных в таблицах много и передача схемы данных через `pg_dump` и `pg_restore` или `psql` проводится без переноса данных, то необходимо убедиться, что все зависимые объекты также были созданы. Из сообщения об ошибке можно предположить, что `public._refsinf16672` - это какая-то специфичная для 1С таблица или системная таблица, которая должна существовать в базе.

Проверьте, действительно ли таблица `_refsinf16672` существует на сервере-издателе с помощью следующего запроса:

```sql
SELECT * FROM information_schema.tables WHERE table_name = '_refsinf16672';
```

Если таблица не найдена на сервере-издателе, то возможно название таблицы ошибочное или таблица была удалена. Если таблица существует на издателе, но отсутствует на подписчике, убедитесь, что процесс создания схемы на подписчике был выполнен полностью и корректно.
The schema definitions are not replicated, and the published tables must exist on the subscriber.

https://www.postgresql.org/docs/current/logical-re...
По-моему, написано однозначно и не допускает вариантов прочтения. Нет?

| psql

иначе говоря, где вы создали таблицы и где потом пытаетесь create subscription делать. Это явно два разных места.
Спасибо протер глаза и разобрался ))  Проблема собственно на скриншоте ))) 
Похожие вопросы