티스토리 뷰
How to backup a postgres database using java / 자바로 postgres DB 백업하기(pg_dump)
whoAmI_ 2024. 5. 14. 11:05
자바로 백업모듈을 만들어야 했는데, 자바에서 pg_dump를 실행해 sql파일을 떨구는 일이다.
우리가 가져가고자 하는 백업 프로세스를 간단히 말하자면
전체백업은 하루에 한번, 특정 테이블 데이터는 데이터특성에 따른 주기별로
1) 기존 백업스키마 데이터 삭제
2) 백업테이블 갱신
3) 백업스키마 sql 백업
4) DB 전체 sql 백업
순으로 이루어 진다.
기존에는 리눅스에 쉘스크립트 생성후 cron으로 돌려 파일백업, 전체백업을 진행했는데 이번에는 자바모듈안에서 해결했으면 좋겠다고 하셨다. 백업모듈은 데몬으로 돌아야하는데, 이렇게 실행하나 저렇게 실행하나 데몬역할을 하는거라고 보면 된다고 하셨는데, 서비스로 띄우는것과 약간 차이가 있지 않나 더 알아봐야 할 것 같다.
이 작업을 하기 위해 자바에서 커맨드명령어를 날려 pg_dump를 실행하는 방법을 찾아보았고,
아래 stackoverflow를 통해 해답을 얻을 수 있었다. 8년전 글이기 때문에, 지금 자바에서 pg_dump를 연동하려면 더 나은 방법이 있을지도 모르겠다.
테스트하는 로컬서버는 윈도우고, 개발서버, 운영서버는 리눅스 이기 때문에 위와같이 로컬테스트 진행 후
리눅스에도 서비스를 띄워 sql파일 백업이 잘 진행되는지 확인해보았다.
pg_dump를 실행시키는 것이기 때문에, 경로를 잘 지정해주어야 한다.
개발, 운영 환경에 맞게 설정파일로 분리하는것이 좋다.
윈도우 pg_dump 경로
database.pgdump.path=C:\\Program Files\\PostgreSQL\\10\\bin\\pg_dump.exe
리눅스 pg_dump 경로
database.pgdump.path=/usr/pgsql-10/bin/pg_dump
또한 전체 파일 백업과, 특정 테이블을 지정하여 sql백업을 받을 수 있다.
pb = new ProcessBuilder(
dbPgdumpPath, // C:\Program Files\PostgreSQL\10\bin
"--host", dbHost,
"--port", dbPort,
"--username", dbUsername,
"--no-password",
"--format", "custom",
"--blobs",
"--verbose",
"--file", fileName);
-t 옵션으로 특정 테이블 지정이 가능하고, --encoding 옵션으로 인코딩포맷 지정이 가능하다.
pb = new ProcessBuilder(
dbPgdumpPath, // C:\Program Files\PostgreSQL\10\bin
"--host", dbHost,
"--port", dbPort,
"--username", dbUsername,
"--no-password",
"--format", "custom",
"--blobs",
"--verbose",
"--encoding", "UTF-8",
"--file", fileName,
"-t", tableNm);
백업파일명을 생성할 땐 주로 백업날짜를 붙여 파일명을 생성하니, 그 부분도 신경써주는 것이 좋다.
// 현재 날짜
LocalDate today = LocalDate.now();
// 파일 이름에 포맷을 지정, 오늘 날짜를 포함
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
현재 날짜 생성 후 fileName 생성시 붙여주면
fileName = dbBackupPath + tableNm + "_backup_" + today.format(formatter) + ".sql";
파일이 잘 떨어지는 것을 확인할 수 있다.
추가로, 인텔리제이에서 작업시, pg_dump수행 중에 한글이 깨지는 현상이 발생했는데
프로세스의 환경 변수 맵에 LANG 설정을 해주면 한글이 정상 출력 되는 것을 확인할 수 있다.
final Map<String, String> env = pb.environment(); // 프로세스의 환경 변수 맵
env.put("PGPASSWORD", dbPassword);
env.put("LANG", "en_US.UTF-8");
'ALL' 카테고리의 다른 글
[JVM] Class Loader (1) | 2024.01.21 |
---|---|
깃 소스트리 fatal: bad config line 1 in file C:/Users/.... (0) | 2023.10.17 |
[Conda-Jupyter] 맥 Conda 가상환경 과 Jupyter Kernel (2) | 2023.10.04 |
Null, NPE 방어에 대해서 (0) | 2023.07.24 |
[Linux] 리눅스 서버 설치, Linux 파일시스템 RIAD-1, RAID-5 (0) | 2023.07.04 |
- Total
- Today
- Yesterday
- 스프링
- 리액트
- 자바스크립트
- JavaScript
- 이정환
- di
- security
- 인덱스
- 한입크기로 잘라먹는 리액트
- 스프링 프로젝트
- Node.js
- 시큐리티
- 친절한SQL튜닝
- React
- 스프링 빈
- 코드로 배우는 스프링 웹 프로젝트
- MySQL
- spring
- AWS
- 컨테이너
- Spark
- 남궁성
- 스프링의정석
- node
- EC2
- 객체지향
- 데브캠프
- @Configuration
- 자바의정석
- 데이터베이스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |