BASE
BASE=# drop owned by USER;
BASE=# \q
cat BASE.pgsql | psql BASE
`` `
Или могут быть последствия и надо DROP выполнять обязательно?
Что такое "перезаливка"? Если Вам нужно загрузить базу из дампа, легче и правильнее сначала пересоздать.
да, загрузить дамп вместо старой, пересоздавать возможности нет. Хочется загрузить sql-дамп вместо текущих данных, но ведь они могут содержать таблицы, которых нет в дампе. Отсюда и вопрос - как бы "зачистить" все внутри базы, не дропая ее. А потом залить SQL-бекап
> пересоздавать возможности нет Почему? Это куда проще и надёжнее (а то может получиться неведомая смесь того, что было, с тем, что загружается). > но ведь они могут содержать таблицы, которых нет в дампе Так Вам их оставить нужно? > Отсюда и вопрос - как бы "зачистить" все внутри базы, не дропая ее. Может, вместо SQL dumps использовать какой-то другой формат, и тогда pg_restore --clean ?
Вы ответили на мой вопрос, спасибо
я нашел нюанс, оставлю его здесь на случай, если кому-то пригодится: При восстановлении дампа PostgreSQL с помощью pg_restore вы обычно добавляете --clean флаг для удаления любых существующих данных из таблиц. Обратите внимание, что при этом удаляются только данные из таблиц, которые являются частью дампа, и не удаляются никакие дополнительные таблицы. Вам нужно сделать это самому: для тестовых серверов подойдет дроп схемы: DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public; Для прода подойдет удаление каждой таблицы по отдельности: DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE 'DROP TABLE ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$;
Просто замечания: a) бывают другие схемы, и там есть много всего, кроме таблиц (хотя бы функции и т.п.) b) лучше DROP TABLE IF EXISTS в этом DO — вдруг очередная таблица уже была удалена ранее за счёт CASCADE.
Обсуждают сегодня