postgresql 연속 압축 파일 및 시간 복구 작업

간단 한 소개
앞에서 우 리 는 pgsql 의 흐름 복 제 를 통 해 생산 환경 에서 사용 가능 한 환경 을 구축 하여 서비스의 지속 성 을 확보 하 는 것 을 소개 했다.데이터 베 이 스 를 주기 적 으로 백업 하여 데이터 의 손실 을 방지 하려 면 연속 압축 파일 이 필요 합 니 다.이것 은 대형 데이터 뱅 크 의 증분 백업 과 복구 뿐만 아니 라 standby 미 러 백업 을 구축 하 는 데 도 사용 할 수 있 습 니 다.  
PostgreSQL 은 기본적으로 비 압축 파일 모드 에 있 습 니 다.압축 파일 모드 를 시작 합 니 다.주로 세 가지 인자 와 관련 됩 니 다:wallevel,archive_mode 와 archivecommandwal_level 매개 변 수 는 기본적으로 mininal 입 니 다.이 매개 변 수 를 archive 또는 그 이상 의 단계 로 설정 하면 압축 파일 을 열 수 있 습 니 다.post gresql 에서 압축 파일 로 그 를 전송 해 야 할 때 archive 를 호출 합 니 다.command 에서 지정 한 셸 명령 입 니 다.
압축 파일 전송 에 성 공 했 을 때 셸 명령 은 0 으로 되 돌아 가 야 합 니 다.이때 postgresql 은 압축 파일 이 전송 에 성공 했다 고 생각 하기 때문에 압축 파일 을 삭제 하거나 재 활용 할 수 있 습 니 다.셸 명령 이 0 이 아 닌 값 으로 돌아 갈 때,postgresql 은 전송 되 지 않 은 모든 압축 파일 로 그 를 보존 하고,성공 할 때 까지 계속 다시 전송 을 시도 합 니 다.압축 파일 명령 이 계속 성공 하지 않 으 면 pgxlog 디 렉 터 리 는 지속 적 으로 증가 하여 서버 저장 공간 을 다 소모 할 가능성 이 있 습 니 다.이때 postgresql 은 저장 공간 을 방출 할 때 까지 PANIC 를 닫 습 니 다.
또한 압축 파일 WAL 로 그 를 이 컴퓨터 에 저장 하 는 것 은 위험 이 매우 높 아 추천 되 지 않 습 니 다.post gresql 아 카 이브 를 통 해command 는 WAL 로 그 를 저장 하 는 유연성 을 제공 합 니 다.압축 파일 로 그 를 마 운 트 된 NFS 디 렉 터 리,테이프,CD 에 기록 할 수도 있 고,WAL 로 그 를 ssh/scp,rsync 를 통 해 다른 컴퓨터 로 전송 하여 저장 할 수도 있 습 니 다.
**주의:*archivecommand 및 restorecommand 명령 은 PostgreSQL 을 실행 하 는 시스템 사용자 로 실 행 됩 니 다.Centos 시스템 에서 이 시스템 사용 자 는 postges 입 니 다.
환경 설명
Role
IP
계통
데이터베이스
소스 라 이브 러 리
10.10.10.60
Centos6.5
postgresql 9.2
백업 라 이브 러 리
10.10.10.61
Centos6.5
postgresql 9.2
필요 설명:원본 라 이브 러 리 에서 압축 파일 로 그 를 만 들 고 백업 라 이브 러 리 에 있 는 압축 파일 디 렉 터 리/data/pg 로 전송 합 니 다.archive;백업 라 이브 러 리 는 압축 파일 로 그 를 이용 하여 원본 라 이브 러 리 의 임의의 시간 대 데 이 터 를 복원 합 니 다.
메모:기본 환경 은 post gresql 흐름 을 기반 으로 복사 되 지만 백업 라 이브 러 리 는 독립 된 라 이브 러 리 로 서 recovery.conf 의 standby 를 확보 하 십시오.mode=off
환경 설정
1.ssh 비밀번호 없 는 로그 인
우리 가 백업 하고 복원 하 는 과정 에서 사용 하 는 archivecommand 와 restorecommand 명령 은 모두 postgres 사용자 로 실행 되 기 때문에 우 리 는 postgres 사용 자 를 대상 으로 ssh 암호 없 는 로그 인 을 실현 해 야 합 니 다.

