PostgreSQL热备和恢复_第1页
PostgreSQL热备和恢复_第2页
PostgreSQL热备和恢复_第3页
PostgreSQL热备和恢复_第4页
PostgreSQL热备和恢复_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PostgreSQL 热备和恢复PostgreSQL 的 PITR技术(Point-ln-Time-Recovery )-Seamus Dean 2005-04-11(at PostgreSQL-8.0.2 release)为什么要写这篇文章?因为我看了一下,国内所有的 PostgreSQL教程都没有很详细的介绍该功能,而 相反,国内的 Oracle文章对这块非常的看重。虽然,PostgreSQL的官方文档有一个章节是介绍这块 内容的,但是写得太过文学'化。 的确,一个数据库的可靠性和完整性是非常重要的, 否则,很难叫人们所接受它。本文假设读者对PostgreSQL已经有基本的认识,如

2、果你对PostgreSQL还完全不 熟悉的话,建议你先去 看看它的 Documentation.作为最强大的开源数据库,PostgreSQL拥有一切商业数据库所拥有的功能,甚 至比商业数据库更好。在以前的版本中, 它在数据恢复, 可靠性方面做的不太好, 但经过最近几年的发 展,已经可以和 Oracle媲美了。在PostgreSQL7的时候就引入了 WAL( Write Ahead Logging )的概念,即预写 日志,所有对数据库的更改,在更改之前必须写到该LOG中,这样,就算机器断电,PostgreSQL也可以从该 LOG中知道数据库在断电

3、前做了什么操作,已经做到第几步了, 这样保证了所有事务的完整性, 但 PostgreSQL7 没有提供很好的灾难恢复机制,一旦数据库崩溃,除非你曾经对数据库作过pg_dump或者file systemlevel backup, 否则,你的数据将全部丢失, 并且,就算你曾经对数据库做过备份, 也只能恢复到你备份的那一 刻的数据,这对一个生产数据库(特别是 24*7 生产库)来说,是无法容忍的。PostgreSQL8的推出,使PostgreSQL的稳定性和可靠性又迈出了划时代的一步。 除了提供对tablespace的支持外,PostgreSQL8提供了支持时间点的恢复一PITR. 其基本原理和 O

