热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQL数据库备份与恢复操作过程记录

最近关注的研究课题:PostgreSQL大数据增量备份与恢复。欢迎有这方面资料/经验的盆友留下痕迹,希望能进一步交流。同时恳请看到的盆友帮忙传播,推介懂PostgreSQL的同学同事盆友给俺。谢了先!---------------下文为转述,如涉及版权,请与博主联系。一

最近关注的研究课题:PostgreSQL大数据增量备份与恢复。

欢迎有这方面资料/经验的盆友留下痕迹,希望能进一步交流。同时恳请看到的盆友帮忙传播,推介懂PostgreSQL的同学同事盆友给俺。谢了先!

---------------

下文为转述,如涉及版权,请与博主联系。

 

一、概述
此文档描述了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 ,修改以下
archive_mode = on
archive_command = 'cp -i %p /home/postgres/archive/%f

注意:这里将WAL日志备份到 /home/postgres/archive 目录下,
pg_xlog/下的目录下可能还有未备份的数据,需要另外备份, 详见3.7。

3.2 重启动数据库
pg_ctl ?D $PGDATA stop
pg_ctl ?D $PGDATA sart

3.3 创建基础备份
postgres=# select pg_start_backup('bakup_test');

3.4 备份整个data目录 (tar方式)
tar cvf /database/pgdata/tbs1/pg_root/base_data.tar /database/pgdata/tbs1/pg_root/data

3.5 停止备份
postgres=# select pg_stop_backup();

3.6 切换日志
postgres=# pg_switch_xlog();

3.7 定期备份WAL新生成日志
如果单独通过archive_command来备份WAL的话, 能根本就做不到PITR, 因为pg_xlog/下面可能还有数据没有备份到archive_command指定的目录里;所以需要另外写脚本把/data/pg_xlog/下的WAL日志文件备份到预设的归档目录下,保证产生的WAL日志都已归档,这里写了个脚本,每五分钟执行一次
--每5分钟备份 (通过Crontab执行)
vi 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 备份。
脚本内容如下,参考
#/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 创建一张测试表

psql -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 停数据库
pg_ctl ?D $PGDATA stop


4.3 删除data目录
cd $PGDATA
rm -rf data

4.4 恢复备份
tar xvf ?f database/pgdata/tbs1/pg_root/data_bak.tar

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

4.6 清空/data/pg_xlog/目录下所有文件
rm ?r $PGDATA/pg_xlog/

4.7 创建/pg_xlog/及其下面的archive_status目录
mkdir -p /database/pgdata/tbs1/pg_root/pg_xlog/archive_status

4.8 在/data/目录下创建recovery.conf
vi database/pgdata/tbs1/pg_root/data/recovery.conf
写入以下行
restore_command = ' cp /home/postgres/archive/%f "%p"'

4.9 启动数据库
pg_ctl -D $PGDATA start
注意:切正常的话数据库就会自动应用WAL日志进行恢复
启动过程如有异常可以查看CSV日志,参数log_directory指定了日志目录(前提是你设置了日志记录功能);

4.10 查看数据库是否恢复
mydb=> 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 库分析
vacuumdb -z -d mydb

至此,数据已成功恢复!

 

五、后续工作
5.1 清理脚本
由于备份的tar包会越来越大,后续可以写些清理脚本,例如只保留最近几个tar包,其它的都删除掉等;
5.2 由于WAL日志文件比较大,可以制定删除策略,定期删除备份目录WAL日志。


推荐阅读
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 本文详细介绍了在Mac平台上安装和配置MySQL的步骤,包括下载安装包、卸载MySQL以及解决命令行中找不到mysql命令的问题。 ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
  • 本文介绍 DB2 中的基本概念,重点解释事务单元(UOW)和事务的概念。事务单元是指作为单个原子操作执行的一个或多个 SQL 查询。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文介绍了一个使用mii-tool工具检查网络接口状态的Bash脚本,并将结果记录到日志文件中。 ... [详细]
  • 环境变量是用于描述系统运行环境的一系列变量,如PATH指定了命令的搜索路径,SHELL指定了默认的Shell。本文介绍了如何加载和管理这些环境变量,以及普通变量与环境变量的区别。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 经过三轮严格的面试,终于顺利加入沪江网。虽然在团队开发方面还有待提升,但充满信心和期待,希望能在这里不断学习和成长。 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 优化虎牙直播体验的插件
    近期在观看虎牙直播时,发现广告和一些低质量直播间频繁出现,严重影响了观看体验。为此,我开发了一款插件,帮助用户屏蔽这些不想要的内容。以下是插件的介绍和使用方法。 ... [详细]
author-avatar
淼淼L玖兰枢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有