source

Postgresql - 데이터베이스 및 복원을 다른 소유자에게 백업하시겠습니까?

lovecheck 2023. 5. 7. 11:34
반응형

Postgresql - 데이터베이스 및 복원을 다른 소유자에게 백업하시겠습니까?

다음 명령을 사용하여 다른 서버의 데이터베이스에서 백업을 수행했으며 필요한 역할과 다릅니다.

pg_dump -Fc db_name -f db_name.dump

그런 다음 데이터베이스를 복원해야 하는 다른 서버에 백업을 복사했지만 해당 데이터베이스에 사용된 소유자가 없습니다.데이터베이스에 소유자가 있다고 가정합니다.owner1하지만 다른 서버에 있는 것은owner2데이터베이스를 복구하고 소유자를 변경해야 합니다.

복원할 때 다른 서버에서 수행한 작업:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

그러나 복원을 실행할 때 다음 오류가 발생합니다.

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

소유자를 변경하려면 어떻게 지정해야 합니까?아니면 불가능한가요?

다음을 사용해야 합니다.--no-owner옵션, 중지합니다.pg_restore개체의 소유권을 원래 소유자로 설정하려고 합니다.대신 개체는 다음에서 지정한 사용자가 소유합니다.--role

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore doc

위의 답변은 도움이 되었지만 궁극적으로 저의 사례를 100% 이해하지 못했기 때문에 저와 유사한 사례를 가진 사람들을 위해 위의 반복을 공유하려고 생각했습니다.

내 시나리오에서는 이름과 소유자가 다른 스테이징 및 프로덕션 데이터베이스가 있을 수 있습니다.프로덕션 데이터베이스를 바꾸려면 준비 데이터베이스를 마이그레이션해야 하지만 이름과 소유자가 다를 수 있습니다.

또는 일일 백업을 복원해야 하지만 어떤 이유로 인해 이름이나 소유자를 변경해야 할 수도 있습니다.

각 앱이 db/user를 소유하기 때문에 당사의 권한은 매우 간단하므로 복잡한 사용자/역할/권한 설정에 도움이 되지 않습니다.

Create from template 접근 방식을 사용하여 db를 복사하려고 했지만 소스 db에서 활성화된 사용자/연결이 있으면 실패하여 라이브 소스 db에서 작동하지 않습니다.

베이직으로--no-ownerrestore, restore/new db의 db/table 소유자는 명령을 실행하는 사용자입니다(예: postgres)...따라서 모든 DB 사용 권한을 수정하는 추가 단계가 있습니다.단일 앱별 사용자별 DB 설정을 통해 보다 쉽게 작업을 수행할 수 있습니다.

애초에 DB를 만들 수 있는 권한이 없더라도 앱별 사용자가 DB/tables를 소유했으면 합니다.

기본 아이디어는 다음과 같습니다.

  • 를 DB로 .--no-owner그리고.--no-privileges
    • --clean새 DB/빈 DB로 복원하기 때문에 필요하지 않습니다.
  • 대상 db가 이미 있는 경우 삭제합니다.
  • 대상 DB를 다시 만듭니다(공백). 소유자를 대상 사용자로 설정합니다(생성할 필요가 없는 경우 이미 있음).
  • 덤프를 대상 사용자로 빈 대상에 복원
    • --no-owner --no-privileges대상 사용자가 모든 것을 소유하고 우리가 만든 덤프에서 소유권/개인 정보가 넘어가지 않도록 보장합니다.
    • --no-privileges그리고.--no-owner우리가 차였을 때 이미 제외했기 때문에 여기서는 중복됩니다.따라서 다음 예제에는 덤프가 어떻게 만들어졌는지 확신할 수 있는 경우 필요하지 않은 중복 플래그가 있습니다.

모든 권한을 가진 DB 소유자당 단일 사용자가 있기 때문에 권한/소유권을 포기합니다.사용 권한 구조가 더 복잡한 경우에는 적합하지 않을 수 있습니다.또는 단일 사용자로 복원을 수행한 다음 서버 프로비저닝 시스템에서 누락된 역할/권한을 복원된 DB에 추가할 수 있습니다.

일부 변수 설정...

DB_NAME_SRC="app_staging"
DB_NAME_TARGET="app_production"
DB_TARGET_OWNER="app_production_user"
DUMP_FILE="/tmp/$DB_NAME_SRC"

그런 다음 백업/복원을 수행

# backup clean/no-owner
sudo -i -u postgres pg_dump --format custom --clean --no-owner --no-privileges "$DB_NAME_SRC" > "$DUMP_FILE"

# THE FOLLOWING HAPPENS ON THE PG box where you want to restore

# drop target if exists - doesn't work for db with active users/connections
sudo -i -u postgres dropdb   -U postgres --if-exists  "$DB_NAME_TARGET"

# recreate target db, specifying owner to be the target user/role
# DB_TARGET_OWNER must already exist in postgres or you need to create it
sudo -i -u postgres createdb -U postgres --owner "$DB_TARGET_OWNER" -T template0 "$DB_NAME_TARGET"

# do the restore to the target db as the target user so any created objects will be owned by our target user.
sudo -i -u postgres pg_restore --host localhost --port 5432 --username "$DB_TARGET_OWNER" --password --dbname "$DB_NAME_TARGET" --no-owner --no-privileges "$DUMP_FILE"

# now in this simple case I don't need an additional step of fixing all the owners/permissions because the db and everything in it will be owned by the target user.

복원 섹션에서 로컬이 아닌 암호로 네트워크를 통해 연결했기 때문에 postgres 로컬 사용자 인증을 피어에서 암호로 변경할 필요가 없었습니다.내 db 앱별 사용자는 어차피 로컬 사용자가 아닙니다.

만약 당신이 헤로쿠를 찾고 있다면요.먼저 소유자가 없는 sql 덤프 파일을 만듭니다.그리고 헤로쿠에게 장전합니다.

pg_dump -O target_db -f mydb.sql
heroku pg:psql < mydb.sql

-O는 소유자가 없는 경우에 사용됩니다.

.dump 파일 대신 .sql 파일을 사용하여 복원하는 것이 좋습니다. (.dump 파일을 다운로드한 URL에 업로드해야 함)

언급URL : https://stackoverflow.com/questions/31469008/postgresql-backup-database-and-restore-on-different-owner

반응형