postgresql邏輯備份工具pg_dump和pg_resotre學習

(一)pg_dump備份

pg提供了pg_dump和pg_dumpall命令進行數據庫的備份,pg_dumpall是將整個pg集羣轉儲到一個腳本文件中,而pg_dump命令可以選擇一個數據庫或者部分表進行備份。

pg_dump 把一個數據庫轉儲爲純文本文件或者是其它格式,使用方法如下:

[postgres@pg01 ~]$ pg_dump --help

用法:
  pg_dump [選項]... [數據庫名字]

**一般選項**:
  -f, --file=FILENAME          輸出文件或目錄名
  -F, --format=c|d|t|p         輸出文件格式 (c=custom, d=directory, t=tar,p=plain,plain就是sql純文本 (默認值))
  -j, --jobs=NUM               執行多個並行任務進行備份轉儲工作
  -v, --verbose                詳細模式
  -V, --version                輸出版本信息,然後退出
  -Z, --compress=0-9           被壓縮格式的壓縮級別,0表示不壓縮
  --lock-wait-timeout=TIMEOUT  在等待表鎖超時後操作失敗
  --no-sync                    不用等待變化安全寫入磁盤
  -?, --help                   顯示此幫助, 然後退出

**控制輸出內容選項(常用)**:
  -a, --data-only              只轉儲數據,不包括模式,只對純文本輸出有意義
  -s, --schema-only            只轉儲模式, 不包括數據
  -c, --clean                  在重新創建之前,先清除(刪除)數據庫對象,如drop table。只對純文本輸出有意義
  -C, --create                 指定輸出文件中是否生成create database語句,只對純文本輸出有意義
  -n, --schema=PATTERN         指定要導出的schema,不指定則導出所有的非系統schema
  -N, --exclude-schema=PATTERN 排除導出哪些schema
  -O, --no-owner               在明文格式中, 忽略恢復對象所屬者
  -t, --table=PATTERN          指定導出的表、視圖、序列,可以使用多個-t匹配多個表,使用-t之後,-n和-N就失效了
  -T, --exclude-table=PATTERN  排除表
  -x, --no-privileges          不要轉儲權限 (grant/revoke)

  --disable-triggers           在只恢復數據的過程中禁用觸發器 
  --exclude-table-data=PATTERN do NOT dump data for the specified table(s)
  --if-exists                  當刪除對象時使用IF EXISTS
  --inserts                    以INSERT命令,而不是COPY命令的形式轉儲數據,使用該選項可以把數據加載到非pg數據庫,會使恢復非常慢
                               該選項爲每行生成1個單獨的insert命令,?在恢復過程中遇到錯誤,將會丟失1行而不是全部表數據
  --column-inserts             以帶有列名的INSERT命令形式轉儲數據,例如insert into table_name(column,...) values(value1,...)                             
  --load-via-partition-root    通過根表加載分區
  --no-comments                不轉儲註釋
  --no-tablespaces             不轉儲表空間分配信息
  --no-unlogged-table-data     不轉儲沒有日誌的表數據
  --on-conflict-do-nothing     將ON CONFLICT DO NOTHING添加到INSERT命令

**控制輸出內容選項(不常用)**:
  -S, --superuser=NAME         指定關閉觸發器時需要用到的超級用戶名。 它只有在使用了--disable-triggers時纔有影響。一般情況下,最好不要輸入該參數,而是用 超級用戶啓動生成的腳本。
  -b, --blobs                  在轉儲中包括大對象
  -B, --no-blobs               排除轉儲中的大型對象 
  -E, --encoding=ENCODING      轉儲以ENCODING形式編碼的數據
  --binary-upgrade             只能由升級工具使用
  --enable-row-security        啓用行安全性(只轉儲用戶能夠訪問的內容)
  --extra-float-digits=NUM     覆蓋extra_float_digits的默認設置
  --disable-dollar-quoting     取消美元 (符號) 引號, 使用 SQL 標準引號
  --no-publications            不轉儲發佈
  --no-security-labels         不轉儲安全標籤的分配
  --no-subscriptions           不轉儲訂閱
  --no-synchronized-snapshots  在並行工作集中不使用同步快照
  --quote-all-identifiers      所有標識符加引號,即使不是關鍵字
  --rows-per-insert=NROWS      每個插入的行數;意味着--inserts
  --section=SECTION            備份命名的節 (數據前, 數據, 及 數據後)
  --serializable-deferrable    等到備份可以無異常運行
  --snapshot=SNAPSHOT          爲轉儲使用給定的快照
  --strict-names               要求每個表和(或)schema包括模式以匹配至少一個實體
  --use-set-session-authorization
                               使用 SESSION AUTHORIZATION 命令代替
                               ALTER OWNER 命令來設置所有權

