Из документации использование createdb
или CREATE DATABASE
с шаблонами не рекомендуется:
Хотя возможно скопировать базу данных, отличную от template1,
указав его имя в качестве шаблона, это (пока) не предназначено как
универсальное средство «КОПИРОВАНИЕ БАЗЫ ДАННЫХ». Основное ограничение
что никакие другие сеансы не могут быть подключены к базе данных шаблона, пока
это копируется. Создать базу данных не удастся, если любое другое соединение
существует, когда начинается; в противном случае новые подключения к шаблону
база данных заблокирована до завершения CREATE DATABASE.
pg_dump
или pg_dumpall
- хороший способ скопировать базу данных и все данные. Если вы используете графический интерфейс, такой как pgAdmin, эти команды вызываются негласно, когда вы выполняете команду резервного копирования. Копирование в новую базу данных выполняется в два этапа: резервное копирование и восстановление
pg_dumpall
сохраняет все базы данных в кластере PostgreSQL. Недостаток этого подхода заключается в том, что в результате вы получите потенциально очень большой текстовый файл, полный SQL, необходимый для создания базы данных и заполнения данных. Преимущество этого подхода заключается в том, что вы получаете все роли (разрешения) для кластера бесплатно. Чтобы сбросить все базы данных, сделайте это из учетной записи суперпользователя
pg_dumpall > db.out
и восстановить
psql -f db.out postgres
pg_dump
имеет несколько параметров сжатия, которые дают вам файлы меньшего размера. У меня есть производственная база данных, которую я делаю резервное копирование два раза в день с помощью задания cron, используя
pg_dump --create --format=custom --compress=5 ==file=db.dump mydatabase
, где compress
- уровень сжатия (от 0 до 9), а create
указывает pg_dump добавлять команды для создания базы данных. Восстановите (или переместите в новый кластер), используя
pg_restore -d newdb db.dump
где newdb - это имя базы данных, которую вы хотите использовать.
Другие вещи, чтобы думать о
PostgreSQL использует ROLES для управления разрешениями. Они не копируются pg_dump
. Кроме того, мы не рассматривали настройки в postgresql.conf и pg_hba.conf (если вы перемещаете базу данных на другой сервер). Вы должны будете самостоятельно определить настройки conf. Но есть одна уловка, которую я только что обнаружил для резервного копирования ролей. Управление ролями осуществляется на уровне кластера, и вы можете попросить pg_dumpall
сделать резервную копию только ролей с помощью ключа командной строки --roles-only
.