#Симптом и границы применимости
При восстановлении схемы PostgreSQL возникает ошибка о существующей последовательности или занятости имени: объект уже создан, дамп содержит повторное создание либо восстанавливается поверх неочищенной схемы. Нужно сопоставить состав дампа и работающие значения, не удаляя объекты вслепую.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Схема уже содержит sequenceПовторный restore пытается создать одноимённый объект. | relation ... already exists | Восстанавливать в чистый тестовый кластер |
| Ручное создание пересеклось с дампомВ миграции использовано то же имя последовательности, что и в дампе. | Ошибка CREATE SEQUENCE | Согласовать имена и ownership |
| Уже загружены данныеПоследовательность осталась с меньшим значением, чем существующие id. | duplicate key при последующей вставке | Проверить sequence после восстановления |
#Пошаговая диагностика и безопасное исправление
- 1. Сохраните точное имя конфликта и командуВ журнале pg_restore найдите первую ошибку, тип объекта SEQUENCE и её схему. Сохраните только обезличенный контекст; последующие ошибки могут быть следствием первой.
- 2. Проверьте, куда направлено восстановлениеВ psql убедитесь в current_database и current_schema, а также отсутствии пользовательских изменений в выбранной тестовой базе. Не применяйте --clean к действующей базе: он удаляет объекты перед созданием.
- 3. Посмотрите последовательности до измененияВ системном представлении pg_sequences найдите имя объекта и его схему. Если объект уже используется приложением, считайте это конфликтом развёртывания, а не мусором.
- psql, чтение; пример для последовательностей заказовSQLКомандаpsql, чтение; пример для последовательностей заказов.
SELECT schemaname, sequencename, start_value, increment_by FROM pg_sequences WHERE sequencename LIKE 'orders%';
- 4. Проверьте привязку serial/identity к столбцуЕсли объект нужен столбцу ID, спросите PostgreSQL о его последовательности. Отсутствие результата может означать независимую последовательность или другую схему.
- psql, чтение; таблица и столбец — примерSQLКомандаpsql, чтение; таблица и столбец — пример.
SELECT pg_get_serial_sequence('app.orders','id');
- 5. Посмотрите содержимое архива pg_dumpДля custom-дампа в терминале клиента выполните pg_restore -l и найдите записи SEQUENCE, SEQUENCE OWNED BY и SEQUENCE SET. Не изменяйте архив исходного резервного копирования.Linux · Терминал (Bash)КомандаТерминал с pg_restore; только чтение структуры архива формата custom/tar/directory, не SQL plain.
pg_restore -l ./backup.dump > ./toc.txt
- 6. Прогоните восстановление в отдельную пустую базуСоздайте новый тестовый кластер или базу и исполните восстановление по официальной процедуре; дубли имени в чистой схеме означают дефект дампа/миграции, а не конфликт старых данных.
- 7. Проверьте значения ID и привязкиПосле успешного восстановления вставьте тестовую запись в отдельную копию данных и проверьте выдачу очередного ID. Не увеличивайте setval до максимума, не выяснив, кто и когда генерирует ID; пустые таблицы требуют осторожного обращения.
- 8. Согласуйте стратегию миграцииЕсли требуется частичное восстановление поверх действующей базы, составьте явный список переносимых объектов, сохраните снимок и порядок действий. Не запускайте CASCADE DROP SEQUENCE ради одного конфликта.
#Как проверить, что проблема устранена
В чистой тестовой базе нет конфликтов имени последовательности, столбцы используют нужные генераторы, новые тестовые строки получают уникальные ID.
#Если исправление не помогло
Если ошибка сохраняется даже в пустой схеме, проверьте, не запускает ли приложение параллельные миграции и не создаёт ли последовательность отдельный SQL-скрипт.