**聯接選項**:
  -d, --dbname=DBNAME      對數據庫 DBNAME備份
  -h, --host=主機名        數據庫服務器的主機名或套接字目錄
  -p, --port=端口號        數據庫服務器的端口號
  -U, --username=名字      以指定的數據庫用戶聯接
  -w, --no-password        永遠不提示輸入口令
  -W, --password           強制口令提示 (自動)
  --role=ROLENAME          在轉儲前運行SET ROLE

(二)pg_restore恢復

對於pg_dump的自定義備份custom和tar類型的備份,需要使用pg_restore進行恢復,pg_restore語法如下:

[postgres@pg01 pg_backup]$ pg_restore --help
pg_restore 從一個歸檔中恢復一個由 pg_dump 創建的 PostgreSQL 數據庫.

用法:
  pg_restore [選項]... [文件名]

一般選項:
  -d, --dbname=名字        連接數據庫名字
  -f, --file=文件名       輸出文件名(- 對於stdout)
  -F, --format=c|d|t       備份文件格式(應該自動進行)
  -l, --list               打印歸檔文件的 TOC 概述
  -v, --verbose            詳細模式
  -V, --version            輸出版本信息, 然後退出
  -?, --help               顯示此幫助, 然後退出

恢復控制選項:
  -a, --data-only              只恢復數據, 不包括模式
  -c, --clean                  在重新創建之前,先清除(刪除)數據庫對象
  -C, --create                 創建目標數據庫
  -e, --exit-on-error          發生錯誤退出, 默認爲繼續
  -I, --index=NAME             恢復指定名稱的索引
  -j, --jobs=NUM               執行多個並行任務進行恢復工作
  -L, --use-list=FILENAME      從這個文件中使用指定的內容表排序
                               輸出
  -n, --schema=NAME            在這個模式中只恢復對象
  -N, --exclude-schema=NAME    不恢復此模式中的對象
  -O, --no-owner               不恢復對象所屬者
  -P, --function=NAME(args)    恢復指定名字的函數
  -s, --schema-only            只恢復模式, 不包括數據
  -S, --superuser=NAME         使用指定的超級用戶來禁用觸發器
  -t, --table=NAME             恢復命名關係(表、視圖等)
  -T, --trigger=NAME           恢復指定名字的觸發器
  -x, --no-privileges          跳過處理權限的恢復 (grant/revoke)
  -1, --single-transaction     作爲單個事務恢復
  --disable-triggers           在只恢復數據的過程中禁用觸發器
  --enable-row-security        啓用行安全性
  --if-exists                  當刪除對象時使用IF EXISTS
  --no-comments                不恢復註釋
  --no-data-for-failed-tables  對那些無法創建的表不進行
                               數據恢復
  --no-publications            不恢復發行
  --no-security-labels         不恢復安全標籤信息
  --no-subscriptions           不恢復訂閱
  --no-tablespaces             不恢復表空間的分配信息
  --section=SECTION            恢復命名節 (數據前、數據及數據後)
  --strict-names               要求每個表和(或)schema包括模式以匹配至少一個實體
  --use-set-session-authorization
                               使用 SESSION AUTHORIZATION 命令代替
                               ALTER OWNER 命令來設置所有權

聯接選項:
  -h, --host=主機名        數據庫服務器的主機名或套接字目錄
  -p, --port=端口號        數據庫服務器的端口號
  -U, --username=名字      以指定的數據庫用戶聯接
  -w, --no-password        永遠不提示輸入口令
  -W, --password           強制口令提示 (自動)
  --role=ROLENAME          在恢復前執行SET ROLE操作

選項 -I, -n, -N, -P, -t, -T, 以及 --section 可以組合使用和指定
多次用於選擇多個對象.

如果沒有提供輸入文件名, 則使用標準輸入.

(三)使用pg_dump備份的例子

(3.1)對db1數據庫進行備份,保存爲轉儲dmp格式

