Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:
- Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
- Postgres-XL的项目发起人Mason Sharp
- pgpool的作者石井达夫(Tatsuo Ishii)
- PG-Strom的作者海外浩平(Kaigai Kohei)
- Greenplum研发总监姚延栋
- 周正中(德哥), PostgreSQL中国用户会创始人之一
- 汪洋,平安科技数据库技术部经理
- ……
|
|
前面我写过一篇关于使用ZFS的快照特性和PostgreSQL流复制来完成数据库增量PITR备份的文章 :
本文将基于这个备份机, 写一个自动的恢复测试脚本.
(假设快照每天一个, 并规则命名)
2个脚本如下 :
# mkdir /root/test_recovery
[root@db-pitr test_recovery]# cat recovery_entry.sh#!/bin/bash/root/test_recovery/recovery_test.sh pg000001 >>/root/test_recovery/pg000001.log 2>&1sleep 10/root/test_recovery/recovery_test.sh pg000002 >>/root/test_recovery/pg000002.log 2>&1
[root@db-pitr test_recovery]# cat recovery_test.sh#!/bin/bash
if [ $# -ne 1 ]; thenecho "for exp: ./sh pg000001"exit 1fi
UN="$1"date +%F%Techo $UN
. /etc/profile. /home/${UN}/.bash_profile
DATE=`date -d '-1 day' +%Y%m%d`zfs clone -o mountpoint=/test_recovery zp1/${UN}@$DATE zp1/test_recovery
rm -f /test_recovery/pg_root/postgresql.confrm -f /test_recovery/pg_root/recovery.confrm -f /test_recovery/pg_root/postmaster.pidrm -f /test_recovery/pg_root/pg_xlog/*cp -p /root/test_recovery/${UN}_postgresql.conf /test_recovery/pg_root/postgresql.confcp -p /root/test_recovery/${UN}_recovery.conf /test_recovery/pg_root/recovery.conf
su - ${UN} -c "postgres -D /test_recovery/pg_root &"
for ((i=1;i<180;i++)) doecho $isleep 20/pg_home/${UN}/pgsql/bin/psql -h 127.0.0.1 -p 11111 postgres postgres -c "select now(),* from pg_database;"ret=$?if [ $ret -eq 0 ]; thenbreakfidone
su - ${UN} -c "pg_ctl stop -w -t 6000 -m immediate -D /test_recovery/pg_root"sleep 60
zfs destroy zp1/test_recovery
并且为了防止恢复测试时, 一些参数冲突, 我们需要事先准备好恢复文件和配置文件, 如下 :
[root@db-pitr test_recovery]# pwd/root/test_recovery[root@db-pitr test_recovery]# lltotal 164-rw-r--r-- 1 root root 3267 Dec 10 10:54 pg000001.log-rw------- 1 pg000001 pg000001 20415 Dec 10 10:38 pg000001_postgresql.conf-rw-r--r-- 1 pg000001 pg000001 4793 Dec 10 10:39 pg000001_recovery.conf-rw-r--r-- 1 root root 4520 Dec 10 10:58 pg000002.log-rw------- 1 pg000002 pg000002 19767 Dec 10 10:41 pg000002_postgresql.conf-rw-r--r-- 1 pg000002 pg000002 4795 Dec 10 10:41 pg000002_recovery.conf-r-x------ 1 root root 478 Dec 10 10:50 recovery_entry.sh-r-x------ 1 root root 985 Dec 10 10:32 recovery_test.sh
与本机standby的配置相比, 主要修改几个地方, 防止冲突,
max_connections是为了防止不可启动hot standby
:
例如 :
pg000001_postgresql.confport = 11111max_connections = 10000shared_buffers = 4096MBarchive_mode = offhot_standby = onlog_directory = 'pg_log'
pg000001_recovery.confrestore_command = 'cp /pg_arch/pg000001/arch/*/%f %p'standby_mode = on#primary_conninfo
测试 :
# crontab -e52 10 10 6 * /root/test_recovery/recovery_entry.sh52 10 10 12 * /root/test_recovery/recovery_entry.sh
每年6月10日10点52,
12月10日10点52自动执行.
执行恢复脚本的日志输出举例 :
# cat pg000001.log2014-12-1010:52:02pg000001rm: cannot remove `/test_recovery/pg_root/pg_xlog/archive_status': Is a directory1LOG: 00000: loaded library "pg_stat_statements"LOCATION: load_libraries, miscinit.c:1296LOG: 00000: redirecting log output to logging collector processHINT: Future log output will appear in directory "pg_log".LOCATION: SysLogger_Start, syslogger.c:649now | datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl------------------------------+----------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------------------------------------------------------------------------------------------------------------------------------------2014-12-10 10:54:11.77975+08 | template0 | 10 | 6 | C | C | t | f | -1 | 12809 | 1674 | 1 | 1663 | {=c/postgres,postgres=CTc/postgres}2014-12-10 10:54:11.77975+08 | postgres | 10 | 6 | C | C | f | t | -1 | 12809 | 1674 | 1 | 1663 |2014-12-10 10:54:11.77975+08 | digoal | 16396 | 6 | C | C | f | t | -1 | 12809 | 1674 | 1 | 1663 |(3 rows)
waiting for server to shut down.... doneserver stopped