PG 資料庫恢復實戰
早上, 同事在在做pg歸檔日誌的清理的時候,執行程式碼的當前目錄錯了,導致刪除了pg資料庫的資料檔案, 二進位制程式碼,lib 包
因為是內部使用庫,只有dba 在用,沒有做streaming 複製,只有備份,
故障發生時,資料庫沒有關閉,檔案的控制程式碼是被pg資料庫把持的,我們企圖關閉應用,從檔案控制程式碼裡把檔案恢復回去,
這是在linux 系統裡 資料庫誤刪除常用的方式,mysql oracle 都可以用,但是在pg這裡杯具了。
pg系統對檔案系統做了一層包裝,在/proc/$pid/fd 下面已經沒有實際資料檔案的連線了。
下面的是oracle 資料庫的一個例項:
[code ]
×ü?? 0
lr-x------ 1 oracle dba 64 07-30 08:05 0 -> /dev/null
lr-x------ 1 oracle dba 64 07-30 08:05 1 -> /dev/null
lr-x------ 1 oracle dba 64 07-30 08:05 10 -> /dev/zero
lr-x------ 1 oracle dba 64 07-30 08:05 11 -> /dev/zero
lr-x------ 1 oracle dba 64 07-30 08:05 12 -> /data/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 07-30 08:05 13 -> /data/oracle/product/10.2.0/dbs/hc_prework.dat
lrwx------ 1 oracle dba 64 07-30 08:05 14 -> /data/oracle/product/10.2.0/dbs/lkPREWORK
lrwx------ 1 oracle dba 64 07-30 08:05 15 -> /data1/oracle/oradata/prework/prework/control01.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 16 -> /data1/oracle/oradata/prework/prework/control02.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 17 -> /data1/oracle/oradata/prework/prework/control03.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 18 -> /data1/oracle/oradata/prework/prework/system01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 19 -> /data1/oracle/oradata/prework/prework/undotbs01.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 2 -> /dev/null
lrwx------ 1 oracle dba 64 07-30 08:05 20 -> /data1/oracle/oradata/prework/prework/sysaux01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 21 -> /data1/oracle/oradata/prework/prework/users01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 22 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 23 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA1.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 24 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA2.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 25 -> /data1/oracle/oradata/prework/prework/temp01.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 26 -> /data/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 07-30 08:05 27 -> socket:[110151746]
lr-x------ 1 oracle dba 64 07-30 08:05 3 -> /dev/null
lrwx------ 1 oracle dba 64 07-30 08:05 30 -> /data1/oracle/oradata/prework/prework/gamevideo_nw_data.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 31 -> /data1/oracle/oradata/prework/prework/ladycosme_data.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 4 -> /dev/null
l-wx------ 1 oracle dba 64 07-30 08:05 5 -> /data/oracle/admin/prework/udump/prework_ora_25692.trc
l-wx------ 1 oracle dba 64 07-30 08:05 6 -> /data/oracle/admin/prework/bdump/alert_prework.log
lrwx------ 1 oracle dba 64 07-30 08:05 7 -> /data/oracle/product/10.2.0/dbs/lkinstprework (deleted)
l-wx------ 1 oracle dba 64 07-30 08:05 8 -> /data/oracle/admin/prework/bdump/alert_prework.log
lrwx------ 1 oracle dba 64 07-30 08:05 9 -> /data/oracle/product/10.2.0/dbs/hc_prework.dat
[/code]
只能走資料恢復的路子了。
資料量不很大,幾百M ,
把 最新的備份copy 回去
修改recovery.conf
修改restore_command
[code]
recovery_target_timeline = 'latest'
restore_command = 'cp /usr/local/pgsql/archive/%f %p'
[/code]
啟動資料庫[code]
2012-07-30 10:01:16 CSTLOG: starting archive recovery
2012-07-30 10:01:16 CSTLOG: restored log file "000000010000002B00000028" from archive
2012-07-30 10:01:17 CSTLOG: redo starts at 2B/28000078
2012-07-30 10:01:17 CSTLOG: consistent recovery state reached at 2B/29000000
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000029" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002A" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002B" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002C" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002D" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002E" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002F" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000030" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000031" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000032" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000033" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000034" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000035" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000036" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000037" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000038" from archive
2012-07-30 10:01:18 CSTLOG: restored log file "000000010000002B00000039" from archive
cp: cannot stat `/usr/local/pgsql/archive/000000010000002B0000003A': No such file or directory
2012-07-30 10:01:18 CSTLOG: unexpected pageaddr 2B/32000000 in log file 43, segment 58, offset 0
2012-07-30 10:01:18 CSTLOG: redo done at 2B/39000078
2012-07-30 10:01:18 CSTLOG: last completed transaction was at log time 2012-07-30 08:55:27.661619+08
2012-07-30 10:01:18 CSTLOG: restored log file "000000010000002B00000039" from archive
cp: cannot stat `/usr/local/pgsql/archive/00000002.history': No such file or directory
2012-07-30 10:01:18 CSTLOG: selected new timeline ID: 2
cp: cannot stat `/usr/local/pgsql/archive/00000001.history': No such file or directory
2012-07-30 10:01:18 CSTLOG: archive recovery complete
2012-07-30 10:01:18 CSTLOG: autovacuum launcher started
2012-07-30 10:01:18 CSTLOG: database system is ready to accept connections
[/code]登入資料庫檢查ok
恢復完畢 。
總結: DBA 的工作是個細活, 一般情況下是容不得做錯了重來的。
務必謹慎為之!!
因為是內部使用庫,只有dba 在用,沒有做streaming 複製,只有備份,
故障發生時,資料庫沒有關閉,檔案的控制程式碼是被pg資料庫把持的,我們企圖關閉應用,從檔案控制程式碼裡把檔案恢復回去,
這是在linux 系統裡 資料庫誤刪除常用的方式,mysql oracle 都可以用,但是在pg這裡杯具了。
pg系統對檔案系統做了一層包裝,在/proc/$pid/fd 下面已經沒有實際資料檔案的連線了。
下面的是oracle 資料庫的一個例項:
[code ]
×ü?? 0
lr-x------ 1 oracle dba 64 07-30 08:05 0 -> /dev/null
lr-x------ 1 oracle dba 64 07-30 08:05 1 -> /dev/null
lr-x------ 1 oracle dba 64 07-30 08:05 10 -> /dev/zero
lr-x------ 1 oracle dba 64 07-30 08:05 11 -> /dev/zero
lr-x------ 1 oracle dba 64 07-30 08:05 12 -> /data/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 07-30 08:05 13 -> /data/oracle/product/10.2.0/dbs/hc_prework.dat
lrwx------ 1 oracle dba 64 07-30 08:05 14 -> /data/oracle/product/10.2.0/dbs/lkPREWORK
lrwx------ 1 oracle dba 64 07-30 08:05 15 -> /data1/oracle/oradata/prework/prework/control01.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 16 -> /data1/oracle/oradata/prework/prework/control02.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 17 -> /data1/oracle/oradata/prework/prework/control03.ctl
lrwx------ 1 oracle dba 64 07-30 08:05 18 -> /data1/oracle/oradata/prework/prework/system01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 19 -> /data1/oracle/oradata/prework/prework/undotbs01.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 2 -> /dev/null
lrwx------ 1 oracle dba 64 07-30 08:05 20 -> /data1/oracle/oradata/prework/prework/sysaux01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 21 -> /data1/oracle/oradata/prework/prework/users01.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 22 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 23 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA1.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 24 -> /data1/oracle/oradata/prework/prework/AUTOBLOG_NEW_DATA2.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 25 -> /data1/oracle/oradata/prework/prework/temp01.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 26 -> /data/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 07-30 08:05 27 -> socket:[110151746]
lr-x------ 1 oracle dba 64 07-30 08:05 3 -> /dev/null
lrwx------ 1 oracle dba 64 07-30 08:05 30 -> /data1/oracle/oradata/prework/prework/gamevideo_nw_data.dbf
lrwx------ 1 oracle dba 64 07-30 08:05 31 -> /data1/oracle/oradata/prework/prework/ladycosme_data.dbf
lr-x------ 1 oracle dba 64 07-30 08:05 4 -> /dev/null
l-wx------ 1 oracle dba 64 07-30 08:05 5 -> /data/oracle/admin/prework/udump/prework_ora_25692.trc
l-wx------ 1 oracle dba 64 07-30 08:05 6 -> /data/oracle/admin/prework/bdump/alert_prework.log
lrwx------ 1 oracle dba 64 07-30 08:05 7 -> /data/oracle/product/10.2.0/dbs/lkinstprework (deleted)
l-wx------ 1 oracle dba 64 07-30 08:05 8 -> /data/oracle/admin/prework/bdump/alert_prework.log
lrwx------ 1 oracle dba 64 07-30 08:05 9 -> /data/oracle/product/10.2.0/dbs/hc_prework.dat
[/code]
只能走資料恢復的路子了。
資料量不很大,幾百M ,
把 最新的備份copy 回去
修改recovery.conf
修改restore_command
[code]
recovery_target_timeline = 'latest'
restore_command = 'cp /usr/local/pgsql/archive/%f %p'
[/code]
啟動資料庫[code]
2012-07-30 10:01:16 CSTLOG: starting archive recovery
2012-07-30 10:01:16 CSTLOG: restored log file "000000010000002B00000028" from archive
2012-07-30 10:01:17 CSTLOG: redo starts at 2B/28000078
2012-07-30 10:01:17 CSTLOG: consistent recovery state reached at 2B/29000000
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000029" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002A" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002B" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002C" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002D" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002E" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B0000002F" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000030" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000031" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000032" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000033" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000034" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000035" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000036" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000037" from archive
2012-07-30 10:01:17 CSTLOG: restored log file "000000010000002B00000038" from archive
2012-07-30 10:01:18 CSTLOG: restored log file "000000010000002B00000039" from archive
cp: cannot stat `/usr/local/pgsql/archive/000000010000002B0000003A': No such file or directory
2012-07-30 10:01:18 CSTLOG: unexpected pageaddr 2B/32000000 in log file 43, segment 58, offset 0
2012-07-30 10:01:18 CSTLOG: redo done at 2B/39000078
2012-07-30 10:01:18 CSTLOG: last completed transaction was at log time 2012-07-30 08:55:27.661619+08
2012-07-30 10:01:18 CSTLOG: restored log file "000000010000002B00000039" from archive
cp: cannot stat `/usr/local/pgsql/archive/00000002.history': No such file or directory
2012-07-30 10:01:18 CSTLOG: selected new timeline ID: 2
cp: cannot stat `/usr/local/pgsql/archive/00000001.history': No such file or directory
2012-07-30 10:01:18 CSTLOG: archive recovery complete
2012-07-30 10:01:18 CSTLOG: autovacuum launcher started
2012-07-30 10:01:18 CSTLOG: database system is ready to accept connections
[/code]登入資料庫檢查ok
恢復完畢 。
總結: DBA 的工作是個細活, 一般情況下是容不得做錯了重來的。
務必謹慎為之!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-738611/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pg_dump 備份,恢復資料庫資料庫
- pg_resetwal pg_resetxlog 重整 pg資料庫 wal 與pg_controldata 。 資料庫恢復。資料庫LDA
- postgresql 使用pg_rman恢復還原資料庫SQL資料庫
- NoSQL 資料庫案例實戰 -- MongoDB資料備份、恢復SQL資料庫MongoDB
- 【資料庫資料恢復】SAP資料庫資料恢復案例資料庫資料恢復
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- 【資料庫資料恢復】Sql Server資料庫資料恢復案例資料庫資料恢復SQLServer
- oracle 資料庫全庫恢復實驗Oracle資料庫
- 資料庫修復資料恢復資料庫資料恢復
- 恢復資料庫資料庫
- 【資料庫資料恢復】透過恢復NDF檔案修復資料庫的資料恢復過程資料庫資料恢復
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- 【資料庫資料恢復】windows server下SqlServer資料庫的資料恢復資料庫資料恢復WindowsServerSQL
- PG 資料庫的 表的不完全恢復的簡易方法資料庫
- 使用恢復建議恢復資料庫資料庫
- 【資料庫資料恢復】Oracle資料庫誤truncate table的資料恢復案例資料庫資料恢復Oracle
- 【資料庫資料恢復】oracle資料庫誤truncate table怎麼恢復資料?資料庫資料恢復Oracle
- 【資料庫資料恢復】誤truncate table的Oracle資料庫資料恢復方案資料庫資料恢復Oracle
- 伺服器資料恢復—透過拼接資料庫碎片恢復SqlServer資料庫資料的資料恢復案例伺服器資料恢復資料庫SQLServer
- 【資料庫資料恢復】MS SQL資料庫附加資料庫出錯怎麼恢復資料?資料庫資料恢復SQL
- 資料庫恢復方案資料庫
- RMAN恢復資料庫資料庫
- sybase資料庫恢復資料庫
- 【資料庫資料恢復】SqlServer資料庫無法讀取的資料恢復案例資料庫資料恢復SQLServer
- 資料庫資料恢復—NTFS分割槽損壞如何恢復SqlServer資料庫資料資料庫資料恢復SQLServer
- 【資料庫資料恢復】sql server資料庫連線失效的資料恢復案例資料庫資料恢復SQLServer
- 【資料庫資料恢復】linux系統下MYSQL資料庫資料恢復案例資料庫資料恢復LinuxMySql
- 【資料庫資料恢復】MongoDB資料庫檔案損壞的資料恢復案例資料庫資料恢復MongoDB
- 【資料庫資料恢復】Oracle資料庫ASM磁碟組掉線如何恢復資料?資料庫資料恢復OracleASM
- Sybase ASE資料庫恢復,Sybase資料恢復,資料誤刪除恢復工具READSYBDEVICE資料庫資料恢復dev
- 【資料庫資料恢復】SQL server資料庫被加密怎麼辦?如何恢復?資料庫資料恢復SQLServer加密
- 【資料庫資料恢復】ASM磁碟組掉線的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- 【資料庫資料恢復】SQL Server資料庫磁碟空間不足的資料恢復案例資料庫資料恢復SQLServer
- 資料庫資料恢復—SQLserver資料庫中勒索病毒被加密怎麼恢復資料?資料庫資料恢復SQLServer加密
- 【資料庫資料恢復】透過資料頁恢復Sql Server資料庫資料的過程資料庫資料恢復SQLServer
- PG備份恢復工具pg_probackup
- 資料庫資料恢復-oracle資料庫報錯無法開啟的如何恢復資料?資料庫資料恢復Oracle
- 資料庫資料恢復-SQL SERVER資料庫MDF (NDF)或LDF損壞如何恢復資料?資料庫資料恢復SQLServer