Відповіді:
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();
Servers
-> (мій сервер) -> Databases
, клацнути правою кнопкою миші Бази даних та вибрати «Нова база даних». Одним із варіантів є шаблон, а SQL, що використовується для створення бази даних, є рівнозначним. Це так набагато швидше , ніж звалище / відновлення на тому ж сервері.
Версія відповіді командного рядка відповіді Белла :
createdb -O ownername -T originaldb newdb
Це має бути запущено під привілеями майстра бази даних, як правило, постгресів.
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
якщо спробуєте це зробити на виробничій базі даних, і, як очікується, ви не хочете її закривати, щоб створити копію.
Щоб клонувати наявну базу даних з постгресами, ви можете це зробити
/* 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
procpid
з pid
для цієї роботи
У виробничих умовах, де оригінальна база даних знаходиться під трафіком, я просто використовую:
pg_dump production-db | psql test-db
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html
$ createdb newdb
Не знає про pgAdmin, але pgdump
дає вам дамп бази даних у SQL. Вам потрібно лише створити базу даних з тим же ім’ям і зробити
psql mydatabase < my dump
відновити всі таблиці та їх дані та всі права доступу.
pg_dump -U postgres sourcedb | psql -U postgres newdb
хоча ефективність цієї методики може бути сумнівною (оскільки ви, ймовірно, закінчуєте переключення контексту між читаннями і записами)
ssh dbserver pg_dump DBNAME | psql NEWDB
... або pg_dump DBNAME | ssh otherserver pgsql NEWDB
... Дозволи та автентифікацію, звичайно, потрібно обробляти, однак ви хочете їх обробити.
По-перше, 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
\l+
. Чому різниця розмірів?
Я склав цей підхід разом із прикладами зверху. Я працюю на сервері "під навантаженням" і отримав помилку при спробі підходу від @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
У pgAdmin ви можете створити резервну копію зі своєї вихідної бази даних, а потім просто створити нову базу даних та відновити з створеної резервної копії:
Який правильний спосіб скопіювати всю базу даних (її структуру та дані) в нову в pgAdmin?
Відповідь:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
Перепробував і випробував.
З документації використання createdb
або CREATE DATABASE
з шаблонами не рекомендується:
Хоча можна скопіювати базу даних, крім шаблону1, вказавши її ім'я як шаблон, це (ще) не призначено як загальний засіб "ДОДАТКОВА КОПІЯ" загального призначення. Основне обмеження полягає в тому, що жоден інший сеанс не може бути підключений до бази даних шаблонів під час його копіювання. 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 (якщо ви переміщуєте базу даних на інший сервер). Вам доведеться самостійно з’ясувати налаштування конф. Але є хитрість, яку я щойно виявив, щоб створити резервні ролі. Ролями керують на рівні кластера, і ви можете попросити pg_dumpall
створити резервну копію лише ролей за --roles-only
допомогою перемикача командного рядка.
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
оскільки в результаті вимагає, щоб оригінальна база даних не працювала (відсутність з'єднань з доступом до запису), а будь-які нові з'єднання з оригінальною базою даних запобігалися під час копіювання. Якщо ви цим задоволені, це працює.
Для тих, хто все ще цікавиться, я придумав сценарій баш, який робить (більш-менш) те, що хотів автор. Мені довелося робити щоденну копію бази даних для бізнесу у виробничій системі, схоже, цей сценарій робить свою справу. Не забудьте змінити значення бази даних / користувача / 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"
Щоб створити дамп бази даних
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
Ось весь процес створення копіювання в базу даних, використовуючи лише графічний інтерфейс pgadmin4 (за допомогою резервного копіювання та відновлення)
Postgres поставляється з Pgadmin4. Якщо ви використовуєте macOS, ви можете натиснути CMD
+ SPACE
та ввести його pgadmin4
для запуску. Це відкриє вкладку браузера в хромі.
Зробіть це, натиснувши правою кнопкою миші базу даних -> "резервна копія"
Як test12345
. Клацніть резервну копію. Це створює дамп двійкового файлу, він не у .sql
форматі
У нижній частині екрана має бути спливаюче вікно. Клацніть на сторінці "Докладніші відомості", щоб побачити, куди завантажено резервну копію
У цьому випадку це /users/vincenttang
Якщо припустити, що ви зробили кроки 1 - 4 правильно, у вас з'явиться двійковий файл відновлення. Можливо, настане час, коли ваш колега захоче використати файл відновлення на локальній машині. Сказали людині піти на pgadmin та відновити
Зробіть це, натиснувши правою кнопкою миші базу даних -> "відновити"
Переконайтесь, що виберіть розташування файлу вручну, НЕ перетягуйте файл на поля завантажувача в pgadmin. Тому що ви матимете права на помилки. Замість цього знайдіть створений вами файл:
Можливо, вам доведеться змінити фільтр внизу на "Усі файли". Знайдіть файл згодом, починаючи з кроку 4. Тепер натисніть праву кнопку "Вибрати" для підтвердження
Ви знову побачите цю сторінку з вибраним місцеположенням файлу. Ідіть і відновіть його
Якщо все добре, праворуч внизу слід ввести індикатор, що показує успішне відновлення. Ви можете перейти до своїх таблиць, щоб побачити, чи відновлено дані в кожній таблиці.
Якщо крок 9 провалиться, спробуйте видалити стару загальнодоступну схему з вашої бази даних. Перейдіть до "Інструменту запитів"
Виконати цей код коду:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
Тепер спробуйте кроки 5 - 9 знову, це має спрацювати
EDIT - Деякі додаткові примітки. Оновіть PGADMIN4, якщо під час завантаження виникає помилка під час відновлення "непідтримувана версія архіватора заголовка 1.14" під час відновлення
Якщо база даних має відкриті підключення, цей скрипт може допомогти. Я використовую це для створення тестової бази даних із резервної копії бази даних в реальному часі щовечора. Це передбачає, що у вас є файл резервного копіювання .SQL з виробництва db (я це роблю в 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, від'єднайте базу даних, яку ви хочете використовувати як шаблон. Потім ви вибираєте його як шаблон для створення нової бази даних, це дозволяє уникнути помилки, яка вже використовується.
Якщо ви хочете скопіювати всю схему, ви можете зробити 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”
Відключіть "шаблонну" базу даних, яку ви хочете використовувати як шаблон.
Виконайте 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;
Спробуйте це:
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