PostgreSQL 데이터베이스를 Kubernetes 환경에서 백업하고 복원하는 과정을 정리해 보겠습니다.
1. 백업 파일 생성
원본 PostgreSQL 컨테이너 내부로 접속하여 백업 파일을 생성합니다.
# 컨테이너 내부로 접속
kubectl -n {네임스페이스} exec -it {POD 이름} -- bash
# 백업 파일 생성
cd /var/lib/postgresql
pg_dumpall -U postgres > backup.sql
2. 백업 파일 이동
컨테이너 내부에서 생성된 백업 파일을 노드로 가져오거나, 다른 클러스터로 복사합니다.
- 컨테이너 내부에서 백업 파일을 노드로 가져오기
kubectl -n {네임스페이스} cp {POD 이름}:/var/lib/postgresql/backup.sql backup.sql
- 다른 클러스터로 백업 파일 복사 (선택)
scp backup.sql {user}@{ip}:{path}
백업 파일을 복원할 PostgreSQL 컨테이너 내부로 복사합니다.
kubectl -n {네임스페이스} cp backup.sql {POD 이름}:/var/lib/postgresql/backup.sql
3. 복원 실행
복원할 PostgreSQL 컨테이너 내부로 접속하여 백업을 실행합니다.
# 컨테이너 내부로 접속
kubectl -n {네임스페이스} exec -it {POD 이름} -- bash
# 복원 실행
psql -f backup.sql -U postgres
4. ConfigMap과 Secret 백업 및 복원
ConfigMap 및 Secret을 백업하고 복원하기 위한 절차를 추가합니다.
- ConfigMap 백업
kubectl -n {네임스페이스} get configmap {configmap 이름} -o json --export > configmap-backup.json
- ConfigMap 복원
kubectl -n {네임스페이스} create configmap {configmap 이름} --from-file=configmap-backup.json
- Secret 백업
kubectl -n {네임스페이스} get secret {secret 이름} -o json --export > secret-backup.json
- Secret 복원:
kubectl -n {네임스페이스} create secret generic {secret 이름} --from-file=secret-backup.json
5. tar
바이너리가 없는 경우 대체 방법
만약 tar
바이너리가 없어서 kubectl cp
명령어를 사용할 수 없는 경우, 다음 대체 방법을 사용할 수 있습니다.
(백업) 원본 DB → 노드
kubectl -n {네임스페이스} exec {POD 이름} -- cat /var/lib/postgresql/backup.sql > backup.sql
(복원) 노드 → 복원 DB
kubectl -n {네임스페이스} create configmap backup --from-file backup.sql
그리고 백업 파일을 복원할 PostgreSQL Pod의 YAML 파일에 다음과 같이 ConfigMap을 마운트합니다. 예를 들어, Pod의 Volume과 VolumeMount를 구성합니다.
apiVersion: v1
kind: Pod
metadata:
name: postgres-pod
spec:
containers:
- name: postgres-container
image: postgres:latest
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/backup.sql
name: backup
subPath: backup.sql
volumes:
- name: backup
configMap:
name: backup
위의 YAML 코드에서 /var/lib/postgresql/backup.sql
경로는 복원할 파일의 경로에 맞게 변경하십시오. 이렇게하면 ConfigMap을 Pod 내부로 마운트하여 데이터를 복원할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: postgres-pod
spec:
containers:
- name: postgres-container
image: postgres:latest
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-data
volumes:
- name: postgres-data
hostPath:
path: /path/to/your/host/directory
위의 YAML 코드에서 /path/to/your/host/directory를 백업 파일이 있는 디렉토리 경로로 변경하십시오. 이렇게 하면 백업 파일이 Pod 내의 PostgreSQL 컨테이너로 마운트됩니다. 이제 데이터베이스 백업과 ConfigMap 백업, Secret 백업을 수행하고 필요한 경우 복원할 수 있는 포괄적인 프로세스가 제공됩니다.
PostgreSQL 데이터베이스를 삭제하고 백업된 SQL 파일을 수행하려면 다음 단계를 따를 수 있습니다.
- PostgreSQL 컨테이너 내부로 접속
백업 파일을 수행하기 전에 PostgreSQL 컨테이너 내부로 접속해야 합니다.kubectl -n {네임스페이스} exec -it {POD 이름} -- bash
- 데이터베이스 삭제
현재 데이터베이스를 삭제하기 위해dropdb
명령어를 사용합니다.
예를 들어, 데이터베이스 이름이 "mydatabase"인 경우:
이 명령어를 사용하여 데이터베이스를 완전히 삭제할 수 있습니다. 주의해야 할 점은 이 작업은 데이터를 완전히 지우므로 신중하게 수행해야 합니다.dropdb -U postgres mydatabase
- 백업된 SQL 파일 수행
데이터베이스를 삭제한 후, 백업된 SQL 파일을 다음과 같이psql
명령어를 사용하여 실행할 수 있습니다.
여기서psql -U postgres -d postgres -a -f backup.sql
-d
옵션은 목표 데이터베이스를 지정합니다. "postgres"는 기본 데이터베이스로 사용되며 백업된 데이터를 복원할 데이터베이스 이름으로 변경할 수 있습니다.
이러한 단계를 따르면 현재 데이터베이스를 삭제하고 백업된 SQL 파일을 새로운 데이터베이스에 복원할 수 있습니다. 데이터를 삭제하는 작업은 주의해야 하며 필요한 경우에만 수행해야 합니다.
PostgreSQL에서 다른 세션이 사용 중인 데이터베이스를 강제로 삭제하려면 다음 단계를 따를 수 있습니다. 그러나 이 작업은 주의해야 하며 신중하게 수행해야 합니다. 데이터베이스에 접속 중인 세션을 중단시키기 때문에 사용자에게 영향을 미칠 수 있습니다. (예시, 데이터베이스 : awx)
- 세션 확인
먼저 사용 중인 세션을 확인하려면 다음 쿼리를 사용할 수 있습니다. 여기서 "awx"는 삭제하려는 데이터베이스 이름입니다.
이 쿼리를 실행하면 현재 해당 데이터베이스에 연결된 세션 목록이 표시됩니다.SELECT * FROM pg_stat_activity WHERE datname = 'awx';
- 세션 종료
데이터베이스를 사용하는 세션을 종료하려면pg_terminate_backend
함수를 사용합니다. 예를 들어, 특정 세션을 종료하려면 다음과 같이 사용합니다. 여기서pg_terminate_backend
함수에는 세션 ID가 필요합니다. 여기서{pid}
는 종료하려는 세션의 프로세스 ID입니다.
위의 쿼리를 실행하면 해당 세션을 종료할 수 있습니다. 이 작업을 반복하여 모든 원하는 세션을 종료할 수 있습니다.아래 명령을 실행하면 해당 데이터베이스에 대한 활성 세션을 모두 종료합니다.SELECT pg_terminate_backend({pid});
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'awx' AND state = 'active';
pg_stat_activity
뷰를 사용하여client_addr
가 "127.0.0.1"이 아닌 데이터베이스 세션을 서브쿼리로 가져와서pg_terminate_backend
로 세션을 종료하는 쿼리를 아래와 같이 작성할 수 있습니다.
이 쿼리는 'awx' 데이터베이스에서SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'awx' -- 데이터베이스 이름 AND client_addr <> '127.0.0.1';
client_addr
가 '127.0.0.1'이 아닌 세션을 찾아서 해당 세션을pg_terminate_backend
함수를 사용하여 종료합니다. 이를 사용하여 로컬이 아닌 원격 세션을 종료할 수 있습니다. - 데이터베이스 삭제
세션을 종료한 후, 다시dropdb
명령어를 사용하여 데이터베이스를 삭제합니다.
이제 데이터베이스를 삭제할 수 있어야 합니다.dropdb -U postgres awx
이러한 절차를 따르면 다른 사용자의 세션을 종료하고 데이터베이스를 삭제할 수 있습니다. 그러나 주의해야 하며, 데이터베이스에 접속 중인 사용자에게 영향을 미칠 수 있으므로 신중하게 사용해야 합니다. - 데이터베이스 생성
데이터베이스가 없는 경우, 원하는 데이터베이스를 먼저 생성해야 합니다. 예를 들어, "awx" 데이터베이스를 생성하려면 다음 명령을 사용하세요.
이렇게 하면 "awx" 데이터베이스가 생성됩니다.createdb -U postgres awx
awx
데이터베이스를 생성하고awx
사용자를 소유자로 지정합니다.
위의 명령은CREATE DATABASE awx WITH OWNER = awx;
awx
데이터베이스를 생성하고, 이 데이터베이스의 소유자(Owner)를awx
사용자로 지정합니다. 이제awx
사용자는awx
데이터베이스의 소유자 권한을 가지게 됩니다. - 권한 부여 (선택)
awx
사용자에 대한 추가 권한을 설정하려면 필요한 권한을 부여할 수 있습니다. 예를 들어,awx
사용자에게 데이터베이스 관리 권한을 부여하려면 다음과 같이 수행할 수 있습니다.
위의 명령은GRANT ALL PRIVILEGES ON DATABASE awx TO awx;
awx
사용자에게awx
데이터베이스에 대한 모든 권한을 부여합니다.
이러한 방법을 통해서 사용중인 데이터베이스를 완전히 삭제하고 재생성할 수 있습니다.
댓글