Какой правильный способ скопировать всю базу данных (ее структуру и данные) в новую в pgAdmin?
Создание копии базы данных в PostgreSQL
Ответ 1
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();
Ответ 2
Версия командной строки Ответ на звонок:
createdb -O ownername -T originaldb newdb
Это должно выполняться под привилегиями мастера базы данных, обычно postgres.
Ответ 3
Чтобы клонировать существующую базу данных с помощью 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;
IT уничтожит все соединение с источником db, избегая ошибки
ERROR: source database "SOURCE_DB" is being accessed by other users
Ответ 4
В производственной среде, где исходная база данных находится под трафиком, я просто использую:
pg_dump production-db | psql test-db
Ответ 5
Не знаю о pgAdmin, но pgdump
дает вам дамп базы данных в SQL. Вам нужно создать базу данных с тем же именем и сделать
psql mydatabase < my dump
чтобы восстановить все таблицы и их данные и все привилегии доступа.
Ответ 6
Во-первых, 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
Ответ 7
Я применил этот подход вместе с примерами сверху. Я работаю над сервером "под нагрузкой" и получил ошибку, когда попытался использовать метод @zbyszek. Я также был после решения "только для командной строки".
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
.
Вот что сработало для меня (Команды добавлены с помощью nohup
для перемещения вывода в файл и защиты от отключения сервера):
-
nohup pg_dump exampledb > example-01.sql
-
createdb -O postgres exampledbclone_01
Мой пользователь: postgres
-
nohup psql exampledbclone_01 < example-01.sql
Ответ 8
В pgAdmin вы можете сделать резервную копию из исходной базы данных, а затем просто создать новую базу данных и восстановить только из созданной резервной копии:
- Щелкните правой кнопкой мыши исходную базу данных, Backup... и дамп в файл.
- Щелкните правой кнопкой мыши, новый объект, новую базу данных... и назовите пункт назначения.
- Щелкните правой кнопкой мыши новую базу данных, Восстановите... и выберите файл.
Ответ 9
Какой правильный способ скопировать всю базу данных (ее структуру и данные) в новую в pgAdmin?
Ответ:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
Пробовал и тестировал.
Ответ 10
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
Ответ 11
Для тех, кто еще заинтересован, я придумал bash script, который делает (более или менее) то, что хотел автор. Мне пришлось сделать копию ежедневной бизнес-базы данных в производственной системе, этот script, похоже, делает трюк. Не забудьте изменить значения имени базы данных/пользователя/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"
Ответ 12
Создание дампа базы данных
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
Сброс базы данных dump
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
Ответ 13
Если база данных имеет открытые соединения, это может помочь script. Я использую это для создания тестовой базы данных из резервной копии базы данных в реальном времени каждую ночь. Это предполагает, что у вас есть файл резервной копии .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"
Ответ 14
Из документации не рекомендуется использовать createdb
или CREATE DATABASE
с шаблонами:
Хотя можно скопировать базу данных, отличную от template1, указав ее имя в качестве шаблона, это (пока) не предназначено для универсального средства "КОПИРОВАНИЕ БАЗЫ ДАННЫХ". Основным ограничением является то, что никакие другие сеансы не могут быть подключены к базе данных шаблонов во время ее копирования. CREATE DATABASE потерпит неудачу, если при запуске будет какое-либо другое соединение; в противном случае новые подключения к базе данных шаблонов блокируются до завершения 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
командной строки --roles-only
.
Ответ 15
Используя pgAdmin, отключите базу данных, которую вы хотите использовать в качестве шаблона. Затем вы выбираете его в качестве шаблона для создания новой базы данных, это позволяет избежать ошибки использования.
Ответ 16
Если вы хотите скопировать всю схему, вы можете создать 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"
Ответ 17
- Откройте главное окно в pgAdmin, а затем откройте другое окно инструментов запросов.
- В основных окнах в pgAdmin,
Отключите "шаблонную" базу данных, которую вы хотите использовать в качестве шаблона.
- Перейти к окну инструментов запроса
Запустите 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;
Ответ 18
Попробуйте следующее:
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