Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2340695
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类:

2010-02-07 10:08:01

 

PostgreSQL也支持逻辑备库和物理备份两种方式。物理备份可以和Oracle一样实现联机热备份,并且同样也需要将数据库设置为归档模式。

逻辑备份

PostgreSQL提供了pg_dump/pg_dumpall两个程序可以用来将数据dump成文本文件,实现数据的逻辑备份。使用不同的参数,可以将数据dump成PostgreSQL专用的数据格式(生成copy语句)或者标准SQL语句(生成insert语句)格式。恢复只需要简单的使用psql将文件执行一遍即可。另外也可以使用pg_restore工具来恢复数据。

利用pg_dump备份test数据库(只有一张test表),包括重建表的DDL语句,授权语句等所有信息,生成copy格式的文件:

$ ./pg_dump test
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: test; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE test (
    i integer
);
ALTER TABLE public.test OWNER TO postgres;
--
-- Data for Name: test; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY test (i) FROM stdin;
1
2
\.
--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--
REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;
--
-- PostgreSQL database dump complete
--

利用pg_dump备份test库,只保存数据,insert语句格式:

[postgres@dbconsole bin]$ ./pg_dump --inserts -a test
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
--
-- Data for Name: test; Type: TABLE DATA; Schema: public; Owner: postgres
--
INSERT INTO test VALUES (1);
INSERT INTO test VALUES (2);
--
-- PostgreSQL database dump complete
--

物理备份

和Oracle一样,物理备份可以分为冷备份和热备份。冷备份就是将数据库实例关闭,然后直接复制data目录的所有文件,恢复时只需要将文件copy到data目录,无须利用日志(WAL–Write-Ahead Logging)进行恢复。而热备份,则需要利用日志将数据库恢复到一致状态,因此需要先将数据库置于归档模式。

PostgreSQL归档模式使用参数archive_mode控制,这是一个静态参数,修改postgresql.conf文件,加入如下参数,然后重启生效:

archive_mode = on
archive_command = 'cp "%p" /u01/postgresql/arch/"%f"'
archive_timeout = 600
postgres=# show archive_mode;
 archive_mode
--------------
 on
(1 row)

由于postgresql没有归档进程,因此归档是通过外部命令(OS)完成的,archive_command用于指定该外部命令,具体格式请参考文档。如果是linux归档到本地,使用cp即可,如果是到远程,则可以使用scp或者rsync。archive_timeout强制N秒以后进行一次归档,这个和Oracle的archive_lag_target参数的作用一样。当然也可以手工进行日志切换:

postgres=# select pg_switch_xlog();
 pg_switch_xlog
----------------
 0/7000000
(1 row)

热备份前,需要先将数据库置于备份状态,这一点和Oracle的手工也备份也是一样的。该命令会导致一次checkpoint,可能在业务高峰期会带来一些压力和风险,因此备份还是需要安排在业务低谷期间执行比较稳妥。

postgres=# select pg_start_backup('test_backup');
 pg_start_backup
-----------------
 0/8000020
(1 row)

然后在os层面将data目录进行复制备份。完成后,再取消备份状态,该命令同时会执行一次日志切换,并进行归档,以保证热备份期间的日志都已经归档,保证恢复数据库到一致状态的所有日志都能从归档中找到:

postgres=# select pg_stop_backup();
 pg_stop_backup
----------------
 0/8000088
(1 row)

备份完成后,可以在归档目录找到一个记录了本次备份信息的文件:

$ more 000000010000000000000008.00000020.backup
START WAL LOCATION: 0/8000020 (file 000000010000000000000008)
STOP WAL LOCATION: 0/8000088 (file 000000010000000000000008)
CHECKPOINT LOCATION: 0/8000020
START TIME: 2010-02-03 12:24:57 CST
LABEL: test_backup
STOP TIME: 2010-02-03 12:24:59 CST

PostgreSQL官方并没有提供和Oracle的rman一样的备份工具,不过因为PostgreSQL是开源的数据库,因此也有一个开源的工具pg_rman可以使用,从命令行来看功能已经非常强大,暂时还没有测试,有兴趣的可以研究一下。

阅读(309) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~