[postgres@pg01 pg_backup]$ pg_dump --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --format=custom --file=/home/postgres/pg_backup/db1.dump --verbose
口令:
pg_dump: 最後的內置 OID 是 16383
pg_dump: 讀擴展
pg_dump: 識別擴展成員
pg_dump: 讀取模式
pg_dump: 讀取用戶定義表
pg_dump: 讀取用戶定義函數
pg_dump: 讀取用戶定義類型
pg_dump: 讀取過程語言
pg_dump: 讀取用戶定義聚集函數
pg_dump: 讀取用戶定義操作符
pg_dump: 讀取用戶定義的訪問方法
pg_dump: 讀取用戶定義操作符集
pg_dump: 讀取用戶定義操作符
pg_dump: 讀取用戶定義的文本搜索解析器
pg_dump: 讀取用戶定義的文本搜索模板
pg_dump: 讀取用戶定義的文本搜索字典
pg_dump: 讀取用戶定義的文本搜索配置
pg_dump: 讀取用戶定義外部數據封裝器
pg_dump: 讀取用戶定義的外部服務器
pg_dump: 正在讀取缺省權限
pg_dump: 讀取用戶定義的校對函數
pg_dump: 讀取用戶定義的字符集轉換
pg_dump: 讀取類型轉換
pg_dump: 讀取轉換
pg_dump: 讀取表繼承信息
pg_dump: 讀取事件觸發器
pg_dump: 查找擴展表
pg_dump: 正在查找關係繼承
pg_dump: 正在讀取感興趣表的列信息
pg_dump: 正在查找表"public.t1"的列和類型
pg_dump: 正在查找表"public.v1"的列和類型
pg_dump: 正在查找表"public.t2"的列和類型
pg_dump: 正在查找表"public.t2"的默認表達式
pg_dump: 正在查找表"schema1.t1"的列和類型
pg_dump: 正在查找表"schema1.t2"的列和類型
pg_dump: 正在查找表"schema1.v_t2"的列和類型
pg_dump: 在子表裏標記繼承字段
pg_dump: 讀取索引
pg_dump: 爲表"public.t1"讀取索引
pg_dump: 爲表"public.t2"讀取索引
pg_dump: 爲表"schema1.t1"讀取索引
pg_dump: 爲表"schema1.t2"讀取索引
pg_dump: 在分區表中標記索引
pg_dump: 讀取擴展統計信息
pg_dump: 讀取約束
pg_dump: 讀取觸發器
pg_dump: 讀取重寫規則
pg_dump: 讀取策略
pg_dump: 爲表"public.t1"讀取行安全性啓用狀態
pg_dump: 爲表"public.t1"讀取策略
pg_dump: 爲表"public.v1"讀取行安全性啓用狀態
pg_dump: 爲表"public.v1"讀取策略
pg_dump: 爲表"public.seq1"讀取行安全性啓用狀態
pg_dump: 爲表"public.seq1"讀取策略
pg_dump: 爲表"public.t2_id_seq"讀取行安全性啓用狀態
pg_dump: 爲表"public.t2_id_seq"讀取策略
pg_dump: 爲表"public.t2"讀取行安全性啓用狀態
pg_dump: 爲表"public.t2"讀取策略
pg_dump: 爲表"schema1.t1"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.t1"讀取策略
pg_dump: 爲表"schema1.t2"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.t2"讀取策略
pg_dump: 爲表"schema1.v_t2"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.v_t2"讀取策略
pg_dump: 爲表"schema1.seq1"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.seq1"讀取策略
pg_dump: 讀取發佈
pg_dump: 讀取發佈成員資格
pg_dump: 爲表"public.t1"讀取發行會員資格
pg_dump: 爲表"public.t2"讀取發行會員資格
pg_dump: 爲表"schema1.t1"讀取發行會員資格
pg_dump: 爲表"schema1.t2"讀取發行會員資格
pg_dump: 讀取訂閱
pg_dump: 正在讀取大對象
pg_dump: 讀取從屬數據
pg_dump: 正在保存encoding = UTF8
pg_dump: 正在保存standard_conforming_strings = on
pg_dump: 正在保存search_path =
pg_dump: 保存數據庫定義
pg_dump: 正在轉儲表"public.t1"的內容
pg_dump: 正在轉儲表"public.t2"的內容
pg_dump: 正在轉儲表"schema1.t1"的內容
pg_dump: 正在轉儲表"schema1.t2"的內容

(3.2)對db1數據庫進行備份,保存爲sql格式

