一、概述

此文档描述了Postgresql数据库备份方案, 当数据库发生崩溃时,如何利用备份恢复到崩溃前,保证数据库最少数据量丢失甚至不丢失;

二、备份恢复原理

运用在线备份以及即时恢复(PITR)原理,利用Postgresql 数据库的WAL(Write Ahead Logging )预写日志和基础备份( $PGDATA目录文件tar包 ),恢复到数据库崩溃前时间点,保证数据量最少丢失或者不丢失,如果数据库崩溃,我们就可以通过热备产生的备份文件data_bak.tar包 ($PGDATA目录文件tar包)和archive_command产生的WAL及我们自己备份的WAL(pg_xlog)来进行数据库的 recovery 。

三、在线热备

3.1 配置归档模式

配置归档需要编辑postgresql.conf文件,默认与 /usr/local/pgsql/data/ 目录下

vi $PGDATA/postgresql.conf ,修改以下

1

2archive_mode = on

archive_command = 'cp -i %p /home/postgres/archive/%f

注意:这里将WAL日志备份到 /home/postgres/archive 目录下,

pg_xlog/下的目录下可能还有未备份的数据,需要另外备份, 详见3.7。

3.2 重启动数据库

1

2pg_ctl –D $PGDATA stop

pg_ctl –D $PGDATA sart

3.3 创建基础备份

1postgres=# select pg_start_backup('bakup_test');

3.4 备份整个data目录 (tar方式)

1tar cvf /database/pgdata/tbs1/pg_root/base_data.tar /database/pgdata/tbs1/pg_root/data

3.5 停止备份

1postgres=# select pg_stop_backup();

3.6 切换日志

1postgres=# pg_switch_xlog();

3.7 定期备份WAL新生成日志

如果单独通过archive_command来备份WAL的话, 能根本就做不到PITR, 因为pg_xlog/下面可能还有数据没有备份到archive_command指定的目录里;所以需要另外写脚本把/data/pg_xlog/下的WAL日志文件备份到预设的归档目录下,保证产生的WAL日志都已归档, 这里写了个脚本,每五分钟执行一次

每5分钟备份 (通过Crontab执行)

1

2

3

4

5vi cp_pg_xlog.sh

cp -f /database/pgdata/tbs1/pg_root/data/pg_xlog/[0-9]* /home/postgres/archive/archive_bak2/

crontab – e

*/5 * * * * /home/postgres/script/cp_pg_xlog.sh > /dev/null 2>&1

3.8 编写备份脚本hot_bak_post.sh (供参考)

附件:以上操作可以写个脚本,定时执行,热备脚本为 hot_bak_post.sh ,定时执行写在CRONTABL里,每周六零晨做一次BASE 备份。脚本内容如下,参考

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21#!/bin/bash

CUR_DATE=`date +%Y%m%d`

export PGPORT=1921

export PGHOME=/database/pgdata/tbs1/pg_root

export PATH=/database/pgdata/tbs1/pg_root/bin:$PATH

export DATA_BAK_DIR=/home/postgres/archive/data_bak

export LOG_PATH=/home/postgres/archive/log

ARCHIVE_LOG="${LOG_PATH}/bak_pg_${CUR_DATE}.log"

echo "*************** Begin backup ,please wait *************************" |tee -a ${ARCHIVE_LOG}

psql -c "select pg_start_backup('backup_test');"

cd $PGHOME

tar cvf data_${CUR_DATE}.tar data

mv *.tar ${DATA_BAK_DIR}

psql -c "select pg_stop_backup();"

psql -c "select pg_switch_xlog();"

echo "Backup completed!"

说明:脚本已经测试,可以实现功能,目前还在完善中。

四、恢复

如果数据库崩溃,我们就可以使用热备产生的data_bak.tar包(即$PGDATA目录文件tar包)和archive_command产生的WAL及我们自己备份的WAL(pg_xlog)来进行数据库的 recovery,以下实验模拟数据库崩溃时的恢复过程

4.1 创建一张测试表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25psql -dmydb -Uskytf

mydb=> \d

List of relations

Schema | Name | Type | Owner

--------+-------------+-------+-------

skytf | test2 | table | skytf

skytf | test_1 | table | skytf

skytf | test_3 | table | skytf

mydb=> create table test_backup (id int,remark varchar(32));

CREATE TABLE

mydb=> insert into test_backup values (1 ,'a');

INSERT 0 1

mydb=> insert into test_backup values (2 ,'b');

INSERT 0 1

mydb=> insert into test_backup values (3 ,'c');

mydb=> select * from test_backup;

id | remark

----+--------

1 | a

2 | b

3 | c

(3 rows)

4.2 停数据库

1pg_ctl –D $PGDATA stop

4.3 删除data目录

1

2cd $PGDATA

rm -rf data

4.4 恢复备份

1tar xvf –f database/pgdata/tbs1/pg_root/data_bak.tar

4.5 修改 pg_hba.conf,避免普通用户服务连接

4.6 清空/data/pg_xlog/目录下所有文件

1rm –r $PGDATA/pg_xlog/

4.7 创建/pg_xlog/及其下面的archive_status目录

1mkdir -p /database/pgdata/tbs1/pg_root/pg_xlog/archive_status

4.8 在/data/目录下创建recovery.conf

vi database/pgdata/tbs1/pg_root/data/recovery.conf

写入以下行

1restore_command = ' cp /home/postgres/archive/%f "%p"'