#  
ssh-ketgen -t rsa
scp id_rsa.pub [email protected]:/var/lib/pgsql/.ssh/authorized_keys
#   
ssh-ketgen -t rsa
scp id_rsa.pub [email protected]:/var/lib/pgsql/.ssh/authorized_keys
**주의:**yum 에 postgresql 을 설치 할 때 기본 으로 생 성 된 postgres 사용자 의 집 디 렉 터 리 는/var/lib/pgsql 에 있 습 니 다.
2.백업 라 이브 러 리 의 압축 파일 디 렉 터 리 설정

#   
mkdir -p /data/pg_archive
chmod postgres.postgres /data/pg_archive
설명:원본 라 이브 러 리 에서 생 성 된 압축 파일 로 그 를 다른 곳 백업 라 이브 러 리 에 저장 할/data/pgarchive 아래.
3.원본 라 이브 러 리 의 postgresql.conf 수정
postgresql.conf 에 다음 줄 을 추가 합 니 다.

#      
archive_mode = on   
archive_command = 'ssh 10.10.10.60 test ! -f /data/pg_archive/%f && scp %p 10.10.10.60:/data/pg_archive/%f'
그 중에서%p 는 wal 로그 파일 의 경 로 를 표시 하고%f 는 wal 로그 파일 의 이름 을 표시 합 니 다.archive_command 는 백업 라 이브 러 리 의 압축 파일 디 렉 터 리 에 같은 이름 의 파일 이 있 는 지 확인 하고 데 이 터 를 잃 어 버 리 지 않도록 원본 라 이브 러 리 에 생 성 된 압축 파일 로 그 를 백업 라 이브 러 리 에 저장 하 는/data/pg 가 존재 하지 않 는 다 면archive 디 렉 터 리 아래.
주의:
(a)archive_timeout 강제 N 초 후 압축 파일 을 한 번 진행 합 니 다.설정 이 너무 작 으 면 곧 wal 을 초과 합 니 다.keep_segments=16,데이터 덮어 쓰 기 를 잃 어 버 렸 으 므 로 맹목적 으로 설정 하지 마 십시오.
(b)압축 파일 모드 의 오픈 은 wal 에 만 있 습 니 다.level = hot_standby 또는 archive
4.원본 라 이브 러 리 를 다시 불 러 오고 보기

pg_ctl reload -D /data/pgsql/data
postgres=# show archive_mode;
 archive_mode 
--------------
 on
(1 row)
아 날로 그 압축 파일 백업
1.원본 라 이브 러 리 의 pg 보기xlog 디 렉 터 리

-bash-4.2$ ll pg_xlog
total 16388
-rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001
drwx------. 2 postgres postgres  4096 Apr 21 13:36 archive_status
이때 archivestatus 디 렉 터 리 는 압축 파일 로 그 를 저장 하 는 상태 입 니 다.압축 파일 이 생 겼 지만 전송 에 성공 하지 못 하면 xxx.ready 이 고 전송 이 성공 할 때 까지 유지 한 다음 상태 가 xxx.done 으로 변 합 니 다.이 디 렉 터 리 가 비어 있 습 니 다.
2.원본 라 이브 러 리 에 데이터 추가
이 때 데이터베이스 가 비어 있 기 때문에 testdb 라 이브 러 리 를 만 들 고 데 이 터 를 추가 합 니 다.

postgres=# create database testdb;
CREATE DATABASE
postgres=# create table t1(id int4,create_time timestamp(0) without time zone);
CREATE TABLE
postgres=# insert into t1 values(1,now());
INSERT 0 1
postgres=# insert into t1 values(2,now());
INSERT 0 1
postgres=# select * from t1;
 id |  create_time  
----+---------------------
 1 | 2016-04-21 13:49:34
 2 | 2016-04-21 13:49:48
