Может ли Npgsql сбросить / восстановить всю базу данных?
Можно ли использовать Npgsql таким образом, что в основном имитирует pg_dumpall
в один выходной файл без необходимости перебирать каждую таблицу в базе данных? И наоборот, я также хотел бы иметь возможность получить такой вывод и использовать Npgsql для восстановления всей базы данных, если это возможно.
Я знаю, что с более поздними версиями Npgsql я могу использовать BeginBinaryExport
, BeginTextExport
, или же BeginRawBinaryCopy
методы экспорта из базы данных в STDOUT или в файл. На другой стороне процесса, я могу использовать BeginBinaryImport
, BeginTextImport
, или же BeginRawBinaryCopy
методы для импорта из STDIN или существующего файла. Однако из того, что я смог найти, эти методы используют COPY
Синтаксис SQL, который (AFAIK) ограничен одной таблицей за раз.
Почему я задаю этот вопрос? В настоящее время у меня есть старый командный файл, который я использую для экспорта своей производственной базы данных в файл (используя pg_dumpall.exe
) перед импортом обратно в мою среду тестирования (используя psql.exe
с <
операция). Это работает довольно безупречно в течение достаточно долгого времени, но мы недавно переместили сервер в среду, расположенную вне сайта, что вызывает задержку, которая препятствует успешному завершению пакетного файла. Из-за потенциальных проблем с подключением / тайм-аутом я подумываю о переносе функциональности пакетного файла в приложение.NET, но эта часть меня немного озадачила.
Спасибо за вашу помощь и дайте мне знать, если вам нужны дальнейшие разъяснения.
1 ответ
Об этом просили в https://github.com/npgsql/npgsql/issues/1397.
Короче говоря, Npgsql не имеет никакой поддержки для дампа / восстановления целых баз данных. Реализация этого была бы довольно значительным усилием, которое в значительной степени дублировало бы всю логику pg_dump, и опасность для тонких упущений и ошибок была бы значительной.
Если вам просто нужно вывести данные для некоторых таблиц, то, как вы упомянули, API COPY для этого достаточно хорош. Однако, если вам необходимо также сохранить саму схему, а также другие не связанные с таблицами сущности (состояние последовательности, расширения...), тогда единственная текущая опция AFAIK - это выполнение pg_dump как внешнего процесса ( или использование одного из другие варианты резервного копирования / восстановления).