[postgres@pg01 pg_backup]$ pg_dump --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --format=plain --file=/home/postgres/pg_backup/db1.sql --verbose
口令:
pg_dump: 最後的內置 OID 是 16383
pg_dump: 讀擴展
pg_dump: 識別擴展成員
pg_dump: 讀取模式
pg_dump: 讀取用戶定義表
pg_dump: 讀取用戶定義函數
pg_dump: 讀取用戶定義類型
pg_dump: 讀取過程語言
pg_dump: 讀取用戶定義聚集函數
pg_dump: 讀取用戶定義操作符
pg_dump: 讀取用戶定義的訪問方法
pg_dump: 讀取用戶定義操作符集
pg_dump: 讀取用戶定義操作符
pg_dump: 讀取用戶定義的文本搜索解析器
pg_dump: 讀取用戶定義的文本搜索模板
pg_dump: 讀取用戶定義的文本搜索字典
pg_dump: 讀取用戶定義的文本搜索配置
pg_dump: 讀取用戶定義外部數據封裝器
pg_dump: 讀取用戶定義的外部服務器
pg_dump: 正在讀取缺省權限
pg_dump: 讀取用戶定義的校對函數
pg_dump: 讀取用戶定義的字符集轉換
pg_dump: 讀取類型轉換
pg_dump: 讀取轉換
pg_dump: 讀取表繼承信息
pg_dump: 讀取事件觸發器
pg_dump: 查找擴展表
pg_dump: 正在查找關係繼承
pg_dump: 正在讀取感興趣表的列信息
pg_dump: 正在查找表"public.t1"的列和類型
pg_dump: 正在查找表"public.v1"的列和類型
pg_dump: 正在查找表"public.t2"的列和類型
pg_dump: 正在查找表"public.t2"的默認表達式
pg_dump: 正在查找表"schema1.t1"的列和類型
pg_dump: 正在查找表"schema1.t2"的列和類型
pg_dump: 正在查找表"schema1.v_t2"的列和類型
pg_dump: 在子表裏標記繼承字段
pg_dump: 讀取索引
pg_dump: 爲表"public.t1"讀取索引
pg_dump: 爲表"public.t2"讀取索引
pg_dump: 爲表"schema1.t1"讀取索引
pg_dump: 爲表"schema1.t2"讀取索引
pg_dump: 在分區表中標記索引
pg_dump: 讀取擴展統計信息
pg_dump: 讀取約束
pg_dump: 讀取觸發器
pg_dump: 讀取重寫規則
pg_dump: 讀取策略
pg_dump: 爲表"public.t1"讀取行安全性啓用狀態
pg_dump: 爲表"public.t1"讀取策略
pg_dump: 爲表"public.v1"讀取行安全性啓用狀態
pg_dump: 爲表"public.v1"讀取策略
pg_dump: 爲表"public.seq1"讀取行安全性啓用狀態
pg_dump: 爲表"public.seq1"讀取策略
pg_dump: 爲表"public.t2_id_seq"讀取行安全性啓用狀態
pg_dump: 爲表"public.t2_id_seq"讀取策略
pg_dump: 爲表"public.t2"讀取行安全性啓用狀態
pg_dump: 爲表"public.t2"讀取策略
pg_dump: 爲表"schema1.t1"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.t1"讀取策略
pg_dump: 爲表"schema1.t2"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.t2"讀取策略
pg_dump: 爲表"schema1.v_t2"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.v_t2"讀取策略
pg_dump: 爲表"schema1.seq1"讀取行安全性啓用狀態
pg_dump: 爲表"schema1.seq1"讀取策略
pg_dump: 讀取發佈
pg_dump: 讀取發佈成員資格
pg_dump: 爲表"public.t1"讀取發行會員資格
pg_dump: 爲表"public.t2"讀取發行會員資格
pg_dump: 爲表"schema1.t1"讀取發行會員資格
pg_dump: 爲表"schema1.t2"讀取發行會員資格
pg_dump: 讀取訂閱
pg_dump: 正在讀取大對象
pg_dump: 讀取從屬數據
pg_dump: 正在保存encoding = UTF8
pg_dump: 正在保存standard_conforming_strings = on
pg_dump: 正在保存search_path =
pg_dump: 創建SCHEMA "schema1"
pg_dump: 創建SCHEMA "schema2"
pg_dump: 創建TYPE "public.mood"
pg_dump: 創建FUNCTION "public.variadic_example(numeric[])"
pg_dump: 創建SEQUENCE "public.seq1"
pg_dump: 創建TABLE "public.t1"
pg_dump: 創建TABLE "public.t2"
pg_dump: 創建SEQUENCE "public.t2_id_seq"
pg_dump: 創建SEQUENCE OWNED BY "public.t2_id_seq"
pg_dump: 創建VIEW "public.v1"
pg_dump: 創建SEQUENCE "schema1.seq1"
pg_dump: 創建TABLE "schema1.t1"
pg_dump: 創建TABLE "schema1.t2"
pg_dump: 創建VIEW "schema1.v_t2"
pg_dump: 創建DEFAULT "public.t2 id"
pg_dump: 爲表"public.t1"處理數據
pg_dump: 正在轉儲表"public.t1"的內容
pg_dump: 爲表"public.t2"處理數據
pg_dump: 正在轉儲表"public.t2"的內容
pg_dump: 爲表"schema1.t1"處理數據
pg_dump: 正在轉儲表"schema1.t1"的內容
pg_dump: 爲表"schema1.t2"處理數據
pg_dump: 正在轉儲表"schema1.t2"的內容
pg_dump: 執行 SEQUENCE SET seq1
pg_dump: 執行 SEQUENCE SET t2_id_seq
pg_dump: 執行 SEQUENCE SET seq1
pg_dump: 創建CONSTRAINT "public.t2 t2_pkey"
pg_dump: 創建CONSTRAINT "schema1.t1 t1_pkey"
pg_dump: 創建INDEX "public.idx_id"
pg_dump: 創建INDEX "schema1.idx_age"
pg_dump: 創建ACL "public.TABLE t1"

