자동 - PostgreSQL에서 데이터베이스 복사본 만들기




postgresql 자동 백업 (11)

PostgreSQL 9.1.2 :

$ CREATEDB new_db_name -T orig_db_name -O db_user;

전체 데이터베이스 (구조 및 데이터)를 pgAdmin의 새로운 데이터베이스로 복사하는 올바른 방법은 무엇입니까?


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();

pgAdmin에서 원래 데이터베이스의 백업을 만든 다음 새 데이터베이스를 만들고 방금 생성 한 백업에서 복원 할 수 있습니다.

  1. 원본 데이터베이스를 마우스 오른쪽 단추로 클릭하고 백업 ...을 클릭하고 파일로 덤프합니다.
  2. 새 개체, 새 데이터베이스 ...를 마우스 오른쪽 단추로 클릭하고 대상의 이름을 지정합니다.
  3. 새 데이터베이스를 마우스 오른쪽 단추로 누르고 복원 ...을 선택하고 파일을 선택하십시오.

pgAdmin을 사용하여 템플릿으로 사용할 데이터베이스의 연결을 끊습니다. 그런 다음 새 데이터베이스를 만들기위한 템플리트로 선택하면 이미 사용 중 오류가 발생하지 않습니다.


데이터베이스 덤프를 만들려면

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

데이터베이스에 연결이 열려 있으면이 스크립트가 도움이 될 수 있습니다. 매일 밤 라이브 프로덕션 데이터베이스의 백업에서 테스트 데이터베이스를 만드는 데이 방법을 사용합니다. 이것은 프로덕션 db에서 .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"

이 시도:

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;

글자 XD


전체 데이터베이스 (구조 및 데이터)를 pgAdmin의 새로운 데이터베이스로 복사하는 올바른 방법은 무엇입니까?

대답:

CREATE DATABASE newdb WITH TEMPLATE originaldb;

시도하고 테스트했습니다.


포스트 그레스로 기존 데이터베이스를 복제하려면 그렇게 할 수 있습니다

/* 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

프로덕션 환경에서 원본 데이터베이스가 트래픽을 받고있는 곳에서는 다음을 사용합니다.

pg_dump production-db | psql test-db

Bell의 답변에 대한 명령 줄 버전 :

createdb -O ownername -T originaldb newdb

이 작업은 데이터베이스 마스터 (보통 postgres)의 권한으로 실행해야합니다.







postgresql