Chapter 9. 备份和恢复
Table of Contents
9.1. SQL 转储
9.1.1. 从转储中恢复
9.1.2. 使用 pg_dumpall
9.1.3. 大数据库
9.1.4. 注意
9.2. 文件系统级别的备份
9.3. 在不同版本之间迁移
和任何包含珍贵数据的东西一样,PostgreSQL 数据库也应该经常备份.尽管这个过程相当简单, 但是我们还是应该理解做这件事所 用的技巧和假设.
备份 PostgreSQL 数据有两个完全不同的方法:
*
SQL 转储
*
文件系统级别备份
9.1. SQL 转储
SQL 转储的方法采用的主意是创建一个文本文件,这个文本里面都是 SQL 命令,当把这个文件回馈给服务器时,将重建与转储时状态一样 的数据库. PostgreSQL 为这个用途提供了应用工具 pg_dump.这条命令的基本用法是:
pg_dump dbname > outfile
正如你所见,pg_dump 把结果输出到标准输出. 我们下面就可以看到这样做有什么好处.
pg_dump 是一个普通的 PostgreSQL 客户端应用(尽管是个相当聪明的东西.)这就意味着你可以从 任何可以访问该数据库的远端主机上面进行备份工作.但是请记住 pg_dump不会以任何特殊权限运行.具体说来,就是 你必须要有你想备份的表的读权限,因此,实际上你几乎总是要成为 数据库超级用户.
要声明 pg_dump 应该以哪个用户身份进行联接,使用命令行 选项 -h host 和 -p port.缺省 主机是本地主机或你的环境变量PGHOST声明的值. 类似,缺省端口是环境变量PGPORT或(如果它 不存在的话)编译好了的缺省值.(比较方便的是,服务器通常有相同 的缺省.)
和任何其他 PostgreSQL 客户端应用一样, pg_dump 缺省时用与当前操作系统用户名同名的数据库用户 名进行联接.要覆盖这个名字,要么声明 -U 选项, 要么设置环境变量PGUSER. 请注意 pg_dump 的联接也和普通客户应用一样要 通过客户认证机制(在 Chapter 4)里描述.
由 pg_dump 创建的备份在内部是一致的, 也就是说,在pg_dump运行的时候对数据库的更新 将不会被转储.pg_dump 工作的时候并不阻塞 其他的对数据库的操作.(但是会阻塞那些需要排它锁的操作,比如 VACUUM FULL.)
Important: 如果你的数据库结构依赖于 OID (比如说用做外键),那么你必须告诉 pg_dump 把 OID 也倒出来. 要倒 OID,可以使用 -o 命令行选项. 缺省时也不会转储"大对象".如果你使用大对象,请参考 pg_dump的命令手册页.
9.1.1. 从转储中恢复
pg_dump 生成的文本文件可以由 psql 程序读取. 从转储中恢复的常用命令是
psql dbname < infile
这里的 infile 就是你 给pg_dump命令的 outfile 参数.这条命令不会创建数据库 dbname,你必须在执行psql 前自己从template0创建(也就是说,用命令 createdb -T template0 dbname). psql 支持类似 pg_dump 的选项用以控制数据库服务器位置 和用户名.参考它的手册获取更多信息.