4、racle 的热备份完全一样: 首先,对数据库在 file system level 做一个 backup(PostgreSQL 是首先用 pg_start_backup( label ')命令,然后用 tar 直接 tar 整个 data 目录,假设命名为 base.tar, 然后 pg_stop_backup(); 结束热备。Oracle 首先是用 alter tablespace xxx begin backup, 然后直接 cp 数据文件 ); 然后,备份相关的配置文件 (PostgreSQL 只需备份 postgresql.conf,pg_hba.conf,pg_ident.

5、conf 就可以了,其实, 前面的 tar 已经将这些文件备份了, Oracle 需要 alter database backup control file,) ;最后,备份 WAL(可以设置 postgresql.conf 中的 archive_command, 该命令可以让 PostgreSQL8 自动将需要的归档的日志文件备份的其他地方中。但是注意:如果你是让 PostgreSQL8调用archive_command来备份 WA啲话, 可能根本就做不到 PITR,我做过实验,如果依靠 base.tar和archive_command 产生的WAL其实只能恢复到最后一个archive_co

6、mmand保存的 WAL勺数据,pg_xlog/下面可能还有数据,如果 PostgreSQL8的数据目录彻底损坏的话,还是会 丢失数据,所以,我建议,在写数据备份脚本的时候,最好将 pg_xlog/ 下面的 WAL也一起备份,见下面的cpArch.sh。)。如果数据库崩溃,我们就可以使用热备产生的base.tar和archive_command产生的WAL和我们自己备份的 WAL(pg_xlog)来进行数据库的 recovery.下面举例来说明:我的 PostgreSQL 运行在: /home/pgsql/ 下面 数据目录在: /home/pgsql/database/ 将热备数据文件备份到

7、/disk3/PostgreSQL/base/ 下面 将 WAL&份到 /disk3/PostgreSQL/archives/下面postgresql.conf 中定义了如下的 archive_command: archive_command = cp -f %p /disk3/PostgreSQL/archives/%f ' 该命令会将 PostgreSQL 产生的 WAL cp到/disk3/PostgreSQL/archives/ 中。我的热备脚本如下:(1)为了使丢失的数据在一分钟之内,在cron tab中每分钟将pg_xlog/下面的WAL backup 到/disk

8、3/PostgreSQL/archives/ 。crontab:*/1 * * * * /home/pgsql/bin/cpArch.sh cpArch.sh:#!/bin/sh cp -f /home/pgsql/database/pg_xlog/0-9* /disk3/PostgreSQL/archives/(2) 编写热备脚本 hotBackup.pl( 我用 perl) : #!/usr/bin/perl"""""""""""""""&q

9、uot;"""""""""""""""""""""""""""""""""""""""""""""ff ff ff ff ff ff ff ff ff

10、 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff# hotBackup.pl# Use to hot backup the PostgreSQL database.# Author:Seamus Dean# Date:2005-04-11""""""""&

11、quot;"""""""""""""""""""""""""""""""""""""""""""""""""&

12、quot;"""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffmy($datadir) = ”/home/pgsql/database ”; my($bindir) = ”/home/pgsql/bin ”;my($backupdir) = ”/

13、disk3/PostgreSQL/base ”; my($receiver) = ”ljh13 ”;sub begin_backup()open(PSQL,”|$bindir/psql”) or mail_user(“begin backup error.”) &&exit(100);print PSQL “select pg_start_backup(backupnow' ); n”;close(PSQL);sub end_backup()open(PSQL,”|$bindir/psql”) or mail_user(“end backup error. ”) &am

14、p;&exit(100);print PSQL “select pg_end_backup();n”;close(PSQL);sub do_backup()system( “/bin/tar cvf base.tar $datadir”);system( “/bin/mv -f base.tar $backupdir/ ” );sub mail_user() my($msg) =_;open(MAIL, ”|/bin/mai l -s backup- result $receiver”) or die( “can not” n”);print MAIL $msg; close(MAIL

15、);"""""""""""""""""""""""""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff f

16、f ff ff ff ff ff# tell psql begin our backup"""""""""""""""""""""""""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff f

17、f ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&begin_backup();"""""""""""""""""""""""""""""""""""ff ff ff ff

18、ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff# do tar"""""""""""""""""""""""""""""""""&q

19、uot;"ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&do_backup();""""""""""""""""""""""""""""&

20、quot;"""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff# tell psql end backup""""""""""""""""""""&quo

21、t;"""""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&end_backup();""""""""""""""

22、;""""""""""""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff# mail the user about the result""""&quo

23、t;"""""""""""""""""""""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&

24、mail_user( “PostgreSQL backup successfully.”);到这里,备份脚本基本上就完了,你可以将 hotBackup.pl 放在 crontab 中周期 性的执行。就算/home/pgsql/database目录彻底崩溃,我们可以像下面这样迅速恢复到1分钟内的数据:#cp /disk3/PostgreSQL/base/base.tar ./#tar xvf base.tar#cd database/#vi recovery.conf输入如下内容:restore_command='cp /disk3/PostgreSQL/archives/%f“%p”然

25、后将 /home/pgsql/database/pg_xlog/ 下面的 WALL青空。启动PostgreSQL,我们可以看到如下的LOG言息:LOG: could not create IPv6 socket: Address family not supported by protocolLOG: database system was interrupted at 2005-04-11 23:13:28 PDTLOG: starting archive recoveryLOG: restore_com mand = “cp /disk3/PostgreSQL/archives/%f“%p

26、”"cp: cannot stat '/disk3/PostgreSQL/archives/00000001.history: No suchfile or directoryLOG: restored log file“00000001000000000000002E.008EFCAC.backU”from archiveLOG: restored log file“00000001000000000000002E” from archiveLOG: checkpoint record is at 0/2E8EFCACLOG: redo record is at 0/2E8

27、EFCAC; undo record is at 0/0; shutdown FALSELOGLOGLOGnext transaction ID: 5271; next OID: 6351357 automatic recovery in progressredo starts at 0/2E8EFCE8LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOG LOGrestored log file re

28、stored log file restored log file restored log file res tored log file restored log file restored log file restored log file restore d log file restored log file restored log file restored log file restored lo g file restored log file restored log file restored log file restored log fi le restored l

29、og file restored log file restored log file restored log file restored log file restored log file restored log file restored log file restored log file restored log file restored log file restored log file restored log file00000001000000000000002F” “000000010000000000000030 “000000010000000000000031

30、 “000000010000000000000032 “000000010000000000000033 “000000010000000000000034 “000000010000000000000035 “000000010000000000000036 “000000010000000000000037 “000000010000000000000038 “00000001000000000000003900000001000000000000003A” 00000001000000000000003B” 00000001000000000000003C” 00000001000000000000003D” 00000001000000000000003E” 00000001000000000000003F” “00000001000000000000004。 “000000010000000000000041

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论