天天看点

备份和恢复postgreSQL数据库

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 你是否遇到过因为不小心而删除了某个数据库表,或者是存放数据库的磁盘损坏了的情况呢?如果碰到这种情况,我相信你会觉得非常的沮丧,因为你努力工作了几个星期的成果可能就付之东流了。

但是,你也不必每次都陷入这种困境。如果你将数据存放在 PostgreSQL 表中,你就可以定时的进行数据库备份,从而避免上述悲剧的发生。PostgreSQL 自带有内置工具来执行备份工作,而且在系统出现损坏或是意外时,你可以通过这些工具进行“回滚”,并通过以前保存的快照将系统恢复到其初始的状态。

数据备份

PostgreSQL 自带的内置备份工具叫做 pg_dump。这个工具是通过一系列的SQL语句读取某个指定的数据库并复制其中的内容,以它作为快照并用于日后的数据恢复。客户端到服务器端的连接是用于执行备份工作。这些备份文件就是前面所讲的快照并可以用于日后的数据恢复。而保证客户端与服务器端的连接是执行备份所必需的。

注意: 在进行上述工作之前,首先请确保你具有登录到服务器并访问你将要备份的数据库或表的权限。你可以通过使用PostgreSQL 命令行客户端——psql,进行服务器登录。在客户端中输入主机名(-h),用户名(-u)和密码(-p),以及数据库名,然后就可以校验你是否被授权访问。

使用 pg_dump 非常的简单——只需要在命令提示符后面输入将要导出的数据库名就可以进行备份工作了,如下例所示(根据你自己的安装路经更改PostgreSQL 路径):

$ /usr/local/pgsql/bin/pg_dump -D -h localhost -U pgsql test > test.bak

通过上面的命令就会创建一个名为test.bak的文件,文件中记录了用于恢复数据库的SQL命令。在这个文件中你可以看到类似于下面这个例子中所列出的内容:

--

-- Name: pets; Type: TABLE; Schema: public; Owner: root; Tablespace:

--

CREATE TABLE pets (

species character varying,

name character varying

);

ALTER TABLE public.pets OWNER TO root;

--

-- Data for Name: pets; Type: TABLE DATA; Schema: public; Owner: root

--

INSERT INTO pets (species, name) VALUES ('dog', 'Sparky');

INSERT INTO pets (species, name) VALUES ('cat', 'Tabitha');

如果你希望对整个系统中所有的数据库进行备份的话(而不是只对某一个数据库进行备份),你可以使用命令pg_dumpall 而不是pg_dump。执行这个命令可以对PostgreSQL 所能识别的所有的数据库(包括其自身的系统数据库) 备份到一个文件中。下面给出了一个使用实例:

$ /usr/local/pgsql/bin/pg_dumpall -D -h localhost -U pgsql > all.bak

为了保证你的备份时刻保持更新,你可以通过往cron table中加入pg_dump或者是pg_dumpall命令来定期执行备份工作。这里给出了两个cron entries的例子。第一个是在每天凌晨3点对test数据库进行备份,而第二个是在每个星期五的晚上9点对所有的数据库进行备份:

0 3 * * * /usr/local/pgsql/bin/pg_dump -D -h localhost -U pgsql test > /disk2/test.bak0 21 * *

5 /usr/local/pgsql/bin/pg_dumpall -D -h localhost -U pgsql > /disk2/all.bak

数据恢复

从备份中恢复数据的工作比执行备份甚至更简单——你所要做的就是通过执行备份文件中的SQL命令来对数据库进行恢复。如果你是使用pg_dump对某一个数据库进行了备份,那么备份中就会有CREATE TABLE 的语句来对源表进行复制。当然,你首先要新创建一个空数据库来存放这些数据表。你可以使用createdb 这个工具来完成这一步工作,这个工具也是PostgreSQL 套件中的一部分:

$ /usr/local/pgsql/bin/createdb restored

现在你就可以执行备份文件中的SQL命令来对数据库进行恢复了,如下例所示:

$ /usr/local/pgsql/bin/psql -h localhost -U pgsql -d restored < test.bak

如果你是使用pg_dumpall对所有的数据库进行备份的,就没有必要先新建一个数据库,因为备份文件中已经包含了完成CREATE DATABASE工作的相关的调用。在这里,只需要在psql命令行客户端中输入对应的备份文件就可以了,而不需要指定目标数据库:

$ /usr/local/pgsql/bin/psql -h localhost -U pgsql < all.bak

一旦数据恢复完成后,你就可以登录到服务器并查看到已恢复的数据。

转载于:http://blog.itpub.net/9521459/viewspace-759681/