天天看點

備份和恢複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/