怎么在postgresql中連續(xù)歸檔及時(shí)間點(diǎn)恢復(fù)的操作?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
在七星關(guān)區(qū)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,七星關(guān)區(qū)網(wǎng)站建設(shè)費(fèi)用合理。PostgreSQL默認(rèn)處于非歸檔模式。開啟歸檔模式,主要涉及到三個(gè)參數(shù):wal_level,archive_mode和archive_commandwal_level參數(shù)默認(rèn)為mininal,設(shè)置此參數(shù)為archive或者之上的級(jí)別都可以打開歸檔。當(dāng)postgresql需要傳輸歸檔日志時(shí),會(huì)調(diào)用archive_command指定的shell命令。
歸檔文件傳輸成功時(shí),shell命令要返回0,此時(shí),postgresql會(huì)認(rèn)為歸檔文件已經(jīng)傳輸成功,因此可以刪除或者重新循環(huán)利用歸檔文件。當(dāng)shell命令返回非0值時(shí),postgresql會(huì)保留所有未成功傳輸?shù)臍w檔日志,并不斷嘗試重新傳輸,直到成功。如果歸檔命令一直不成功,pg_xlog目錄會(huì)持續(xù)增長(zhǎng),有耗盡服務(wù)器存儲(chǔ)空間的可能,此時(shí)postgresql會(huì)PANIC關(guān)閉,直到釋放存儲(chǔ)空間。
另外將歸檔WAL日志存儲(chǔ)在本機(jī)上是風(fēng)險(xiǎn)極高,不被推薦的。postgresql通過archive_command提供了存儲(chǔ)WAL日志的靈活性,可以將歸檔日志存儲(chǔ)到掛裝的NFS目錄,磁帶,刻錄到光盤,也可以將WAL日志通過ssh/scp,rsync傳輸?shù)疆悪C(jī)保存。
**注意:**archive_command及restore_command命令將以運(yùn)行PostgreSQL的系統(tǒng)用戶的身份運(yùn)行。Centos系統(tǒng)里,這個(gè)系統(tǒng)用戶是postges。
Role | IP | 系統(tǒng) | 數(shù)據(jù)庫(kù) |
---|---|---|---|
源庫(kù) | 10.10.10.60 | Centos6.5 | postgresql 9.2 |
備份庫(kù) | 10.10.10.61 | Centos6.5 | postgresql 9.2 |
需求說明:源庫(kù)產(chǎn)生歸檔日志,并傳輸?shù)絺浞輲?kù)上的歸檔目錄/data/pg_archive;備份庫(kù)利用歸檔日志,恢復(fù)至源庫(kù)的任意時(shí)間點(diǎn)的數(shù)據(jù)。
注意:基礎(chǔ)環(huán)境我們基于postgresql流復(fù)制,但是備份庫(kù)作為一個(gè)獨(dú)立的庫(kù),此時(shí)請(qǐng)保證recovery.conf中的standby_mode=off
1.ssh無密碼登錄
由于我們備份和還原過程中所用的archive_command和restore_command命令都以postgres用戶運(yùn)行,因此我們需要針對(duì)postgres用戶實(shí)現(xiàn)ssh無密碼登錄。
#源庫(kù) ssh-ketgen -t rsa scp id_rsa.pub postgres@10.10.10.60:/var/lib/pgsql/.ssh/authorized_keys #備份庫(kù) ssh-ketgen -t rsa scp id_rsa.pub postgres@10.10.10.61:/var/lib/pgsql/.ssh/authorized_keys
**注意:**yum安裝postgresql時(shí),默認(rèn)生成的postgres用戶的家目錄在/var/lib/pgsql
2.配置備份庫(kù)的歸檔目錄
#備份庫(kù) mkdir -p /data/pg_archive chmod postgres.postgres /data/pg_archive
說明:源庫(kù)產(chǎn)生的歸檔日志,要存到到異地備份庫(kù)的/data/pg_archive下。
3.修改源庫(kù)的postgresql.conf
在postgresql.conf中添加以下幾行
#開啟歸檔模式 archive_mode = on archive_command = 'ssh 10.10.10.60 test ! -f /data/pg_archive/%f && scp %p 10.10.10.60:/data/pg_archive/%f'
其中: %p表示wal日志文件的路徑,%f表示wal日志文件名稱。archive_command表示先驗(yàn)證備份庫(kù)的歸檔目錄下是否存在同名文件,以免發(fā)生覆蓋丟失數(shù)據(jù),若不存在將源庫(kù)上產(chǎn)生的歸檔日志保存到備份庫(kù)的/data/pg_archive目錄下。
注意:
(a)archive_timeout強(qiáng)制N秒以后進(jìn)行一次歸檔,若設(shè)置太小,很快就會(huì)超過wal_keep_segments = 16,導(dǎo)致數(shù)據(jù)覆蓋丟失,因此不要盲目設(shè)置。
(b)歸檔模式的開啟,只有在wal_level = hot_standby或archive
4.重載源庫(kù)并查看
pg_ctl reload -D /data/pgsql/data postgres=# show archive_mode; archive_mode -------------- on (1 row)
1.查看源庫(kù)上的pg_xlog目錄
-bash-4.2$ ll pg_xlog total 16388 -rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001 drwx------. 2 postgres postgres 4096 Apr 21 13:36 archive_status
此時(shí)archive_status目錄為存放歸檔日志的狀態(tài),若歸檔已經(jīng)產(chǎn)生,但沒有傳輸成功則為xxx.ready,并且一直會(huì)保留直至傳輸成功,然后狀態(tài)變?yōu)閤xx.done;此時(shí)目錄為空
2.在源庫(kù)上添加數(shù)據(jù)
此時(shí)由于數(shù)據(jù)庫(kù)為空,我們來創(chuàng)建testdb庫(kù),并添加數(shù)據(jù)
postgres=# create database testdb; CREATE DATABASE postgres=# create table t1(id int4,create_time timestamp(0) without time zone); CREATE TABLE postgres=# insert into t1 values(1,now()); INSERT 0 1 postgres=# insert into t1 values(2,now()); INSERT 0 1 postgres=# select * from t1; id | create_time ----+--------------------- 1 | 2016-04-21 13:49:34 2 | 2016-04-21 13:49:48 (2 rows)
3.在源庫(kù)上手動(dòng)切換歸檔
postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/1821010 (1 row)
正常情況下,wal日志段在達(dá)到16M后會(huì)自動(dòng)歸檔,由于測(cè)試我們使用手動(dòng)切換歸檔。
4.查看源庫(kù)pg_xlog目錄
-bash-4.2$ ll pg_xlog/ total 16388 -rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001 drwx------. 2 postgres postgres 4096 Apr 21 13:36 archive_status -bash-4.2$ ls pg_xlog/ 000000010000000000000001 000000010000000000000002 archive_status -bash-4.2$ ls pg_xlog/archive_status/ 000000010000000000000001.ready
此時(shí)歸檔日志的狀態(tài)為ready,說明此日志沒有傳輸成功,查看日志
vim /data/pgsql/pg_log/postgresql-Thu.log ssh: connect to host 10.10.10.60 port 22: Connection timed out^M FATAL: archive command failed with exit code 255 DETAIL: The failed archive command was: ssh 10.10.10.68 test ! -f /data/pg_archive/000000010000000000000001 && scp pg_xlog/000000010000000000000001 10.10.10.60:/data/pg_archive/000000010000000000000001 LOG: archiver process (PID 22284) exited with exit code 1
原來是由于ip地址錯(cuò)誤導(dǎo)致無法通過ssh傳輸,更改ip為10.10.10.61后,再次產(chǎn)生歸檔才能再次重新傳輸。
1.手動(dòng)切換wal日志,select pg_switch_xlog()
2.wal日志寫滿后觸發(fā)歸檔,配置文件默認(rèn)達(dá)到16M后就會(huì)觸發(fā)歸檔,wal_keep_segments = 16
3.歸檔超時(shí)觸發(fā)歸檔,archive_timeout
在此我們使用的是手擋切換歸檔。
postgres=# insert into t1 values(3,now()); INSERT 0 1 postgres=# insert into t1 values(4,now()); INSERT 0 1 postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/2000310 (1 row) postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/3000000 (1 row) postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/30000D8 (1 row)
再次查看pg_xlog目錄
-bash-4.2$ ll pg_xlog/archive_status/ total 0 -rw-------. 1 postgres postgres 0 Apr 21 13:51 000000010000000000000001.done -rw-------. 1 postgres postgres 0 Apr 21 14:00 000000010000000000000002.done -rw-------. 1 postgres postgres 0 Apr 21 14:04 000000010000000000000003.done
5.查看備份庫(kù)上的歸檔目錄
-bash-4.2$ ll /data/pg_archive/ total 49152 -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000001 -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000002 -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000003
至此,歸檔備份已經(jīng)完成,下面我們要介紹利用歸檔進(jìn)行恢復(fù)。
PITR恢復(fù)是基于文件系統(tǒng)備份和wal文件的備份,因此首先我們需要個(gè)基礎(chǔ)備份,然后在此基礎(chǔ)備份上對(duì)wal歸檔日志進(jìn)行回放。具體步驟如下:
1.使用pg_basebackup進(jìn)行基礎(chǔ)備份
pg_basebackup使用replication復(fù)制協(xié)議,因此需要在源庫(kù)上配置pg_hba.conf文件以允許replication,無論是本地還是通過網(wǎng)絡(luò)。
vim pg_hba.conf #添加以下兩行,允許本地和網(wǎng)絡(luò)上的replication用于pg_basebackup host replication rep 127.0.0.1/32 md5 host replication rep 10.10.10.61/8 md5 #重載 pg_ctl reload -D /data/pgsql/data
添加完畢后請(qǐng)重載pgsql
在備份庫(kù)上執(zhí)行pg_basebackup進(jìn)行遠(yuǎn)程的基礎(chǔ)備份
-bash-4.2$ pg_basebackup -D /data/pgsql/data -Fp -Xs -v -P -h 10.10.10.61 -p 5432 -U rep Password: transaction log start point: 0/5000020 pg_basebackup: starting background WAL receiver 26664/26664 kB (100%), 1/1 tablespace transaction log end point: 0/50000E0 pg_basebackup: waiting for background process to finish streaming... pg_basebackup: base backup completed
-D 表示接受基礎(chǔ)備份的目錄,我們將基礎(chǔ)備份放到/data/pgsql/data
-X 參數(shù),在備份完成之后,會(huì)到主庫(kù)上收集 pg_basebackup 執(zhí)行期間產(chǎn)生的 WAL 日志,在 9.2 版本之后支持 -Xs 即stream 形式,這種模式不需要收集主庫(kù)的 WAL 文件,而能以 stream 復(fù)制方式直接追趕主庫(kù)。
2.修改備庫(kù)上配置文件
由于所有的配置文件是從源庫(kù)上的備份過來的,因此我們需要修改:
vim postgresql.conf 屏蔽以下兩行 #archive_mode = on #archive_command = 'ssh 192.168.3.139 test ! -f /data/pg_archive/%f && scp %p 192.168.3.139:/data/pg_archive/%f'
3.查看源庫(kù)上的時(shí)間確認(rèn)需要的恢復(fù)時(shí)間點(diǎn)
postgres=# select * from t1; id | create_time ----+--------------------- 1 | 2016-04-21 13:49:34 2 | 2016-04-21 13:49:48 3 | 2016-04-21 14:00:22 4 | 2016-04-21 14:00:25 5 | 2016-04-21 14:49:11 6 | 2016-04-21 14:49:14 7 | 2016-04-21 14:49:17 (4 rows)
由于此次基礎(chǔ)備份是在“ 4 | 2016-04-21 14:00:25”這條記錄后歸檔,而后面的5,6,7三條記錄是在基礎(chǔ)備份后生成的,因此若恢復(fù)5,6,7中的記錄需要在基礎(chǔ)備份上通過回放5,6,7的歸檔日志達(dá)到。
在此我們要將數(shù)據(jù)恢復(fù)到6這條記錄下,需要在recovery.conf中做如下設(shè)置:
cp /usr/share/pgsql/recovery.conf.sample /data/pgsql/data/recovery.conf vim recovery.conf restore_command = 'cp /data/pg_archive/%f %p' recovery_target_time = '2016-04-21 14:49:14'
**注意:**recovery.conf中standby_mode要為off,否則備份庫(kù)將會(huì)以備庫(kù)身份啟動(dòng),而不是即時(shí)恢復(fù)。
4.啟動(dòng)備份庫(kù)
備份庫(kù)啟動(dòng)過程中,會(huì)進(jìn)行PITR恢復(fù)到指定的時(shí)間點(diǎn)
pg_ctl start -D /data/pgsql/data #查看日志 vim /data/pgsql/pg_log/postgresql-Thu.log LOG: database system was interrupted; last known up at 2016-04-21 14:34:29 CST LOG: starting point-in-time recovery to 2016-04-21 14:49:14+08 LOG: restored log file "000000010000000000000005" from archive LOG: redo starts at 0/5000020 LOG: consistent recovery state reached at 0/50000E0 LOG: restored log file "000000010000000000000006" from archive LOG: recovery stopping before commit of transaction 1898, time 2016-04-21 14:49:16.635744+08 LOG: redo done at 0/6000398 LOG: last completed transaction was at log time 2016-04-21 14:49:13.786388+08 cp: cannot stat ‘/data/pg_archive/00000002.history': No such file or directory LOG: selected new timeline ID: 2 cp: cannot stat ‘/data/pg_archive/00000001.history': No such file or directory LOG: archive recovery complete LOG: autovacuum launcher started LOG: database system is ready to accept connections #查看數(shù)據(jù) postgres=# select * from t1; id | create_time ----+--------------------- 1 | 2016-04-21 13:49:34 2 | 2016-04-21 13:49:48 3 | 2016-04-21 14:00:22 4 | 2016-04-21 14:00:25 5 | 2016-04-21 14:49:11 6 | 2016-04-21 14:49:14 (6 rows)
7.查看備份庫(kù)pg_xlog
-bash-4.2$ ll pg_xlog total 49160 -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000005 -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000006 -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000020000000000000006 -rw-------. 1 postgres postgres 64 Apr 21 15:00 00000002.history drwx------. 2 postgres postgres 4096 Apr 21 15:00 archive_status -bash-4.2$ cat pg_xlog/00000002.history 1 000000010000000000000006 before 2016-04-21 14:49:16.635744+08
從pg_xlog我們看到設(shè)置好recovery.conf文件后,啟動(dòng)數(shù)據(jù)庫(kù),將會(huì)產(chǎn)生新的timeline,id=2,而且會(huì)生成一個(gè)新的history文件00000002.history,里面記錄的是新時(shí)間線2從什么時(shí)間哪個(gè)時(shí)間線什么原因分出來的,該文件可能含有多行記錄。
另外,恢復(fù)的默認(rèn)行為是沿著與當(dāng)前基本備份相同的時(shí)間線恢復(fù)。如果你想恢復(fù)到某些時(shí)間線,你需要指定的recovery.conf目標(biāo)時(shí)間線recovery_target_timeline,不能恢復(fù)到早于基本備份分支的時(shí)間點(diǎn)。
注意:如果恢復(fù)過一次,并重新設(shè)置recovery_target_time,重新啟動(dòng)觸發(fā)恢復(fù),并不會(huì)基于時(shí)間線1進(jìn)行恢復(fù),而是基于時(shí)間線2進(jìn)行恢復(fù)的,但是此時(shí)間線上在/data/pg_archive/并沒有時(shí)間線為2的歸檔日志,因此會(huì)報(bào)錯(cuò)。
補(bǔ)充:postgres修改歸檔模式
步驟一:
修改postgresql的配置文件(postgresql.conf)
wal_level=hot_standby archive_mode =on archive_command ='DATE=`date +%Y%m%d`;DIR="/home/postgres/arch/$DATE";(test -d $DIR || mkdir -p $DIR)&& cp %p $DIR/%f'
ps:%p 是指相對(duì)路徑 %f是指文件名
步驟二:創(chuàng)建歸檔路徑
mkdir -p /home/postgres/arch chown -R postgres:postgres /home/postgres/arch
步驟三:重啟數(shù)據(jù)庫(kù)
步驟四:驗(yàn)證歸檔是否正常
postgres=# checkpoint; CHECKPOINT postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 1/760000E8 (1 row) postgres@ubuntu:~$ cd /home/postgres/data/data_1999/arch/ postgres@ubuntu:~/data/data_1999/arch$ ls 20150603 postgres@ubuntu:~/data/data_1999/arch$ cd 20150603/ postgres@ubuntu:~/data/data_1999/arch/20150603$ ls 000000010000000100000074 000000010000000100000075 000000010000000100000076
關(guān)于怎么在postgresql中連續(xù)歸檔及時(shí)間點(diǎn)恢復(fù)的操作問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
新聞標(biāo)題:怎么在postgresql中連續(xù)歸檔及時(shí)間點(diǎn)恢復(fù)的操作-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://jinyejixie.com/article16/dhocdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站策劃、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容