PostgreSQL數(shù)據(jù)庫(kù)備份還原全攻略
前言
- 邏輯備份
即SQL轉(zhuǎn)儲(chǔ)方式,使用pg_dump和pg_dumpall進(jìn)行備份。邏輯備份在恢復(fù)時(shí),介于邏輯備份與故障時(shí)間點(diǎn)之間的數(shù)據(jù)難以恢復(fù),所以邏輯備份適用于留存某個(gè)時(shí)間點(diǎn)的備份或進(jìn)行跨平臺(tái)跨版本的數(shù)據(jù)遷移。 - 文件系統(tǒng)級(jí)備份
即拷貝數(shù)據(jù)文件的完整目錄,備份時(shí)需要關(guān)閉數(shù)據(jù)庫(kù)?;謴?fù)數(shù)據(jù)庫(kù)時(shí),只需將數(shù)據(jù)目錄復(fù)制到原來(lái)的位置。該方式實(shí)際工作中很少使用。 - 連續(xù)歸檔
該方式是把一個(gè)文件系統(tǒng)級(jí)別的全量備份和WAL(預(yù)寫(xiě)式日志)級(jí)別的增量備份結(jié)合起來(lái)。當(dāng)需要恢復(fù)時(shí),我們先恢復(fù)文件系統(tǒng)級(jí)別的備份,然后重放備份的WAL文件,把系統(tǒng)恢復(fù)到之前的某個(gè)狀態(tài)。
本文主要介紹邏輯備份和連續(xù)歸檔方式的備份及還原,文件系統(tǒng)級(jí)備份由于比較簡(jiǎn)單,這里不在贅述。
以下操作使用的數(shù)據(jù)庫(kù)版本為PostgreSQL 12.5,不同的數(shù)據(jù)庫(kù)版本在進(jìn)行連續(xù)歸檔操作時(shí)會(huì)有細(xì)微差異。
一、邏輯備份
1.pg_dump工具
以下為pg_dump工具的常用參數(shù)選項(xiàng)(更多參數(shù)可使用pg_dump --help查看)
聯(lián)接選項(xiàng): -h, --host=主機(jī)名 數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)名或套接字目錄 -U, --username=名字 以指定的數(shù)據(jù)庫(kù)用戶聯(lián)接 -d, --dbname=DBNAME 對(duì)數(shù)據(jù)庫(kù) DBNAME備份 -p, --port=端口號(hào) 數(shù)據(jù)庫(kù)服務(wù)器的端口號(hào) -w, --no-password 永遠(yuǎn)不提示輸入口令 -W, --password 強(qiáng)制口令提示 (自動(dòng)) --role=ROLENAME 在轉(zhuǎn)儲(chǔ)前運(yùn)行SET ROLE 一般選項(xiàng): -f, --file=FILENAME 輸出文件或目錄名,導(dǎo)出到指定文件 -F, --format= p|c|d|t 導(dǎo)出文件格式(p|c|d|t) p:plain-輸出普通文字SQL腳本(默認(rèn)); c:custom-輸出自定義歸檔格式,適用于pg_restore導(dǎo)入,該格式是最靈活導(dǎo)出方式,允許在導(dǎo)入時(shí)自定義選擇和重 排序歸檔條目。該格式默認(rèn)啟用壓縮; d:directory-輸出文件夾歸檔格式,適用于pg_restore導(dǎo)入。該格式會(huì)創(chuàng)建一個(gè)文件夾,一個(gè)表對(duì)應(yīng)一個(gè)文件。該格式默認(rèn)啟用壓縮,并且支持并行導(dǎo)出; t:tar-輸出tar壓縮歸檔格式,適用于pg_restore導(dǎo)入。該格式將文件夾歸檔格式產(chǎn)生的文件夾壓縮成tar壓縮包。但該格式不支持壓縮(文件夾歸檔已經(jīng)壓縮了),并且在導(dǎo)入時(shí)也不能更改相關(guān)的表順序。 控制輸出內(nèi)容選項(xiàng): -s, --schema-only 只轉(zhuǎn)儲(chǔ)模式, 不包括數(shù)據(jù) -a, --data-only 只轉(zhuǎn)儲(chǔ)數(shù)據(jù),不包括模式 -t, --table=TABLE 只轉(zhuǎn)儲(chǔ)指定名稱的表 -T, --exclude-table=TABLE 不轉(zhuǎn)儲(chǔ)指定名稱的表 -C, --create 在轉(zhuǎn)儲(chǔ)中包括創(chuàng)建數(shù)據(jù)庫(kù)語(yǔ)句 -c, --clean:包含drop刪除語(yǔ)句,建議與--if-exists同時(shí)使用; --if-exists,drop刪除語(yǔ)句時(shí)帶上IF EXISTS指令 -n, --schema=SCHEMA 只轉(zhuǎn)儲(chǔ)指定名稱的模式 -N, --exclude-schema=SCHEMA 不轉(zhuǎn)儲(chǔ)已命名的模式 -O, --no-owner 在明文格式中, 忽略恢復(fù)對(duì)象所屬者 -S, --superuser=NAME 在明文格式中使用指定的超級(jí)用戶名 --column-inserts 以帶有列名的INSERT命令形式轉(zhuǎn)儲(chǔ)數(shù)據(jù) --inserts 以INSERT命令,而不是COPY命令的形式轉(zhuǎn)儲(chǔ)數(shù)據(jù) --disable-triggers 在只恢復(fù)數(shù)據(jù)的過(guò)程中禁用觸發(fā)器 --exclude-table-data=TABLE 不轉(zhuǎn)儲(chǔ)指定名稱的表中的數(shù)據(jù) --no-synchronized-snapshots 在并行工作集中不使用同步快照 --no-tablespaces 不轉(zhuǎn)儲(chǔ)表空間分配信息 --no-unlogged-table-data 不轉(zhuǎn)儲(chǔ)沒(méi)有日志的表數(shù)據(jù) --quote-all-identifiers 所有標(biāo)識(shí)符加引號(hào),即使不是關(guān)鍵字 --section=SECTION 備份命名的節(jié) (數(shù)據(jù)前, 數(shù)據(jù), 及 數(shù)據(jù)后) --serializable-deferrable 等到備份可以無(wú)異常運(yùn)行 --snapshot=SNAPSHOT 為轉(zhuǎn)儲(chǔ)使用給定的快照 --strict-names 要求每個(gè)表和/或schema包括模式以匹配至少一個(gè)實(shí)體
常用示例:
#備份schema及數(shù)據(jù),指定數(shù)據(jù)庫(kù)pg_hive,指定文件為pg_hive20210108.sql pg_dump -h 127.0.0.1 -U postgres -d pg_hive -f /opt/pg_hive20210108.sql #只備份schema pg_dump -h 127.0.0.1 -U postgres -d pg_hive -s -f /opt/pg_hive20210108.sql #只備份數(shù)據(jù) pg_dump -h 127.0.0.1 -U postgres -d pg_hive -a -f /opt/pg_hive20210108.sql #備份單個(gè)表 pg_dump -h 127.0.0.1 -U postgres -d pg_hive –t table1 -f /opt/pg_hive20210108.sql #備份多個(gè)表 pg_dump -h 127.0.0.1 -U postgres -d pg_hive –t table1 –t table2 -f /opt/pg_hive20210108.sql #以帶有列名的INSERT命令形式轉(zhuǎn)儲(chǔ)數(shù)據(jù) pg_dump -h 127.0.0.1 -U postgres -d pg_hive --column-inserts -f /opt/pg_hive20210108.sql #指定導(dǎo)出格式為自定義格式(二進(jìn)制形式) pg_dump -h 127.0.0.1 -U postgres -d pg_hive -Fc -f /opt/pg_hive20210108.dump #使用gzip壓縮轉(zhuǎn)儲(chǔ)(針對(duì)大型數(shù)據(jù)庫(kù)) pg_dump -h 127.0.0.1 -U postgres -d pg_hive | gzip > /opt/pg_hive20210108_gz.sql.gz #使用split切片文件(針對(duì)大型數(shù)據(jù)庫(kù)) /pg_dump -h 127.0.0.1 -U postgres -d pg_hive | split -b 100m - /opt/pg_hive20210108_sp.sql
2.pg_dumpall工具
相對(duì)于pg_dump只能備份單個(gè)庫(kù),pg_dumpall可以備份整個(gè)PostgreSql實(shí)例中所有的數(shù)據(jù),包括角色和表空間定義。
使用示例:
#備份整個(gè)postgresql實(shí)例中所有的數(shù) pg_dumpall -h 127.0.0.1 -U postgres -f /opt/pg_hive20210108_all.sql
二、邏輯備份還原
邏輯備份的還原命令為psql和pg_restore:
如果使用pg_dump未指定format(即未使用-F參數(shù)),則導(dǎo)出的是SQL腳本,導(dǎo)入時(shí)需用psql命令,否則用pg_restore還原。因這2個(gè)還原工具大部分參數(shù)與pg_dump含義相近,可使用命令后加–help查看詳細(xì)參數(shù)。
常用示例:
#pg_dump備份時(shí)未指定format,還原時(shí)用psql psql -h 127.0.0.1 -U postgres -d pg_hive -f /opt/pg_hive20210108.sql #pg_dump備份時(shí)候使用-F參數(shù)指定format,還原時(shí)用pg_restore pg_restore -h 127.0.0.1 -U postgres -d pg_hive /opt/pg_hive20210108.dump #還原gzip壓縮數(shù)據(jù)庫(kù)備份 gunzip -c /opt/pg_hive20210108_gz.sql.gz | psql -h 127.0.0.1 -U postgres -d pg_hive #還原切片數(shù)據(jù)庫(kù)備份 cat /opt/pg_hive20210108_sp.sql* | psql -h 127.0.0.1 -U postgres -d pg_hive
三、連續(xù)歸檔備份
連續(xù)歸檔是通過(guò)基礎(chǔ)備份和wal日志相結(jié)合的方式進(jìn)行備份,恢復(fù)的時(shí)候可以選擇恢復(fù)到指定的時(shí)間點(diǎn)、指定事務(wù)點(diǎn)、或者完全恢復(fù)到wal日志的最新位置。
操作步驟如下:
1、創(chuàng)建備份目錄
#創(chuàng)建基礎(chǔ)備份目錄 mkdir -p /data/pg_base #創(chuàng)建wal日志備份目錄 mkdir -p /data/pg_archive
注意新建備份文件夾的權(quán)限及所有者,否則會(huì)備份失敗
#更新備份文件夾的所有者 chown postgres:postgres /data/pg_base chown postgres:postgres /data/pg_archive
2、修改配置文件
打開(kāi)postgresql.conf配置文件,修改以下3個(gè)參數(shù):
vi postgresql.conf #wal_level中有三個(gè)主要的參數(shù):minimal、archive和hot_standby。1.minimal是默認(rèn)的值,它僅寫(xiě)入崩潰或者突發(fā)關(guān)機(jī)時(shí)所需要的信息(不建議使用)。2.archive是增加wal歸檔所需的日志(最常用)。3.hot_standby是在備用服務(wù)器上增加了運(yùn)行只讀查詢所需的信息,一般實(shí)在流復(fù)制的時(shí)候使用到 wal_level = archive #開(kāi)啟歸檔模式 archive_mode = on #備份wal日志,每天生成一個(gè)日期命名的文件夾 archive_command = 'DIR=/data/pg_archive/`date +%F`; test ! -d $DIR && mkdir -p $DIR; test ! -f $DIR/%f && cp %p $DIR/%f'
3、重啟pg數(shù)據(jù)庫(kù)
命令為:pg_ctl restart
4、創(chuàng)建表
該步驟為測(cè)試備份及恢復(fù)效果使用
--創(chuàng)建表,插入10條測(cè)試數(shù)據(jù): create table test (id integer); insert into test values(generate_series(1,10));
5、做基礎(chǔ)備份
pg_basebackup -Ft -Pv -Xf -z -Z5 -D /data/pg_base/`date +%F`
為了測(cè)試備份和恢復(fù)效果,再插入10條數(shù)據(jù),并進(jìn)行手動(dòng)切換wal日志,執(zhí)行如下sql:
#插入數(shù)據(jù) insert into test values(generate_series(1,10)); #切換wal日志 select pg_switch_wal();
四、連續(xù)歸檔恢復(fù)
1、創(chuàng)建data文件夾
#重命名原來(lái)的data文件夾 mv /pgsql/postgresql/data /pgsql/postgresql/data.bak #創(chuàng)建新的data文件夾 mkdir data
2、解壓基礎(chǔ)備份至新建的data文件夾
#拷貝基礎(chǔ)備份到新建data文件夾 cp /data/pg_base/2021-01-15/base.tar.gz /pgsql/postgresql/data #解壓文件 tar -zxvf base.tar.gz #刪除基礎(chǔ)備份中的wal日志和postmaster.pid文件 Cd /pgsql/postgresql/data rm -rf pg_wal rm -rf postmaster.pid #創(chuàng)建archive_status文件夾 mkdir -p pg_wal/archive_status
3、修改配置文件
vi postgresql.conf #修改restore_command為要恢復(fù)的wal日志目錄 restore_command = 'cp /data/pg_archive/2021-01-15/%f %p'
4、新建recovery.signal文件
#恢復(fù)時(shí)依賴該文件,恢復(fù)至最新wal位置,文件無(wú)需添加內(nèi)容 touch recovery.signal
5、賦權(quán)并啟動(dòng)數(shù)據(jù)庫(kù)
#新建的data文件夾更改所有者 chown -R postgres:postgres /pgsql/postgresql/data #修改data目錄權(quán)限,否則會(huì)因?yàn)槟夸洐?quán)限過(guò)大無(wú)法啟動(dòng)數(shù)據(jù)庫(kù) chmod 0700 data -R #啟動(dòng)數(shù)據(jù)庫(kù) pg_ctl start
6、驗(yàn)證恢復(fù)效果
如下圖,已通過(guò)基礎(chǔ)備份和wal日志恢復(fù)全部數(shù)據(jù)。
總結(jié)
新創(chuàng)建文件夾時(shí)注意文件夾的歸屬及權(quán)限,否則會(huì)導(dǎo)致備份或恢復(fù)失敗。
以上就是PostgreSQL數(shù)據(jù)庫(kù)備份還原全攻略的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL備份還原的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 在Windows下自動(dòng)備份PostgreSQL的教程
- Postgresql備份和增量恢復(fù)方案
- PostgreSQL之pgdump備份恢復(fù)操作
- PostgreSQL物理備份恢復(fù)之 pg_rman的用法說(shuō)明
- postgreSQL使用pgAdmin備份服務(wù)器數(shù)據(jù)的方法
- PostgreSQL備份工具 pgBackRest使用詳解
- PostgreSQL備份和還原命令整理大全
- PostgreSQL數(shù)據(jù)庫(kù)備份與恢復(fù)的四種辦法
- PostgreSQL數(shù)據(jù)庫(kù)備份的幾種實(shí)現(xiàn)方法
相關(guān)文章
PostgreSQL教程(一):數(shù)據(jù)表詳解
這篇文章主要介紹了PostgreSQL教程(一):數(shù)據(jù)表詳解表的定義、系統(tǒng)字段、表的修改、表的權(quán)限等4大部份內(nèi)容,內(nèi)容種包括表的創(chuàng)建、刪除、修改、字段的修改、刪除、主鍵和外鍵、約束添加修改刪除等,本文講解了,需要的朋友可以參考下2015-05-05PostgreSQL教程(四):數(shù)據(jù)類(lèi)型詳解
這篇文章主要介紹了PostgreSQL教程(四):數(shù)據(jù)類(lèi)型詳解,本文講解了數(shù)值類(lèi)型、字符類(lèi)型、布爾類(lèi)型、位串類(lèi)型、數(shù)組、復(fù)合類(lèi)型等數(shù)據(jù)類(lèi)型,需要的朋友可以參考下2015-05-05pg中replace和translate的用法說(shuō)明(數(shù)據(jù)少的中文排序)
這篇文章主要介紹了pg中replace和translate的用法說(shuō)明(數(shù)據(jù)少的中文排序),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01postgresql 實(shí)現(xiàn)查詢某時(shí)間區(qū)間的所有日期案例
這篇文章主要介紹了postgresql 實(shí)現(xiàn)查詢某時(shí)間區(qū)間的所有日期案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01PostgreSQL 序列(Sequence) 與 Oracle 序列對(duì)比差異分
PostgreSQL 和 Oracle 都提供了序列(Sequence)功能,但在實(shí)現(xiàn)細(xì)節(jié)和使用方式上存在一些重要差異,下面給大家介紹PostgreSQL 序列(Sequence) 與 Oracle 序列對(duì)比差異分析,感興趣的朋友一起看看吧2025-05-05PostgreSQL自動(dòng)更新時(shí)間戳實(shí)例代碼
最近有這么一個(gè)工程,需要使用postgresql數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)中的好幾個(gè)表中都需要時(shí)間戳這個(gè)字段,這篇文章主要給大家介紹了關(guān)于PostgreSQL自動(dòng)更新時(shí)間戳的相關(guān)資料,需要的朋友可以參考下2021-11-11postgresql的jsonb數(shù)據(jù)查詢和修改的方法
這篇文章主要介紹了postgresql的jsonb數(shù)據(jù)查詢和修改的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03