Создание копии базы данных в PostgreSQL - PullRequest
658 голосов
/ 18 мая 2009

Как правильно скопировать всю базу данных (ее структуру и данные) в новую в pgAdmin?

Ответы [ 18 ]

5 голосов
/ 21 ноября 2014

Для создания базы данных дампа

cd /var/lib/pgsql/
pg_dump database_name> database_name.out

Чтобы восстановить дамп базы данных

psql -d template1
CREATE DATABASE database_name WITH  ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-   8' TEMPLATE template0;
CREATE USER  role_name WITH PASSWORD 'password';
ALTER DATABASE database_name OWNER TO role_name;
ALTER USER role_name CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE database_name to role_name;


CTR+D(logout from pgsql console)
cd /var/lib/pgsql/

psql -d database_name -f database_name.out
5 голосов
/ 09 января 2013

Для тех, кто все еще заинтересован, я предложил скрипт bash, который делает (более или менее) то, что хотел автор. Мне приходилось делать ежедневную бизнес-копию базы данных в производственной системе, этот скрипт, похоже, помогает. Не забудьте изменить имя базы данных / значения пользователя / pw.

#!/bin/bash

if [ 1 -ne $# ]
then
  echo "Usage `basename $0` {tar.gz database file}"
  exit 65;
fi

if [ -f "$1" ]
then
  EXTRACTED=`tar -xzvf $1`
  echo "using database archive: $EXTRACTED";
else
  echo "file $1 does not exist"
  exit 1
fi


PGUSER=dbuser
PGPASSWORD=dbpw
export PGUSER PGPASSWORD

datestr=`date +%Y%m%d`


dbname="dbcpy_$datestr"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;"
dropdbcmp="DROP DATABASE $dbname"

echo "creating database $dbname"
psql -c "$createdbcmd"

rc=$?
if [[ $rc != 0 ]] ; then
  rm -rf "$EXTRACTED"
  echo "error occured while creating database $dbname ($rc)"
  exit $rc
fi


echo "loading data into database"
psql $dbname < $EXTRACTED > /dev/null

rc=$?

rm -rf "$EXTRACTED"

if [[ $rc != 0 ]] ; then
  psql -c "$dropdbcmd"
  echo "error occured while loading data to database $dbname ($rc)"
  exit $rc
fi


echo "finished OK"
3 голосов
/ 15 июня 2018

Из документации использование 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.

2 голосов
/ 06 августа 2013

Если база данных имеет открытые соединения, этот скрипт может помочь. Я использую это для создания тестовой базы данных из резервной копии рабочей базы данных каждую ночь. Это предполагает, что у вас есть резервный файл .SQL из производственной базы данных (я делаю это в webmin).

#!/bin/sh

dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"

dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "

export PGPASSWORD=MyPassword



echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"

echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"

echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
1 голос
/ 06 ноября 2013

Используя pgAdmin, отключите базу данных, которую вы хотите использовать в качестве шаблона. Затем вы выбираете его в качестве шаблона для создания новой базы данных, это позволяет избежать появления ошибки уже используется.

0 голосов
/ 30 января 2019

Если вы хотите скопировать всю схему, вы можете создать pg_dump с помощью следующей команды:

pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password

И когда вы хотите импортировать этот дамп, вы можете использовать:

psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql

Подробнее о строках подключения: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING

Или затем просто скомбинировать его в один лайнер:

pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”
0 голосов
/ 18 апреля 2019
  1. Откройте главное окно в pgAdmin, а затем откройте другое окно инструментов запросов
  2. В главных окнах в pgAdmin,

Отключите «шаблонную» базу данных, которую вы хотите использовать в качестве шаблона.

  1. Перейти к окну инструментов запросов

Выполнить 2 запроса, как показано ниже

SELECT pg_terminate_backend(pg_stat_activity.pid) 
    FROM pg_stat_activity 
    WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid(); 

(Приведенный выше оператор SQL завершит все активные сеансы с TemplateDB, а затем вы можете выбрать его в качестве шаблона для создания новой базы данных TargetDB, это позволит избежать появления ошибки, уже используемой.)

CREATE DATABASE 'TargetDB'
  WITH TEMPLATE='TemplateDB'
       CONNECTION LIMIT=-1;
0 голосов
/ 16 декабря 2013

Попробуйте это:

CREATE DATABASE newdb WITH ENCODING='UTF8' OWNER=owner TEMPLATE=templatedb LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' CONNECTION LIMIT=-1;

gl XD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...