Создание копии базы данных в PostgreSQL

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

16 ответов


Postgres позволяет использовать любую существующую базу данных на сервере в качестве шаблона при создании новой базы данных. Я не уверен, что pgAdmin дает вам опцию в диалоговом окне создания базы данных, но вы должны иметь возможность выполнить следующее В окне запроса, если это не так:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

тем не менее, вы можете получить:

ERROR:  source database "originaldb" is being accessed by other users

исправить это, вы можете использовать этот запрос

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

версия командной строки Белла:

createdb -O ownername -T originaldb newdb

Это должно выполняться с привилегиями мастера базы данных, обычно postgres.


чтобы клонировать существующую базу данных с помощью postgres, вы можете сделать это

/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();

/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;

это убьет все соединение с исходной БД, избегая ошибки

ERROR:  source database "SOURCE_DB" is being accessed by other users

в рабочей среде, где исходная база данных находится под трафиком, я просто использую:

pg_dump production-db | psql test-db

не знаю о pgAdmin, но pgdump дает вам дамп базы данных в SQL. Вам нужно только создать базу данных с тем же именем и сделать

psql mydatabase < my dump

для восстановления всех таблиц и их данных и всех прав доступа.


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

createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users.

вот что сработало для меня (команды начинаются с nohup для перемещения вывода в файл и защиты от сервера отключить):

  1. nohup pg_dump exampledb > example-01.sql
  2. createdb -O postgres exampledbclone_01

    мой пользователь "postgres"

  3. nohup psql exampledbclone_01 < example-01.sql

во-первых,sudo как пользователь базы данных:

sudo su postgres

перейдите в командную строку PostgreSQL:

psql

создайте новую базу данных, дайте права и выйдите:

CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d

скопировать структуру и данные из старой базы данных в новую:

pg_dump old_database_name | psql new_database_name

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

  1. щелкните правой кнопкой мыши исходную базу данных, резервное копирование... и дамп в файл.
  2. щелкните правой кнопкой мыши, новый объект, новая база данных... и назовите пункт назначения.
  3. щелкните правой кнопкой мыши новую базу данных, восстановить... и выберите файл.

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

ответ:

CREATE DATABASE newdb WITH TEMPLATE originaldb;

испытанный.


PostgreSQL 9.1.2:

$ CREATEDB new_db_name -T orig_db_name -O db_user;

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

#!/bin/bash

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

if [ -f "" ]
then
  EXTRACTED=`tar -xzvf `
  echo "using database archive: $EXTRACTED";
else
  echo "file  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"

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

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

в resote дамп базы данных

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

если база данных имеет открытые соединения, этот скрипт может помочь. Я использую это для создания тестовой базы данных из резервной копии базы данных в реальном времени каждую ночь. Это предполагает, что у вас есть .Файл резервной копии 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"

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


С документация, используя createdb или CREATE DATABASE с шаблонами не рекомендуется:

хотя можно скопировать базу данных, отличную от template1 указывая свое имя в качестве шаблона, это не (пока) предназначено как универсальное средство "копировать базу данных". Основным ограничением является что никакие другие сеансы не могут быть подключены к базе данных шаблонов его копируют. Создать базу данных не удастся, если любой другой соединение существует при запуске; в противном случае новые подключения к шаблону база данных блокируется до завершения создания базы данных.

pg_dump или pg_dumpall это хороший способ для копирования базы данных и всех данных. Если вы используете GUI как 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 использует роли для управления разрешениями. Это не скопировано pg_dump. Кроме того, мы не занимались настройками в в PostgreSQL.conf и файл pg_hba.conf (если вы перемещаете базу данных на другой сервер). Вам придется самостоятельно разобраться с настройками conf. Но есть трюк, который я только что обнаружил для резервного копирования ролей. Роли управляются на уровне кластера, и вы можете задать pg_dumpall для резервного копирования только ролей с помощью --roles-only переключатель командной строки.


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

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