programing

도커화된 Postgre 백업/복원SQL 데이터베이스

bestprogram 2023. 5. 12. 22:46

도커화된 Postgre 백업/복원SQL 데이터베이스

Postgre를 백업/복원하려고 합니다.SQL 데이터베이스는 Docker 웹 사이트에 설명되어 있지만 데이터는 복원되지 않습니다.

데이터베이스 이미지에서 사용되는 볼륨은 다음과 같습니다.

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

CMD는 다음과 같습니다.

CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

다음 명령을 사용하여 DB 컨테이너를 작성합니다.

docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"

그런 다음 다른 컨테이너를 연결하여 일부 데이터를 수동으로 삽입합니다.

docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>

그런 다음 tar 아카이브가 생성됩니다.

$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql

이제 DB에 사용된 컨테이너를 제거하고 동일한 이름의 다른 컨테이너를 만들고 다음 이전에 삽입된 데이터를 복원하려고 합니다.

$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar 

그런데 테이블이 비어 있는데, 왜 데이터가 제대로 복원되지 않는 걸까요?

데이터베이스 백업

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

데이터베이스 복원

cat your_dump.sql | docker exec -i your-db-container psql -U postgres

데이터베이스 백업

sql 생성:

  • docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql

SQL 크기를 줄이기 위해 압축을 생성할 수 있습니다.

  • docker exec -t your-db-container pg_dumpall -c -U your-db-user | gzip > ./dump_$(date +"%Y-%m-%d_%H_%M_%S").gz

데이터베이스 복원

  • cat your_dump.sql | docker exec -i your-db-container psql -U your-db-user -d your-db-name

압축된 SQL을 복원하려면:

  • gunzip < your_dump.sql.gz | docker exec -i your-db-container psql -U your-db-user -d your-db-name

PD: 이것은 제게 효과가 있었던 것과 제가 여기와 다른 곳에서 얻은 것들을 모아놓은 것입니다.저는 기여를 하기 시작했습니다. 어떤 피드백도 감사할 것입니다.

지정된 시간 내에 데이터베이스를 백업하는 postgres 백업 컨테이너도 사용할 수 있다고 생각합니다.

  pgbackups:
    container_name: Backup
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - ./backup:/backups
    links:
      - db:db
    depends_on:
      - db
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_DB=${DB_NAME} 
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
      - SCHEDULE=@every 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81

cat db.dump | docker exec ...way가 내 덤프에 작동하지 않았습니다(~2Gb).몇 시간이 걸렸고 메모리 부족 오류가 발생했습니다.

대신 컨테이너에 덤프하고 내부에서 pg_restore'를 수행했습니다.

를 테이너 ID 다음과로 합니다.CONTAINER_ID은 그고리 db름은입니다.DB_NAME:

# copy dump into container
docker cp local/path/to/db.dump CONTAINER_ID:/db.dump

# shell into container
docker exec -it CONTAINER_ID bash

# restore it from within
pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump

알았어요, 알아냈어요Postgresql은 한 번 실행되면 /var/lib/postgresql 폴더의 변경 내용을 감지하지 못합니다. 적어도 내가 감지하기를 원하는 종류의 변경 내용은 감지하지 못합니다.

첫 번째 해결책은 postgres 서버를 직접 시작하는 대신 bash로 컨테이너를 시작하고 데이터를 복원한 다음 서버를 수동으로 시작하는 것입니다.

두 번째 해결책은 데이터 컨테이너를 사용하는 것입니다.전에는 요점을 이해하지 못했지만, 지금은 이해합니다.이 데이터 컨테이너를 사용하면 postgres 컨테이너를 시작하기 전에 데이터를 복원할 수 있습니다.따라서 postgres 서버가 시작되면 데이터가 이미 존재합니다.

다음 명령을 사용하여 도커 사후 처리 컨테이너에서 덤프를 가져올 수 있습니다.

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql

최고의 대답은 저에게 효과가 없었습니다.다음 오류가 계속 발생했습니다.

psql: error: FATAL:  Peer authentication failed for user "postgres"

작동하기 위해서는 도커 컨테이너에 대한 사용자를 지정해야 했습니다.

지원하다

docker exec -t --user postgres your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

복원

cat your_dump.sql | docker exec -i --user postgres your-db-container psql -U postgres

다른 접근 방식(도커-postgresql-워크플로우 기반)

내보낼 로컬 실행 데이터베이스(도커에 있지는 않지만 동일한 접근 방식이 가능함):

pg_dump -F c -h localhost mydb -U postgres export.dmp

가져올 컨테이너 데이터베이스:

docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps`
docker run -it --link CONTAINERNAME:postgres  --volume $PWD/:/tmp/  postgres  bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'

db_dump를 사용하여 db를 복원하는 동안 이 문제가 발생했습니다.나는 보통 복원할 때 비버를 사용했지만 psql 덤프를 받았기 때문에 도커 컨테이너를 사용하여 복원할 방법을 찾아야 했습니다.

Forth가 추천하고 Soviut가 편집한 방법론은 나에게 효과가 있었습니다.

cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname

(여러 DB의 이름이 아닌 단일 DB 덤프였기 때문에 이름이 포함되었습니다.)

하지만 이 작업을 수행하기 위해서는 도커 컨테이너와 프로젝트가 있는 가상 환경에도 들어가야 했습니다.이것은 다음 도커 오류를 수신하고 있었기 때문에 그것을 알아내기 전에 잠시 저를 피했습니다.

read unix @->/var/run/docker.sock: read: connection reset by peer

이 문제는 /var/lib/docker/network/files/local-kv.db 파일로 인해 발생할 수 있습니다.저는 이 진술의 정확성을 모릅니다: 하지만 저는 제가 도커를 로컬에서 사용하지 않기 때문에 이것을 보고 있었다고 생각합니다. 그래서 Forth의 답변을 사용하여 찾고 있던 이 파일을 가지고 있지 않았습니다.

그런 다음 (프로젝트와 함께) 올바른 디렉토리로 이동하여 가상 환경을 활성화한 다음 승인된 답변을 실행했습니다.펑, 팽이처럼 작동했습니다.이것이 다른 누군가에게 도움이 되기를 바랍니다!

dksnap(https://github.com/kelda/dksnap) 은 실행 프로세스를 자동화합니다.pg_dumpall 그고쓰레적것은는을 통해 합니다./docker-entrypoint-initdb.d.

실행 중인 컨테이너 목록이 표시되고 백업할 컨테이너를 선택할 수 있습니다.결과 아티팩트는 일반 도커 이미지이므로 다음과 같이 할 수 있습니다.docker run또는 도커 레지스트리에 푸시하여 공유합니다.

(문자:저는 그 프로젝트의 관리자입니다.)

이것은 나를 위해 작동된 명령입니다.

cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

예를들면

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

참조: 이 토론에서 Garminez-Sisti가 제시한 솔루션.https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b

에 대한 :docker-compose설정:

  1. 명령 중 하나를 도커 합니다.$ docker-compose -f loca.yml upORdocker-compose -f loca.yml up -d
  2. 수행하는 :$ docker-compose -f local.yml exec postgres backup
  3. 컨테이너 내부의 백업 목록을 보려면 다음과 같이 하십시오.$ docker-compose -f local.yml exec postgres backups
  4. 다음합니다.$ docker ps
  5. 다음 컨테이너 ID를 찾습니다.postgres이미지를 생성하고 ID를 복사합니다.컨테이너 ID가 ba78c0f9bce라고 가정합니다.
  6. 하십시오.$ docker cp ba78c0f9bcee:/backups ./local_backupfolder

이것이 나처럼 길을 잃은 사람에게 도움이 되기를 바랍니다.

N.B: 이 솔루션에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

또 다른 방법은 호스트 시스템에서 pg_restore 명령을 실행하는 것입니다(물론 호스트 시스템에 postgres가 설정되어 있는 경우).

도커 합성 파일에 postgres 서비스에 대한 포트 매핑 "5436:5432"가 있다고 가정합니다.이 포트 매핑을 사용하면 호스트 시스템의 포트 5436을 통해 컨테이너의 postgres(포트 5432에서 실행)에 액세스할 수 있습니다.

pg_restore -h localhost -p 5436 -U <POSTGRES_USER> -d <POSTGRES_DB>  /Path/to/the/.psql/file/in/your/host_machine 

이렇게 하면 컨테이너의 터미널로 들어가거나 덤프 파일을 컨테이너에 복사할 필요가 없습니다.

백업 및 복원을 위한 공식 도커 문서를 추가하고 싶습니다.이는 포스테로그뿐만 아니라 볼륨 내의 모든 종류의 데이터에 적용됩니다.

컨테이너 백업

이름이 dbstore인 새 컨테이너를 만듭니다.

$ docker run -v /dbdata --name dbstore ubuntu /bin/bash

다음 명령에서는 다음과 같이 수행합니다.

  • 새 컨테이너를 시작하고 dbstore 컨테이너에서 볼륨을 마운트합니다.

  • 로컬 호스트 디렉토리를 /backup으로 마운트합니다.

  • dbdata 볼륨의 내용을 tar로 지정하는 명령을 /backup 디렉토리에 있는 backup.tar 파일에 전달합니다.

    도커 실행 --rm --dker-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

명령이 완료되고 컨테이너가 중지되면 dbdata 볼륨의 백업이 남습니다.

백업에서 컨테이너 복원

방금 생성한 백업을 사용하여 동일한 컨테이너 또는 다른 컨테이너로 복원할 수 있습니다.

예를 들어 dbstore2라는 새 컨테이너를 생성합니다.

$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

그런 다음 새 컨테이너의 데이터 볼륨에서 백업 파일의 태그를 해제합니다.

$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

위의 기술을 사용하여 원하는 툴을 사용하여 백업, 마이그레이션 및 복원 테스트를 자동화할 수 있습니다.

도커 볼륨에서 파일 시스템 수준 백업 사용

도커 작성 예제

version: "3.9"

services:
  db:
    container_name: pg_container
    image: platerecognizer/parkpow-postgres
    # restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: admin

volumes:
  postgres_data:

백업 Postgresql 볼륨

docker run --rm \
   --user root \
   --volumes-from pg_container \
   -v /tmp/db-bkp:/backup \
   ubuntu tar cvf /backup/db.tar /var/lib/postgresql/data

그럼 복사/tmp/db-bkp두 번째 호스트로

Postgresql 볼륨 복원

docker run --rm \
   --user root \
   --volumes-from pg_container \
   -v /tmp/db-bkp:/backup \
   ubuntu bash -c "cd /var && tar xvf /backup/db.tar --strip 1"

언급URL : https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database