(2 rows)
3.원본 라 이브 러 리 에서 수 동 으로 압축 파일 전환

postgres=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/1821010
(1 row)
정상 적 인 상황 에서 wal 로그 세그먼트 는 16M 에 이 르 면 자동 으로 압축 됩 니 다.테스트 를 통 해 우 리 는 수 동 으로 압축 파일 을 전환 합 니 다.
4.소스 라 이브 러 리 pg 보기xlog 디 렉 터 리

-bash-4.2$ ll pg_xlog/
total 16388
-rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001
drwx------. 2 postgres postgres  4096 Apr 21 13:36 archive_status
-bash-4.2$ ls pg_xlog/
000000010000000000000001 000000010000000000000002 archive_status
-bash-4.2$ ls pg_xlog/archive_status/
000000010000000000000001.ready
이 때 압축 파일 로그 의 상 태 는 ready 입 니 다.이 로그 가 전송 되 지 않 았 음 을 설명 합 니 다.로 그 를 보십시오.

vim /data/pgsql/pg_log/postgresql-Thu.log
ssh: connect to host 10.10.10.60 port 22: Connection timed out^M
FATAL: archive command failed with exit code 255
DETAIL: The failed archive command was: ssh 10.10.10.68 test ! -f /data/pg_archive/000000010000000000000001 && scp pg_xlog/000000010000000000000001 10.10.10.60:/data/pg_archive/000000010000000000000001
LOG: archiver process (PID 22284) exited with exit code 1
원래 ip 주소 오류 로 인해 ssh 를 통 해 전송 할 수 없 었 고 ip 을 10.10.10.61 로 변경 한 후에 다시 압축 파일 이 생 겨 야 다시 전송 할 수 있 습 니 다.
메모:압축 파일 을 터치 하 는 방법 은 세 가지 가 있 습 니 다.
1.wal 로 그 를 수 동 으로 전환,select pgswitch_xlog()
2.wal 로그 가 가득 차 면 압축 파일 을 터치 합 니 다.설정 파일 이 기본적으로 16M 에 도달 하면 압축 파일 을 터치 합 니 다.walkeep_segments = 16
3.압축 파일 시간 초과 시 압축 파일 트리거,archivetimeout
여기 서 우리 가 사용 하 는 것 은 핸드 기어 전환 압축 파일 이다.

postgres=# insert into t1 values(3,now());
INSERT 0 1
postgres=# insert into t1 values(4,now());
INSERT 0 1
postgres=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/2000310
(1 row)
postgres=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/3000000
(1 row)
postgres=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/30000D8
(1 row)
pg 다시 보기xlog 디 렉 터 리

-bash-4.2$ ll pg_xlog/archive_status/
total 0
-rw-------. 1 postgres postgres 0 Apr 21 13:51 000000010000000000000001.done
-rw-------. 1 postgres postgres 0 Apr 21 14:00 000000010000000000000002.done
-rw-------. 1 postgres postgres 0 Apr 21 14:04 000000010000000000000003.done
5.백업 라 이브 러 리 의 압축 파일 디 렉 터 리 보기

-bash-4.2$ ll /data/pg_archive/
total 49152
-rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000001
-rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000002
-rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000003
이로써 압축 파일 백업 이 완료 되 었 으 니 압축 파일 을 이용 하여 복원 하 는 것 을 소개 합 니 다.
압축 파일 에서 PITR 복구 시 뮬 레이 션
PITR 복 구 는 파일 시스템 백업 과 wal 파일 을 기반 으로 하 는 백업 이기 때문에 우선 기본 백업 이 필요 합 니 다.그리고 이 를 바탕 으로 백업 에 wal 압축 파일 로 그 를 재생 합 니 다.구체 적 인 절 차 는 다음 과 같다.
1.pg 사용basebackup 기초 백업 진행
pg_basebackup 은 replication 복사 프로 토 콜 을 사용 하기 때문에 원본 라 이브 러 리 에 pg 를 설정 해 야 합 니 다.hba.conf 파일 은 로 컬 이 든 네트워크 를 통 해서 든 replication 을 허용 합 니 다.

