1 備份恢複方法
- sql轉儲
- 檔案系統級備份
- 連續歸檔
2 sql轉儲
sql轉儲方法的思想就是建立一個由SQL指令組成的檔案,當把這個檔案傳回資料庫時候,資料庫利用其中的sql指令重建與轉儲狀态一樣的資料庫執行個體。postgresql提供的工具是pg_dump,這個工具的基本用法如下:
備份:pg_dump dbname > outfile
恢複:psql dbname < infile
需要注意的是,上述兩個指令都是在postgres使用者下運作的,outfile和infile都是sql檔案。
2.1 pg_dump
pg_dump是一個普通的用戶端工具,如果不指定主機IP和端口,那麼預設備份的是本地伺服器上的資料庫。一般來說,這個指令由超級管理者來運作,這樣可以備份到整個資料庫的所有對象。由資料庫建立的對象是一緻的,即在運作pg_dump那一刻存儲了該時刻的資料庫快照,這個指令在運作過程中資料庫的更新不會被轉儲。同時,pg_dump不會阻塞其他對資料庫的操作。
以下是一個資料庫轉儲檔案的例子,從轉儲檔案中的内容來看,是由一系列的sql語句組成,包含了重建這個資料庫所有的sql操作。
--
-- PostgreSQL database dump
--
-- Dumped from database version 9.6.3
-- Dumped by pg_dump version 9.6.3
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = \'UTF8\';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION plpgsql IS \'PL/pgSQL procedural language\';
SET search_path = public, pg_catalog;
SET default_tablespace = \'\';
SET default_with_oids = false;
--
-- Name: module_permission; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE module_permission (
profile_key integer NOT NULL,
campaign_key integer NOT NULL,
status integer NOT NULL,
create_time date,
modify_time date
);
ALTER TABLE module_permission OWNER TO postgres;
--
-- Name: userprofile_data; Type: TABLE; Schema: public; Owner: postgres
--
2.2 恢複
pg_dump生成的sql文本可以有psql程式讀取,但是注意的是恢複資料庫的時候dbname是需要存在的,也就是說,轉儲檔案中并不包含建立資料庫的語句。可以在恢複之前建立一個資料庫,用如下指令來建立一個資料庫。
createdb -T template0 dbname
表明這個資料庫dbname是基于模闆template0來建立的,然後再執行如下恢複語句:
psql dbname < infile
恢複結果
SET
SET
SET
SET
SET
SET
SET
SET
CREATE EXTENSION
COMMENT
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE VIEW
ALTER TABLE
ALTER TABLE
ALTER TABLE
COPY 10
COPY 2514830
COPY 2514830
COPY 511969
setval
--------
388095
(1 row)
COPY 37
setval
--------
37
(1 row)
COPY 10
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
預設情況下,psql在遇到一個sql執行錯誤後,會繼續執行,并不會停止。這樣可能恢複出來的就是一個不完整的資料庫,需要手動修複那一小部分的錯誤。但是實際過程中,這種情況出現的較少,在這裡不讨論,可以參考相關的資料手冊中“備份和恢複”章節中的内容。
pg_dump和psql讀寫管道的能力使得直接從一個伺服器轉儲一個資料庫到另外一個伺服器中成為可能:
pg_dump -h host1 dbname | psql -h host2 dbname
在恢複完成後,基本可以使用,但是同時需要注意的是,需要使用新資料庫的賬号密碼,原來資料庫的賬号密碼并沒有同步到新資料庫中,同時為了在新資料庫中能有更好的性能,在恢複完畢後,對全庫進行一次analyze操作,在資料字典中建立統計資訊。
2.3 pg_dumpall
pg_dump工具轉儲的是一個資料庫dbname中所有的資訊,不會轉儲角色和表空間等資訊,如果需要完整轉儲整個資料庫中所有的資料庫執行個體,PostgreSQL提供了一個工具pg_dumpall,該工具能夠轉儲一個資料庫集簇中所有的内容,包含了前面提到的角色和表空間。使用的方法是:
備份:pg_dumpall > outfile
恢複:psql -f infile postgres
從pg_dump和pg_dumpall兩個工具的作用來看,前者偏向于重建一個資料庫執行個體,這個執行個體中包含了基本的對象和資料資訊,适用于角色等資訊比較簡單等,常用于定期備份使用;後者偏向于重建一個資料庫集簇,适用于在一個新的環境中部署一套與原來一緻的資料庫環境,包括表空間和角色,尤其是在角色較多的複雜環境下,減少了手動幹預的工作量。
3 檔案系統級備份
這種備份方式比較簡單粗暴,直接将存儲資料庫的檔案進行備份,也就是通常下的pgdata目錄,例如:
tar -czvf backup.tar.gz /data1/pgdata
這種方法有兩個限制:
1、為了得到可用的備份,需要停止資料庫。建立完備份後,就相當于将該資料庫的一個快照進行了備份,在需要時候,解壓縮,啟動資料庫指定資料目錄即可。
2、隻适用于完整的備份,不适用于部分資料庫的備份。
4 連續歸檔和時間點恢複
待更新