Postgresql 서버 crontab을 이용한 스케쥴링 dump백업 질문입니다. 0 4 1,587

by EDI패밀리 [PL/SQL] postgreSQL pg_dump dump linux crontab pgpass restore postgres 백업 스케쥴링 [2023.05.15 05:41:43]


01번.png (109,502Bytes)
02번.png (329,267Bytes)
9번.png (39,342Bytes)

안녕하세요.

1년차 신입개발자입니다.

계속 사이트를 눈팅만 하다가 도저히 안 풀리는 내용이 있어 질문글 올리게 되었습니다.

 

현재 운영되고있는 서버를 스케쥴링을 통해 하루에 한 번 자동으로 백업을 하려고 하는데요

dump파일은 한 번 시도하면 제대로 만들어지는데

스케쥴링을 활용하려고하면 파일의 크기가 0kb가 되는 현상이 있어서 질문드립니다.

첨부파일에 사진을 올려놓았습니다.

 

(1번) root 계정으로 dump 했습니다

(2번) postgres 계정으로 crontab 에 들어갔습니다.

(3번) 시간을 정하고 1번처럼 dump를 입력해두었습니다.

(4번) 1번으로 시도한 직접 dump는 파일이 생성되고 용량이 나왔는데(이 파일은 정상적으로 백업이 되었습니다. 다른 서버에서 복구를 해보았습니다.)

       3번 스케쥴링으로 시도한 파일은 용량이 0kb 입니다.

(5번) 스케쥴링이 돌아갈 때 비밀번호를 요구하지 않아 자동으로 비밀번호를 입력해야한다 해서

       ~ 경로의 .pgpass를 편집기로 열었습니다.

(6번) 경로와 비밀번호를 적고 이후 권한설정을 하였습니다.

(7번) 그래도 돌려보니 똑같이 0kb가 나와 crontab log를 보니 "MAIL 0x004b#012"가 나왔습니다. 

(8번) pg_dump 권한이 postgres 사용자에게 없을 수도 있다하여 버전을 체크해보았는데 버전 정보가 허용되었습니다.

 

하루에 한번씩 자동으로 풀 백업을 하는 것이 목표입니다.

이 부분에서 막혀버렸는데, 이후 어떻게 해야할지 도움을 주시면 감사하겠습니다.

 

감사합니다.

by 포동푸우 [2023.05.15 11:24:57]

PATH 와 Permission 을 점검해 보세요~ 
- cron 으로 수행될 때 PATH 값은 기본적으로 "/usr/bin:/bin"으로 설정됩니다 
- 그래서 pg_dumpall 등은 절대경로를 사용해야 하고
- sql, sh 을 호출하는 경우,, 해당 shell 내에 path 등을 설정해 주어야 합니다. 

su 대신 sudo 를 사용할 수 있으면 좋습니다. 

예시 라고 하네요~ 

crontab -u postgres -l
01 12 * * * /usr/local/pgsql/bin/pg_dumpall > /usr/local/pgsql/$(/usr/local/bin/mydate.sh).sql
03 12 * * * /usr/local/pgsql/bin/pg_dumpall > /usr/local/pgsql/back.sql  


by EDI패밀리 [2023.05.15 14:25:00]

답변 감사드립니다!
오늘 내로 시도해보고 결과 말씀드리겠습니다.

감사합니다


by 멘톨 [2023.05.15 23:31:46]

해당 shell 내에 path 등을 설정이라는 말씀은
su - postgres
bash-4.2$ crontab 안에서 path값을 설정한다는 말씀이신가요? 제가 설정한 시간, 백업하고싶은DB, .sql로 만들고 싶은 경로가 쓰여진 crontab에다가요?
crontab은 환경변수를 가지지 않고 기본 path값으로 실행하니까 그에 맞는 환경변수(postgres의 환경변수)를 가지고 스케줄링이 돌아가게 해야한다라고 이해했는데요,
그러면 애초에 기본 path값이 crontab에 주석처리된거라고 이해해도 되는걸까요? 저는 그 주석을 풀어서 postgres의 환경 변수로 바꾸는거고요...
echo $PATH를 찾으니 root랑 bash-4.2$(postgres)의 경로가 다르네요. 적용하는 방법을 더 찾아보겠습니다.


by 포동푸우 [2023.05.16 03:01:57]

shell 을 만들어서 직접 수행하시면,, os user 의 환경설정 (path, bash shell 등)  기반으로 실행 되지만

crontab 에서 실행될 때는 다른 환경이라서, crontab 에 수행하실 shell 내에도 path, set env , 포함 시키고, shell 내의 명령어들은 해당 서버 절대 경로를 모두 입력하시면 될 것 같네요.. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입