recovery test script for zfs snapshot clone + postgresql stream replication + archive

Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:

  • Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
  • Postgres-XL的项目发起人Mason Sharp
  • pgpool的作者石井达夫(Tatsuo Ishii)
  • PG-Strom的作者海外浩平(Kaigai Kohei)
  • Greenplum研发总监姚延栋
  • 周正中(德哥), PostgreSQL中国用户会创始人之一
  • 汪洋,平安科技数据库技术部经理
  • ……
 
  • 2015年度PG大象会报名地址:http://postgres2015.eventdove.com/
  • PostgreSQL中国社区: http://postgres.cn/
  • PostgreSQL专业1群: 3336901(已满)
  • PostgreSQL专业2群: 100910388
  • PostgreSQL专业3群: 150657323



前面我写过一篇关于使用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>&1
sleep 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 ]; then
  echo "for exp: ./sh pg000001"
  exit 1
fi

UN="$1"
date +%F%T
echo $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.conf
rm -f /test_recovery/pg_root/recovery.conf
rm -f /test_recovery/pg_root/postmaster.pid
rm -f /test_recovery/pg_root/pg_xlog/*
cp -p /root/test_recovery/${UN}_postgresql.conf /test_recovery/pg_root/postgresql.conf
cp -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++)) do
  echo $i
  sleep 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 ]; then
    break
  fi
done

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]# ll
total 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.conf
port = 11111
max_connections = 10000
shared_buffers = 4096MB
archive_mode = off
hot_standby = on
log_directory = 'pg_log'

pg000001_recovery.conf
restore_command = 'cp /pg_arch/pg000001/arch/*/%f %p'
standby_mode = on
#primary_conninfo


测试 : 

# crontab -e
52 10 10 6 * /root/test_recovery/recovery_entry.sh
52 10 10 12 * /root/test_recovery/recovery_entry.sh

每年6月10日10点52,  12月10日10点52自动执行.

执行恢复脚本的日志输出举例 : 

# cat pg000001.log 
2014-12-1010:52:02
pg000001
rm: cannot remove `/test_recovery/pg_root/pg_xlog/archive_status': Is a directory
1
LOG:  00000: loaded library "pg_stat_statements"
LOCATION:  load_libraries, miscinit.c:1296
LOG:  00000: redirecting log output to logging collector process
HINT:  Future log output will appear in directory "pg_log".
LOCATION:  SysLogger_Start, syslogger.c:649
             now              |    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.... done
server stopped


[参考]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值