总结一下PostgreSQL的备份方法
我会整理一下关于在PostgreSQL中存储数据的备份和恢复的方法。
备份方法的分类
大致上分为以下几种类型。
-
- 論理バックアップ
-
- 物理バックアップ
オンライン・バックアップ
オフライン・バックアップ
逻辑备份
可以使用附带的pg_dump命令来提取储存在数据库中的数据,并以SQL的形式呈现。安装PostgreSQL后,可以执行此操作。
如果要转储Postgres数据库中的内容,
$ pg_dump postgres > dumpfile
将输出结果作为管道写入文件中。
当查看文件内容时,可以看到以以下形式记录了当前数据库状态的信息,这些信息可以使用SQL进行重现。
--
-- PostgreSQL database dump
--
<略>
--
-- Name: foo; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE foo (
a integer NOT NULL,
b text
);
<略>
--
-- Data for Name: foo; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY foo (a, b) FROM stdin;
1 inserted
2 inserted
3 inserted
4 inserted
5 inserted
\.
<略>
要恢复通过这样的数据,只需执行SQL即可。
只要在名为restore的数据库中恢复这些数据。
$ psql restore < dumpfile
只要你能够做到,就可以了。
如果您更改了pg_dump的输出格式,那么在psql中无法加载它,因此需要使用pg_restore命令进行恢复。
物理备份
PostgreSQL数据库的实体是文件的集合。将这些文件本身复制,被称为物理备份。
如果在PostgreSQL启动的情况下进行,我们称之为在线备份;如果在停止PostgreSQL的情况下进行,我们称之为离线备份。
离线备份
由于PostgreSQL已停止,数据库实体文件不会被更新。因此,备份只需使用cp命令或rsync命令来复制包含PostgreSQL数据的目录。如果正在使用昂贵的存储设备,还可以使用快照功能。
只需使用复制的数据来启动PostgreSQL即可还原备份的数据。
在线备份
由于PostgreSQL正在运行,数据库文件正在更新。因此,不能简单地复制文件。即使在复制过程中文件被更新,也需要通过”某种方式”来解决这个问题。
在PostgreSQL中,使用事务日志WAL来进行覆盖。
要使用备份进行恢复。
-
- 准备备份的数据
-
- 同时准备备份过程中产生的WAL日志
- 根据备份的数据启动PostgreSQL,并从WAL日志中读取备份过程中发生的更新操作,将未反映的操作反映到数据中。
我们采取这种方法。这可能会有些麻烦。
但是,由于PostgreSQL会自动处理第3部分,所以只需将第1和第2部分的数据备份好即可。
1. 使用cp或rsync命令获取的数据与离线备份时相同。
2. 如何获取第二组数据?
将2号数据以WAL归档的形式保存。
WAL存档是什么?
有什么意思呢?就是将PostgreSQL生成的事务日志(WAL)文件复制到另一个位置。
WAL文件在默认设置下只保存最近的一定数量,旧的文件会被删除或重新利用。因此,为了能够用于恢复,需要将WAL文件保存在另一个位置。
如何存档WAL呢?
每隔一段时间使用cron复制吗?
这样也可以,但是你可以将其交给PostgreSQL处理。
只需在postgresql.conf中进行设置并启动PostgreSQL即可。
wal_level = archive # リカバリに使える情報を保存するようにminimal以外の値にしておく
archive_mode = on # PostgreSQLによるWALアーカイブ処理を有効にする
archive_command = 'cp %p /archive/%f' # WALアーカイブ処理時に使われるコマンドを指定する
在删除过时的WAL文件之前,PostgreSQL会为我们执行归档操作。
在进行在线备份时的步骤
现在,我们可以备份所需的WAL文件,以便在恢复时使用。然而,我们无法确定在恢复过程中究竟需要哪个WAL文件。
使用PostgreSQL的pg_start_backup()函数和pg_stop_backup()函数。具体来说,在进行在线备份时。
-
- 执行pg_start_backup()
-
- 复制数据库文件(与离线备份相同)
- 执行pg_stop_backup()
按照如下步骤进行。
通过执行pg_start_backup()函数和pg_stop_backup()函数,在开始和结束备份的时候,PostgreSQL会记录下哪些是WAL文件。这些信息会与WAL文件保存在同一位置,所以如果进行了WAL归档,也可以同样备份。
从PostgreSQL 9.1开始,为我们准备了一个pg_basebackup命令,它将以上三个步骤整合在一起。
只需用-D选项指定备份保存位置并运行即可。很简单!
$ pg_basebackup -D /backup
备份方法之比较
非常简化地说,我认为可以归纳为以下几点(个人观点)。
逻辑备份很容易获取且尺寸较小,但恢复时需要从零开始将数据重新插入到数据库中,因此需要花费一定时间。
一方面,物理备份通过复制数据实体可以快速恢复,但是备份文件大小较大是一个问题。此外,为了减少业务影响,还需要考虑存档的WAL,这会增加运营成本。
如果你只想保存特定的表格或者进行一些小规模的备份,逻辑备份是一个不错的选择。但是,如果要备份整个数据库,使用物理备份可能会更合适。
运用成本很高?
我想要简化物理备份和恢复!
在那种时候,pg_rman非常方便╭( ・ㅂ・)و ̑̑ グッ
我想表达的是… (Wǒ de shì…)
因此,下一次我們將介紹pg_rman。
请察阅
-
- PostgreSQL 9.4 ドキュメント
- 第24章バックアップとリストア