使用PostgreSQL 腳本導出資料庫的DDL
- 2022 年 3 月 13 日
- 筆記
- pgsql psdump, PostgreSQL, 大數據
本文主要介紹如何使用基於 PostgreSQL pgdump編寫的自定義腳本來導出資料庫的DDL。
一、文件說明:
1、pgdump基礎語句.sql:pgdump基礎語法。 2、PGSQL_bak_Full.sh:實現使用pgdump導出全部對象腳本。 3、PGSQL_bak_Proc_Fun.sh:實現使用pgdump僅導出存儲過程和函數對象DDL腳本。 說明:pgdump使用上述腳本導出的DDL存在少量顯示問題,使用時請謹慎。
-
這個腳本支援自定義數量的表對象結構導出,腳本中只有示例表名。具體使用時應人工指定,導出全部表時,建議使用PGSQL_bak_Full.sh。
-
各腳本均支援同時導出一個或多個資料庫。
二、腳本結構
具體的腳本格式如下:
#!/bin/bash
#全備方式,一般在從機上執行,適用於小中型PGSQL資料庫
#source /etc/profile #載入系統環境變數
#source ~/.bash_profile #載入用戶環境變數
#set -o nounset #引用未初始化變數時退出
#set -o errexit #執行shell命令遇到錯誤時退出
#01 連接資料庫所需認證資訊
user="postgres"
password="****************"
host="106.54.134.160"
port="5432"
#02 需備份的資料庫,數組形式,如果只需備份一個資料庫,只需保留一個庫名稱即可
db=("postgres" "kingland")
#03 備份路徑及文件名格式設置
pgsql_path="/usr/local/backupdata"
backup_path="${pgsql_path}/backup"
date=$(date +%Y-%m-%d_%H-%M-%S)
backup_log="${pgsql_path}/backup.log"
#建立備份目錄
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
echo "開始備份資料庫:${db[*]}"
#04 備份
backup_sql(){
dbname=$1
backup_name="${dbname}_${date}.sql"
#-R備份存儲過程,函數,觸發器
pg_dump -s "host=$host user=$user port=$port password=$password dbname= $dbname">$backup_path/$backup_name
if [[ $? == 0 ]];then
cd $backup_path
echo "$date 備份 $dbname成功 "
else
cd $backup_path
rm -rf $backup_name
echo "$date 備份 $dbname 失敗 "
fi
}
#05 循環備份
length=${#db[@]}
for (( i = 0; i < $length; i++ )); do
backup_sql ${db[$i]} >> $backup_log 2>&1
done
echo "備份結束,結果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'
說明:
01:連接資料庫所需認證資訊
用戶為資料庫用戶和密碼,埠號為默認的5432;
02:需備份的資料庫
支援一個或多個資料庫備份,資料庫名稱需要使用雙引號引起來;
03:備份路徑及文件名格式設置
要確保pgsql_path變數中對應的物理路徑要存在,特別是backup文件夾也要提前建好;具體的文件名稱格式使用時間後綴,該格式可以自定義;
04、05:循環備份
根據前面的配置進行循環備份,如果備份失敗,腳本會自動刪除過程備份數據。
備份記錄自動記錄log文件到backup.log中。
三、其他說明
各文件關鍵參數區別
1、PGSQL_bak_Full.sh
#-R備份存儲過程,函數,觸發器
pg_dump -s "host=$host user=$user port=$port password=$password dbname= $dbname">$backup_path/$backup_name
-s
–schema-only
只輸出對象定義(模式),不輸出數據。
2、PGSQL_bak_Proc_Fun.sh
#-Fc備份存儲過程(函數)定義
pg_dump -s -Fc "host=$host user=$user port=$port password=$password dbname= $dbname">$backup_path/$backup_name
3、PGSQL_bak_Table.sh
#--t只導出指定表 這裡示例表test ,實際使用中應按需指定
pg_dump -s -t test "host=$host user=$user port=$port password=$password dbname= $dbname">$backup_path/$backup_name
這裡的test是測試表,實際生產活動中應修改為對應的表名;如果一次性要導出多個表,使用pg_dump -t table1 -t table2 -t table3 這種格式。
四、結果說明
導出結構文本內容格式:
--
-- PostgreSQL database dump
--
-- Dumped from database version 10.15 (Ubuntu 10.15-0ubuntu0.18.04.1)
-- Dumped by pg_dump version 10.15 (Ubuntu 10.15-0ubuntu0.18.04.1)
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;
--
-- Name: DATABASE postgres; Type: COMMENT; Schema: -; Owner: postgres
--
COMMENT ON DATABASE postgres IS 'default administrative connection database';
--
-- 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';
--
-- Name: delete_ebd_compute_log_three_month_ago_data(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.delete_ebd_compute_log_three_month_ago_data() RETURNS void
LANGUAGE plpgsql
AS $$
begin
select * from test;
END;
$$;
ALTER FUNCTION public.delete_ebd_compute_log_three_month_ago_data() OWNER TO postgres;
--
-- Name: sales_tax(real); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION public.sales_tax(subtotal real) RETURNS real
LANGUAGE plpgsql
AS $$
BEGIN
RETURN subtotal * 0.06;
END;
$$;
ALTER FUNCTION public.sales_tax(subtotal real) OWNER TO postgres;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: test; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.test (
id integer,
name character varying(38)
);
ALTER TABLE public.test OWNER TO postgres;
--
-- Name: v_test; Type: VIEW; Schema: public; Owner: postgres
--
CREATE VIEW public.v_test AS
SELECT test.id,
test.name
FROM public.test;
ALTER TABLE public.v_test OWNER TO postgres;
--
-- PostgreSQL database dump complete
--