查看其備份結果:

[postgres@pg01 pg_backup]$ cat db1.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 12.5
-- Dumped by pg_dump version 12.5

-- Started on 2022-08-05 04:42:07 CST

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- TOC entry 9 (class 2615 OID 16405)
-- Name: schema1; Type: SCHEMA; Schema: -; Owner: postgres
--

CREATE SCHEMA schema1;


ALTER SCHEMA schema1 OWNER TO postgres;

--
-- TOC entry 6 (class 2615 OID 16406)
-- Name: schema2; Type: SCHEMA; Schema: -; Owner: postgres
--

CREATE SCHEMA schema2;


ALTER SCHEMA schema2 OWNER TO postgres;

--
-- TOC entry 639 (class 1247 OID 16397)
-- Name: mood; Type: TYPE; Schema: public; Owner: postgres
--

CREATE TYPE public.mood AS ENUM (
    'sad',
    'ok',
    'happy'
);


ALTER TYPE public.mood OWNER TO postgres;

--
-- TOC entry 213 (class 1255 OID 16451)
-- Name: variadic_example(numeric[]); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION public.variadic_example(VARIADIC numeric[]) RETURNS integer
    LANGUAGE sql
    AS $$SELECT 1$$;


ALTER FUNCTION public.variadic_example(VARIADIC numeric[]) OWNER TO postgres;

--
-- TOC entry 206 (class 1259 OID 16392)
-- Name: seq1; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.seq1
    AS integer
    START WITH 5
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 10
    CACHE 2;


ALTER TABLE public.seq1 OWNER TO postgres;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- TOC entry 204 (class 1259 OID 16385)
-- Name: t1; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.t1 (
    id integer,
    name character varying(50)
);


ALTER TABLE public.t1 OWNER TO postgres;

--
-- TOC entry 208 (class 1259 OID 16409)
-- Name: t2; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.t2 (
    id integer NOT NULL,
    name character varying(20)
);


ALTER TABLE public.t2 OWNER TO postgres;

--
-- TOC entry 207 (class 1259 OID 16407)
-- Name: t2_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.t2_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.t2_id_seq OWNER TO postgres;

--
-- TOC entry 3734 (class 0 OID 0)
-- Dependencies: 207
-- Name: t2_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--

ALTER SEQUENCE public.t2_id_seq OWNED BY public.t2.id;


--
-- TOC entry 205 (class 1259 OID 16388)
-- Name: v1; Type: VIEW; Schema: public; Owner: postgres
--

CREATE VIEW public.v1 AS
 SELECT t1.id,
    t1.name
   FROM public.t1;


ALTER TABLE public.v1 OWNER TO postgres;

--
-- TOC entry 212 (class 1259 OID 16452)
-- Name: seq1; Type: SEQUENCE; Schema: schema1; Owner: postgres
--

CREATE SEQUENCE schema1.seq1
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE schema1.seq1 OWNER TO postgres;

--
-- TOC entry 209 (class 1259 OID 16438)
-- Name: t1; Type: TABLE; Schema: schema1; Owner: lijiaman
--

