pg數據庫的備份和恢復


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 連續歸檔和時間點恢復

待更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM