分类:
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可以使用,从命令行来看功能已经非常强大,暂时还没有测试,有兴趣的可以研究一下。