CREATE TABLE schema1.t1 (
    id integer NOT NULL,
    name character varying(50)
);


ALTER TABLE schema1.t1 OWNER TO lijiaman;

--
-- TOC entry 210 (class 1259 OID 16441)
-- Name: t2; Type: TABLE; Schema: schema1; Owner: postgres
--

CREATE TABLE schema1.t2 (
    id integer,
    age integer,
    address character varying(100)
);


ALTER TABLE schema1.t2 OWNER TO postgres;

--
-- TOC entry 211 (class 1259 OID 16444)
-- Name: v_t2; Type: VIEW; Schema: schema1; Owner: postgres
--

CREATE VIEW schema1.v_t2 AS
 SELECT t2.id,
    t2.age,
    t2.address
   FROM schema1.t2
  WHERE (t2.id > 1);


ALTER TABLE schema1.v_t2 OWNER TO postgres;

--
-- TOC entry 3586 (class 2604 OID 16412)
-- Name: t2 id; Type: DEFAULT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.t2 ALTER COLUMN id SET DEFAULT nextval('public.t2_id_seq'::regclass);


--
-- TOC entry 3721 (class 0 OID 16385)
-- Dependencies: 204
-- Data for Name: t1; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.t1 (id, name) FROM stdin;
1       a
\.


--
-- TOC entry 3724 (class 0 OID 16409)
-- Dependencies: 208
-- Data for Name: t2; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.t2 (id, name) FROM stdin;
1       a
2       b
\.


--
-- TOC entry 3725 (class 0 OID 16438)
-- Dependencies: 209
-- Data for Name: t1; Type: TABLE DATA; Schema: schema1; Owner: lijiaman
--

COPY schema1.t1 (id, name) FROM stdin;
1       a
2       b
\.


--
-- TOC entry 3726 (class 0 OID 16441)
-- Dependencies: 210
-- Data for Name: t2; Type: TABLE DATA; Schema: schema1; Owner: postgres
--

COPY schema1.t2 (id, age, address) FROM stdin;
1       11      beijing
2       12      shenzheng
\.


--
-- TOC entry 3735 (class 0 OID 0)
-- Dependencies: 206
-- Name: seq1; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.seq1', 5, false);


--
-- TOC entry 3736 (class 0 OID 0)
-- Dependencies: 207
-- Name: t2_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.t2_id_seq', 2, true);


--
-- TOC entry 3737 (class 0 OID 0)
-- Dependencies: 212
-- Name: seq1; Type: SEQUENCE SET; Schema: schema1; Owner: postgres
--

SELECT pg_catalog.setval('schema1.seq1', 1, false);


--
-- TOC entry 3589 (class 2606 OID 16414)
-- Name: t2 t2_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.t2
    ADD CONSTRAINT t2_pkey PRIMARY KEY (id);


--
-- TOC entry 3591 (class 2606 OID 16449)
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: schema1; Owner: lijiaman
--

ALTER TABLE ONLY schema1.t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);


--
-- TOC entry 3587 (class 1259 OID 16424)
-- Name: idx_id; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX idx_id ON public.t1 USING btree (id);


--
-- TOC entry 3592 (class 1259 OID 16450)
-- Name: idx_age; Type: INDEX; Schema: schema1; Owner: postgres
--

CREATE INDEX idx_age ON schema1.t2 USING btree (age);


--
-- TOC entry 3733 (class 0 OID 0)
-- Dependencies: 204
-- Name: TABLE t1; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE public.t1 TO lijiaman;


-- Completed on 2022-08-05 04:42:10 CST

--
-- PostgreSQL database dump complete
--

(3.3)備份db1數據庫爲sql文件,並使用--create選項創建帶有create database db1語句的文件

[postgres@pg01 pg_backup]$ pg_dump --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --format=plain --file=/home/postgres/pg_backup/db1_create.sql --create --verbose
# 可以在導出的sql文件中看到創建數據庫的語句
CREATE DATABASE db1 WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'zh_CN.UTF-8' LC_CTYPE = 'zh_CN.UTF-8';
ALTER DATABASE db1 OWNER TO postgres;

(3.4)備份多個表

備份db1數據庫中的schema1.t1和schema.t2表爲sql文件

[postgres@pg01 pg_backup]$ pg_dump --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --table=schema1.t1  --table=schema1.t2 --format=plain --file=/home/postgres/pg_backup/db1_schema1_t1_t2.sql --verbose

結果如下:

