技术开发 频道

Linux上Postgres Plus数据库备份和恢复

  八、从定制的归档格式的备份文件中恢复数据库

  下面我们详细介绍如何使用pg_restore程序从一个定制的归档格式的备份文件中恢复数据库。

  之前,我们从数据库sample建立了一个定制的归档格式的备份文件,即sample_backup,接下来我们要用它来恢复数据库sample。

  第一步:登录到Postgres Plus数据库服务器所在的计算机。在该计算机上任何有效的帐户都可以。

  第二步:如果想把数据库恢复到建立备份文件的数据库集群之外的数据库集群的话,或者从数据库集群中删除了角色的话,那么要确保制作备份文件时数据库对象属主的所有的角色名称都存在于用来恢复备份文件的数据库集群中。

  注意:制作备份文件时如果不知道数据库对象属于哪些角色,您就可以从定制的归档格式的备份文件中生成一个SQL文本版本的备份。为此,运行pg_restore程序,以备份文件作为其唯一的参数。然后您可以在文本中搜索ALTER object OWNER TO role语句。具体如下所示:

$ cd /opt/PostgresPlus/8.4SS/bin
$ .
/pg_restore /home/user/sample_backup | grep 'OWNER TO'
ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postgres;
ALTER TYPE public.emp_query_type OWNER TO postgres;
ALTER FUNCTION public.emp_comp(p_sal numeric, p_comm numeric) OWNER TO postgres;

  您可以通过psql程序连接到数据库集群,然后运行\dg命令列出当前存在于数据库集群中的角色,如下所示:

$ cd /opt/PostgresPlus/8.4SS/bin
$ .
/psql -d postgres -U postgres
Password
for user postgres:
psql (
8.4.1)
Type "help"
for help.
postgres
=# \dg
List
of roles
Role name
| Attributes | Member of
-----------+-------------+-----------
postgres | Superuser | {}
:
Create role
:
Create DB

  如果您需要创建角色的话,可以使用CREATE ROLE语句。注意:如果用来恢复数据库对象的数据库集群中没有该数据库对象原属主的角色,那么当ALTER语句无法指定该属主时,就会显示一个出错信息。当执行恢复操作时,该数据库对象最终将分配给pg_restore程序的-U选项指定的角色。

  第三步:保证用于恢复数据库的数据库集群中,现有数据库不会与制作备份的数据库同名。注意:如果不知道制作备份文件的数据库的名称,您可以使用pg_restore程序,加上-l选项,以备份文件作为唯一的参数来列出定制的归档格式的备份文件的目录。数据库名称位于目录顶部的dbname字段。

  下面是一个例子:

$ cd /opt/PostgresPlus/8.4SS/bin
$ .
/pg_restore -l /home/user/sample_backup
;
; Archive created at Wed Nov
18 12:34:10 2009
; dbname: sample

  您可以通过psql程序连接到数据库集群,然后运行\l命令列出当前存在于数据库集群中的数据库,如下所示:

$ cd /opt/PostgresPlus/8.4SS/bin
$ .
/psql -d postgres -U postgres
Password
for user postgres:
psql (
8.4.1)
Type "help"
for help.
postgres
=# \l
List
of databases
Name
| Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0
| postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres
=CTc/postgres
template1
| postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
: postgres
=CTc/postgres
(
3 rows)

  如果数据库集群中的一个数据库与用于建立备份文件的数据库同名的话,您可以使用ALTER DATABASE语句的RENAME TO选项给现有的数据库改名,或者使用DROP DATABASE语句将其删除。

  注意:在恢复操作期间,如果该数据库集群含有一个与制作备份文件的数据库同名的数据库的话,那么当CREATE DATABASE语句无法用同样的名字新建数据库时,就会显示出错信息。此后,pg_restore程序会从现有的数据库内的从备份文件中重新创建数据库对象。 这很可能导致数据库内包含不希望的数据库对象以及错误的数据库设置。

  第四步:使用cd命令将当前工作目录切换至Postgres Plus所在的bin目录。

cd /opt/PostgresPlus/8.4SS/bin

  注意:如果您使用的是Postgres Plus Advanced Server的话,请将当前工作目录通过cd命令切换至dbserver/bin。

  第五步:运行pg_restore程序,用-d选项给出要连接的数据库的名称,使用-U选项给出具有超级用户权限的角色,利用-C选项指出本恢复操作新建的数据库与制作备份的数据库同名,并通过命令行的最后一个参数给出备份文件的目录路径。

  第六步:运行psql程序,并给出要连接(使用-d选项)的数据库的名称、具有超级用户特权的角色(使用-U选项)和备份文件的目录路径(使用-f选项)。pg_restore程序需要通过数据库连接建立一个会话,然后才能从备份文件中创建新的数据库并恢复数据库对象。

./pg_restore -d postgres -U postgres -C /home/user/sample_backup

  这样,我们就会从名为sample_backup的备份文件中重新创建数据库sample。

  九、结束语

  本文为读者详细介绍了在linux系统上备份和恢复Postgres Plus数据库的具体操作过程。通过备份和恢复功能,我们能够在工作的不同阶段对数据库进行备份,并在需要的时候进行相应的恢复操作。

0
相关文章