4.9 启动数据库

1pg_ctl -D $PGDATA start

注意:切正常的话数据库就会自动应用WAL日志进行恢复

启动过程如有异常可以查看CSV日志,参数log_directory指定了日志目录(前提是你设置了日志记录功能);

4.10 查看数据库是否恢复

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17mydb=> \d

List of relations

Schema | Name | Type | Owner

--------+-------------+-------+-------

skytf | test2 | table | skytf

skytf | test_1 | table | skytf

skytf | test_3 | table | skytf

skytf | test_backup | table | skytf

(4 rows)

mydb=> select * from test_backup;

id | remark

----+--------

1 | a

2 | b

3 | c

(3 rows)

4.11 库分析

1vacuumdb -z -d mydb

至此,数据已成功恢复!

五、后续工作清理脚本

由于备份的tar包会越来越大,后续可以写些清理脚本,例如只保留最近几个tar包,其它的都删除掉等;

由于WAL日志文件比较大,可以制定删除策略,定期删除备份目录WAL日志。

pitr 原理_PostgeSQL 数据库备份与恢复实验 (PITR)相关推荐

  1. PG据库备份与恢复实验 (PITR)

    一.概述 此文档描述了Postgresql数据库备份方案, 当数据库发生崩溃时,如何利用备份恢复到崩溃前,保证数据库最少数据量丢失甚至不丢失: 二.备份恢复原理 运用在线备份以及即时恢复(PITR)原 ...

  2. 《数据库原理与应用》实验一

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验一 一.实验目的及要求 1.掌握MySQL系统的数据库创建方式. 2.掌握MySQL系统的数据表的创建方式. 3. ...

  3. 《数据库原理与应用》实验二

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验二 一.实验目的及要求 1.掌握SQL查询语言的使用. 2.掌握SQL流程控制语句的使用. 3.要求独立完成,并记 ...

  4. 深入剖析ORACLE数据库备份与恢复的原理

    一.ORACLE数据库备份与恢复方法 1,用户管理的ORACLE数据库备份与恢复 用户管理的ORACLE数据库备份与恢复是指使用SQL 语句命令结合OS命令备份和恢复DB的方法(也被称为OS 备份与恢 ...

  5. 数据库系统原理实验一——数据库定义实验

    数据库定义实验 一.实验目的 二.实验要求 三.实验内容和结果 1.定义数据库 2.定义模式 3.定义基本表 四.实验总结及体会 一.实验目的   理解和掌握数据库DDL语言,能够熟练地使用SQL D ...

  6. 06 数据备份与恢复 实验报告

    06 数据备份与恢复  实验报告                                                                             广州大学学生实 ...

  7. 烂泥:SQL Server 2005数据库备份与恢复

    本文首发于烂泥行天下. 服务器的迁移,因为业务使用的数据库是SQL Server 2005,所以就要首先对数据库进行备份. 备份可以分为手动备份和自动备份,我们先来介绍手动备份. 打开SQL Serv ...

  8. linux数据库都备份什么,Linux运维学习之数据库备份与恢复

    今天给大家带来的是关于数据库备份与恢复的教程,当我们手贱或者不知道什么原因导致数据库的崩溃,甚至删除数据库时怎么办,总不能跑路吧?所以我们做好日常的备份和相关的灾后重建很有必要. 那么备份都有什么方式 ...

  9. 数据库上机实验一、二

    学习完了数据库的基本语法,上机实验也要开始了,在我上一篇关于sql server排序规则排查错误博客中,学习到了很多,具体可以点击此处. 下面开始上机实验,因为数据库的实验大多是查询语法,故这里将每一 ...

最新文章

  1. 压缩人工智能的数据值
  2. Apache2.4+Tomcat7集群搭建
  3. 在Linux平台上部署open***
  4. itchat微信调用图灵机器人API
  5. 科大讯飞和百得思维_最佳辩手陈铭力荐 讯飞智能学习机让学习不再难
  6. 手机关机后,就没有定位信息了
  7. 转载: 我如何使用 Django + Vue.js 快速构建项目
  8. python安装第三方库时报错 SyntaxError: invalid syntax
  9. php错误日志分析_php错误日志
  10. Dijkstra算法求最短路径(附leetcode 743 网络延迟问题)
  11. 【软件工程导论】可行性研究
  12. 2.第一本 docker 书 --- docker 镜像
  13. 安卓和IOS自动化测试工具Ranorex简介
  14. SYN6288语音合成模块
  15. nssa和stub_eNSP环境,分析NSSA区域与Stub区域的区别
  16. 继承中各代码块的执行顺序
  17. dnfdpl服务器维护了,DNF2019DPL机制介绍 以及本次DPL怪物顺序汇总
  18. JavaFX 边框背景
  19. 最新版本 Stable Diffusion 开源 AI 绘画工具之汉化篇
  20. 如何将彩色证件照调成黑白

热门文章

  1. Android笔记 fragment的生命周期
  2. Service之bindService
  3. dynamicparams java_spring-dynamic-params
  4. C中的运算符优先级和结合性 *p++
  5. Pycharm运行项目代码时输入可选参数
  6. WORD限制别人只能填写窗体而不能修改文档其他内容?
  7. Zookeeper启动闪退可能原因及解决方案
  8. Spark源码走读1——RDD
  9. python3中求0-100的和
  10. 相对、绝对、固定定位,以及其层级关系和脱离文档流的影响