[postgres@pg01 pg_backup]$ cat  db1_schema1_t1_t2.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 12.5
-- Dumped by pg_dump version 12.5

-- Started on 2022-08-05 05:03:36 CST

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- TOC entry 209 (class 1259 OID 16438)
-- Name: t1; Type: TABLE; Schema: schema1; Owner: lijiaman
--

CREATE TABLE schema1.t1 (
    id integer NOT NULL,
    name character varying(50)
);


ALTER TABLE schema1.t1 OWNER TO lijiaman;

--
-- TOC entry 210 (class 1259 OID 16441)
-- Name: t2; Type: TABLE; Schema: schema1; Owner: postgres
--

CREATE TABLE schema1.t2 (
    id integer,
    age integer,
    address character varying(100)
);


ALTER TABLE schema1.t2 OWNER TO postgres;

--
-- TOC entry 3710 (class 0 OID 16438)
-- Dependencies: 209
-- Data for Name: t1; Type: TABLE DATA; Schema: schema1; Owner: lijiaman
--

COPY schema1.t1 (id, name) FROM stdin;
1       a
2       b
\.


--
-- TOC entry 3711 (class 0 OID 16441)
-- Dependencies: 210
-- Data for Name: t2; Type: TABLE DATA; Schema: schema1; Owner: postgres
--

COPY schema1.t2 (id, age, address) FROM stdin;
1       11      beijing
2       12      shenzheng
\.


--
-- TOC entry 3580 (class 2606 OID 16449)
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: schema1; Owner: lijiaman
--

ALTER TABLE ONLY schema1.t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);


--
-- TOC entry 3581 (class 1259 OID 16450)
-- Name: idx_age; Type: INDEX; Schema: schema1; Owner: postgres
--

CREATE INDEX idx_age ON schema1.t2 USING btree (age);


-- Completed on 2022-08-05 05:03:38 CST

--
-- PostgreSQL database dump complete
--

(3.5)備份db1數據庫的表schema1.t1,並使用--clean選項創建帶有drop table、drop index的sql文件

[postgres@pg01 pg_backup]$ pg_dump --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --table=schema1.t1 --format=plain --file=/home/postgres/pg_backup/db1_schema1_t1.sql --verbose --clean

結果如下:

[postgres@pg01 pg_backup]$ cat db1_schema1_t1.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 12.5
-- Dumped by pg_dump version 12.5

-- Started on 2022-08-05 05:12:33 CST

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

ALTER TABLE ONLY schema1.t1 DROP CONSTRAINT t1_pkey;
DROP TABLE schema1.t1;
SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- TOC entry 209 (class 1259 OID 16438)
-- Name: t1; Type: TABLE; Schema: schema1; Owner: lijiaman
--

CREATE TABLE schema1.t1 (
    id integer NOT NULL,
    name character varying(50)
);


ALTER TABLE schema1.t1 OWNER TO lijiaman;

--
-- TOC entry 3709 (class 0 OID 16438)
-- Dependencies: 209
-- Data for Name: t1; Type: TABLE DATA; Schema: schema1; Owner: lijiaman
--

COPY schema1.t1 (id, name) FROM stdin;
1       a
2       b
\.


--
-- TOC entry 3580 (class 2606 OID 16449)
-- Name: t1 t1_pkey; Type: CONSTRAINT; Schema: schema1; Owner: lijiaman
--

ALTER TABLE ONLY schema1.t1
    ADD CONSTRAINT t1_pkey PRIMARY KEY (id);


-- Completed on 2022-08-05 05:12:35 CST

--
-- PostgreSQL database dump complete
--


(四)使用pg_restore恢復的例子

特別注意:pg_restore [選項]... [文件名],文件名直接跟在選項後面,不是--file來指定

(4.1)恢復數據庫db1

pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --format=custom /home/postgres/pg_backup/db1.dump  --verbose

(4.2)使用--clean選項導入時覆蓋之前的表

pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --format=custom /home/postgres/pg_backup/db1.dump  --verbose --clean

(4.3)將之前導出的db1數據庫恢復到db2

-- 1.創建db2數據庫
db1=# create database db2;
CREATE DATABASE

-- 2.使用之前db1數據庫的備份,執行恢復到db2
pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db2 --format=custom /home/postgres/pg_backup/db1.dump  --verbose

-- 3.查看恢復情況
db1=# \c db2
您現在已經連接到數據庫 "db2",用戶 "postgres".
db2=# \dn
    架構模式列表
  名稱   |  擁有者