vim pg_hba.conf
#      ,         replication  pg_basebackup
host replication  rep    127.0.0.1/32   md5
host replication  rep    10.10.10.61/8   md5
#  
pg_ctl reload -D /data/pgsql/data
추가 완료 후 pgsql 을 다시 불 러 오 십시오.
백업 라 이브 러 리 에서 pg 실행basebackup 원 격 기초 백업

-bash-4.2$ pg_basebackup -D /data/pgsql/data -Fp -Xs -v -P -h 10.10.10.61 -p 5432 -U rep
Password: 
transaction log start point: 0/5000020
pg_basebackup: starting background WAL receiver
26664/26664 kB (100%), 1/1 tablespace         
transaction log end point: 0/50000E0
pg_basebackup: waiting for background process to finish streaming...
pg_basebackup: base backup completed
-D 는 기본 백업 을 받 는 디 렉 터 리 를 표시 합 니 다.기본 백업 을/data/pgsql/data 에 저장 합 니 다.
-X 매개 변 수 는 백업 이 완료 되면 메 인 라 이브 러 리 에 pg 를 수집 합 니 다.basebackup 실행 기간 에 발생 하 는 WAL 로 그 는 9.2 버 전 이후-Xs 즉 stream 형식 을 지원 합 니 다.이 모드 는 주 라 이브 러 리 의 WAL 파일 을 수집 하지 않 고 stream 복사 방식 으로 주 라 이브 러 리 를 직접 추적 할 수 있 습 니 다.
2.라 이브 러 리 설정 파일 수정
모든 프로필 은 원본 라 이브 러 리 에서 백업 되 어 있 기 때문에 수정 이 필요 합 니 다.

vim postgresql.conf
      
#archive_mode = on
#archive_command = 'ssh 192.168.3.139 test ! -f /data/pg_archive/%f && scp %p 192.168.3.139:/data/pg_archive/%f' 
3.원본 라 이브 러 리 의 시간 확인 에 필요 한 복구 시점 확인

postgres=# select * from t1;
 id |  create_time  
----+---------------------
 1 | 2016-04-21 13:49:34
 2 | 2016-04-21 13:49:48
 3 | 2016-04-21 14:00:22
 4 | 2016-04-21 14:00:25
 5 | 2016-04-21 14:49:11
 6 | 2016-04-21 14:49:14
 7 | 2016-04-21 14:49:17
(4 rows)
이번 기초 백업 은'4|2016-04-21 14:00:25'라 는 기록 을 나중에 보관 하 는 것 이 고,뒤의 5,6,7 세 기록 은 기초 백업 을 통 해 생 성 되 기 때문에 5,6,7 의 기록 을 복원 하려 면 기초 백업 을 통 해 5,6,7 의 압축 파일 로 그 를 재생 해 야 한다.
이 기록 에서 데 이 터 를 6 으로 복원 하려 면 recovery.conf 에서 다음 과 같은 설정 을 해 야 합 니 다.

cp /usr/share/pgsql/recovery.conf.sample /data/pgsql/data/recovery.conf
vim recovery.conf
restore_command = 'cp /data/pg_archive/%f %p'
recovery_target_time = '2016-04-21 14:49:14'
**주의:*recovery.conf 중 standbymode 는 off 이 어야 합 니 다.그렇지 않 으 면 백업 라 이브 러 리 는 즉시 복구 하 는 것 이 아니 라 라 라 이브 러 리 로 시 작 됩 니 다.
4.백업 라 이브 러 리 시작
백업 라 이브 러 리 시작 중 PITR 이 지정 한 시점 으로 복 구 됩 니 다.

pg_ctl start -D /data/pgsql/data
#    
vim /data/pgsql/pg_log/postgresql-Thu.log 
LOG: database system was interrupted; last known up at 2016-04-21 14:34:29 CST
LOG: starting point-in-time recovery to 2016-04-21 14:49:14+08
LOG: restored log file "000000010000000000000005" from archive
LOG: redo starts at 0/5000020
LOG: consistent recovery state reached at 0/50000E0
LOG: restored log file "000000010000000000000006" from archive
LOG: recovery stopping before commit of transaction 1898, time 2016-04-21 14:49:16.635744+08
LOG: redo done at 0/6000398
LOG: last completed transaction was at log time 2016-04-21 14:49:13.786388+08
cp: cannot stat ‘/data/pg_archive/00000002.history': No such file or directory
LOG: selected new timeline ID: 2
cp: cannot stat ‘/data/pg_archive/00000001.history': No such file or directory
LOG: archive recovery complete
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
#    
postgres=# select * from t1;
 id |  create_time  
----+---------------------
 1 | 2016-04-21 13:49:34
 2 | 2016-04-21 13:49:48
 3 | 2016-04-21 14:00:22
 4 | 2016-04-21 14:00:25
 5 | 2016-04-21 14:49:11
 6 | 2016-04-21 14:49:14
(6 rows)
7.백업 라 이브 러 리 보기 pgxlog

-bash-4.2$ ll pg_xlog
total 49160
-rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000005
-rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000006
-rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000020000000000000006
-rw-------. 1 postgres postgres  64 Apr 21 15:00 00000002.history
drwx------. 2 postgres postgres  4096 Apr 21 15:00 archive_status
-bash-4.2$ cat pg_xlog/00000002.history 
1 000000010000000000000006 before 2016-04-21 14:49:16.635744+08
pg 에서xlog 는 recovery.conf 파일 을 설정 한 후 데이터 베 이 스 를 시작 하면 새로운 timeline,id=2 가 생 성 되 고 새로운 history 파일 0000002.history 가 생 성 됩 니 다.그 안에 새 타임 라인 2 가 언제,어느 타임 라인 에서 어떤 원인 으로 나 뉘 었 는 지 기록 되 어 있 습 니 다.이 파일 은 여러 줄 의 기록 을 포함 할 수 있 습 니 다.
또한 복구 의 기본 동작 은 현재 기본 백업 과 같은 시간 선 을 따라 복구 하 는 것 입 니 다.특정 타임 라인 으로 회복 하려 면 지정 한 recovery.conf 목표 타임 라인 recovery 가 필요 합 니 다.target_timeline,기본 백업 지점 보다 빠 른 시간 까지 복구 할 수 없습니다.
주의:한 번 회복 하고 recovery 를 다시 설정 하면target_time,트리거 복 구 를 다시 시작 합 니 다.타임 라인 1 을 기반 으로 회복 되 지 않 고 타임 라인 2 를 기반 으로 회복 되 지만 이 타임 라인 은/data/pg 에 있 습 니 다.archive/타임 라인 이 2 인 압축 파일 로그 가 없어 서 오류 가 발생 할 수 있 습 니 다.
추가:postgres 압축 파일 모드 수정
단계 1:
postgresql 설정 파일 수정(postgresql.conf)

wal_level=hot_standby
      archive_mode =on 
      archive_command ='DATE=`date +%Y%m%d`;DIR="/home/postgres/arch/$DATE";(test -d $DIR || mkdir -p $DIR)&& cp %p $DIR/%f'
ps:%p 는 상대 경 로 를 말 합 니 다.%f 는 파일 이름 을 말 합 니 다.
단계 2:압축 파일 생 성 경로

mkdir -p /home/postgres/arch     
chown -R postgres:postgres /home/postgres/arch
STEP 3:데이터베이스 다시 시작
단계 4:압축 파일 이 정상 인지 검증

postgres=# checkpoint;
               CHECKPOINT
      postgres=# select pg_switch_xlog();
       pg_switch_xlog 
       ----------------
       1/760000E8
       (1 row)
     postgres@ubuntu:~$ cd /home/postgres/data/data_1999/arch/
     postgres@ubuntu:~/data/data_1999/arch$ ls
      20150603
     postgres@ubuntu:~/data/data_1999/arch$ cd 20150603/
      postgres@ubuntu:~/data/data_1999/arch/20150603$ ls
      000000010000000100000074 000000010000000100000075 000000010000000100000076
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기