---------+----------
 public  | postgres
 schema1 | postgres
 schema2 | postgres
(3 行記錄)

db2=# \dt
              關聯列表
 架構模式 | 名稱 |  類型  |  擁有者
----------+------+--------+----------
 public   | t1   | 數據表 | postgres
 public   | t2   | 數據表 | postgres
(2 行記錄)

db2=# set search_path to schema1
db2-# ;
SET
db2=# \dt
              關聯列表
 架構模式 | 名稱 |  類型  |  擁有者
----------+------+--------+----------
 schema1  | t1   | 數據表 | lijiaman
 schema1  | t2   | 數據表 | postgres
(2 行記錄)

db2=# \ds
              關聯列表
 架構模式 | 名稱 |  類型  |  擁有者
----------+------+--------+----------
 schema1  | seq1 | 序列數 | postgres
(1 行記錄)

(4.4)使用--schema-only選項,只恢復schema

-- 1.創建數據庫db4
db1=# create database db4;

-- 2.只恢復表結構,視圖等,不恢復裏面的數據
[postgres@pg01 pg_backup]$ pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db4 --schema-only --format=custom /home/postgres/pg_backup/db1.dump  --verbose

-- 3.確認有表結構,無數據
db1=# \c db4
您現在已經連接到數據庫 "db4",用戶 "lijiaman".
db4=# \dt
              關聯列表
 架構模式 | 名稱 |  類型  |  擁有者
----------+------+--------+----------
 public   | t1   | 數據表 | postgres
 public   | t2   | 數據表 | postgres
(2 行記錄)

db4=# set search_path to schema1
db4-# ;
SET
db4=# select * from t1;
 id | name
----+------
(0 行記錄)

(4.5)使用--data-only 選項,只恢復數據

-- 1.在上一步基礎上進行數據恢復
[postgres@pg01 pg_backup]$ pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db4 --data-only --format=custom /home/postgres/pg_backup/db1.dump  --verbose
pg_restore: 爲恢復數據庫與數據庫聯接
口令:
pg_restore: 爲表"public.t1"處理數據
pg_restore: 爲表"public.t2"處理數據
pg_restore: 爲表"schema1.t1"處理數據
pg_restore: 爲表"schema1.t2"處理數據
pg_restore: 執行 SEQUENCE SET seq1
pg_restore: 執行 SEQUENCE SET t2_id_seq
pg_restore: 執行 SEQUENCE SET seq1
[postgres@pg01 pg_backup]$

-- 查看數據
db4=# select * from t1;
 id | name
----+------
  1 | a
  2 | b

(4.6)只恢復schema1.t1和schema1.t2表到db5的schema1下面

-- 1.創建數據庫db1和schema1
postgres=# create database db5;
CREATE DATABASE
postgres=# \c db5
您現在已經連接到數據庫 "db5",用戶 "lijiaman".
db5=# create schema schema1;
CREATE SCHEMA

-- 2.導入2個表
[postgres@pg01 pg_backup]$ pg_restore --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db5 --schema=schema1 --table=t1 --table=t2 --format=custom /home/postgres/pg_backup/db1.dump  --verbose
pg_restore: 爲恢復數據庫與數據庫聯接
口令:
pg_restore: 創建TABLE "schema1.t1"
pg_restore: 創建TABLE "schema1.t2"
pg_restore: 爲表"schema1.t1"處理數據
pg_restore: 爲表"schema1.t2"處理數據
[postgres@pg01 pg_backup]$

(五)psql恢復sql文件

對於pg_dump備份出來的sql文件,直接執行sql文件即可恢復

psql --username=lijiaman --password --host=192.168.10.11 --port=5432 --dbname=db1 --file=db1.sql 

附錄

測試數據

\c db1    -- 切換到db1數據庫
set search_path to schema1;    -- 切換到schema1

-- 創建表
create table t1(id int,name varchar(50));
insert into t1 values(1,'a');
insert into t1 values(2,'b');
-- 創建主鍵約束
alter table t1 add primary key(id);


create table t2(id int,age int,address varchar(100));
insert into t2 values(1,11,'beijing');
insert into t2 values(2,12,'shenzheng');
-- 創建索引
create index idx_age on t2(age);
-- 創建視圖
create view v_t2 as select * from t2 where id > 1;
-- 創建序列
create sequence seq1;

-- 創建函數
CREATE FUNCTION public.variadic_example(VARIADIC numeric[]) RETURNS int
  LANGUAGE sql AS 'SELECT 1';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章