溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

從Oracle到PostgreSQL:最全控制文件

發(fā)布時(shí)間:2020-08-11 09:50:31 來(lái)源:ITPUB博客 閱讀:238 作者:云和恩墨 欄目:數(shù)據(jù)庫(kù)

原文:

從Oracle到PostgreSQL:最全控制文件(上) https://www.enmotech.com/web/detail/1/770/1.html

從Oracle到PostgreSQL:最全控制文件(下) https://www.enmotech.com/web/detail/1/771/1.html

導(dǎo)讀:本文介紹了Oracle和PostgreSQL控制文件基本內(nèi)容,對(duì)如何重建PostgreSQL控制文件進(jìn)行了詳細(xì)描述并進(jìn)行了恢復(fù)測(cè)試。

控制文件內(nèi)容


Oracle控制文件內(nèi)容

從官方文檔上可以知道控制文件保存著下列信息:

  • 數(shù)據(jù)庫(kù)名以及數(shù)據(jù)創(chuàng)建時(shí)間等
  • 相關(guān)數(shù)據(jù)文件和重做日志文件的名稱和位置
  • 表空間信息
  • 重做日志線程、文件信息
  • 備份集及備份文件信息
  • 檢查點(diǎn)及SCN信息等
  • 12c增加了PDB的信息

由于控制文件是個(gè)二進(jìn)制文件,無(wú)法直接打開(kāi)查閱,可以將控制文件內(nèi)容轉(zhuǎn)儲(chǔ)出來(lái)便于查看,可以使用以下命令來(lái)做轉(zhuǎn)存。

SQL> alter session set events 'immediate trace name controlf level 8';Session altered.SQL> select value from v$diag_info where name='Default Trace File';VALUE--------------------------------------------------------------------------------/u01/app/oracle/diag/rdbms/rac12201/RAC122011/trace/RAC122011_ora_24813.trc

注意,從11g開(kāi)始可以通過(guò)v$diag_info獲得當(dāng)前會(huì)話轉(zhuǎn)儲(chǔ)文件的名稱。

打開(kāi)跟蹤文件可以清晰的看到控制文件的內(nèi)容,最開(kāi)始的一段是關(guān)于數(shù)據(jù)庫(kù)ID、名稱等的概要信息:

Trace file /u01/app/oracle/diag/rdbms/rac12201/RAC122011/trace/RAC122011_ora_24813.trcOracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionBuild label: RDBMS_12.2.0.1.0_LINUX.X64_170125ORACLE_HOME: /u01/app/oracle/product/12.2.0.1/dbhome_1System name: LinuxNode name: ractest1Release: 2.6.32-431.el6.x86_64Version: #1 SMP Sun Nov 10 22:19:54 EST 2013Machine: x86_64Instance name: RAC122011Redo thread mounted by this instance: 1Oracle process number: 96Unix process pid: 24813, image: oracle@ractest1 (TNS V1-V3)*** 2019-05-30T09:15:38.980823+08:00 (CDB$ROOT(1))*** SESSION ID:(59.49876) 2019-05-30T09:15:38.980878+08:00*** CLIENT ID:() 2019-05-30T09:15:38.980885+08:00*** SERVICE NAME:(SYS$USERS) 2019-05-30T09:15:38.980891+08:00*** MODULE NAME:(sqlplus@ractest1 (TNS V1-V3)) 2019-05-30T09:15:38.980897+08:00*** ACTION NAME:() 2019-05-30T09:15:38.980903+08:00*** CLIENT DRIVER:(SQL*PLUS) 2019-05-30T09:15:38.980908+08:00*** CONTAINER ID:(1) 2019-05-30T09:15:38.980914+08:00DUMP OF CONTROL FILES, Seq # 233771 = 0x3912bV10 STYLE FILE HEADER: Compatibility Vsn = 203424000=0xc200100 Db ID=1217928546=0x48981d62, Db Name='RAC12201' Activation ID=0=0x0 Control Seq=233771=0x3912b, File size=1216=0x4c0 File Number=0, Blksiz=16384, File Type=1 CONTROL

接下來(lái)是數(shù)據(jù)條目的詳細(xì)信息,包括了數(shù)據(jù)的名稱、數(shù)據(jù)文件及日志文件的數(shù)量、數(shù)據(jù)庫(kù)的檢查點(diǎn)及SCN信息等:

***************************************************************************DATABASE ENTRY***************************************************************************(size = 316, compat size = 316, section max = 1, section in-use = 1, last-recid= 0, old-recno = 0, last-recno = 0)(extent = 1, blkno = 1, numrecs = 1)03/31/2019 23:47:46DB Name "RAC12201"Database flags = 0x10406001 0x00001200 0x00000082Controlfile Creation Timestamp 03/31/2019 23:47:47Incmplt recovery scn: 0x0000000000000000Resetlogs scn: 0x0000000000157e2e Resetlogs Timestamp 03/31/2019 23:47:49Prior resetlogs scn: 0x0000000000000001 Prior resetlogs Timestamp 01/26/2017 13:52:29Redo Version: compatible=0xc200100#Data files = 28, #Online files = 25Database checkpoint: Thread=1 scn: 0x0000000002a1699eThreads: #Enabled=2, #Open=2, Head=1, Tail=2enabled threads: 01100000 00000000 00000000 00000000 00000000 00000000.......Max log members = 3, Max data members = 1Arch list: Head=1, Tail=9, Force scn: 0x00000000029c57a6scn: 0x0000000000000000Activation ID: 1217928802Snapshot Controlfile filename name #31: +DATA/snapcf_rac12201.fSnapshot Controlfile checkpoint scn: 0x00000000026d24dd 05/25/2019 22:40:30SCN compatibility 1Auto-rollover enabledControlfile Checkpointed at scn: 0x0000000002a231ff 05/30/2019 09:15:32thread:0 rba:(0x0.0.0)enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000.......

再接下來(lái)是檢查點(diǎn)記錄信息,這部分內(nèi)容包含了Low Cache RBA 和 On Disk RBA信息,在執(zhí)行數(shù)據(jù)庫(kù)實(shí)例恢復(fù)時(shí),前者是恢復(fù)的起點(diǎn),后者是恢復(fù)的終點(diǎn),其分別指向了日志文件中的確定地址:

***************************************************************************CHECKPOINT PROGRESS RECORDS***************************************************************************(size = 8180, compat size = 8180, section max = 35, section in-use = 0, last-recid= 0, old-recno = 0, last-recno = 0)(extent = 1, blkno = 2, numrecs = 35)THREAD #1 - status:0x2 flags:0x0 dirty:54low cache rba:(0x13c.ec78.0) on disk rba:(0x13c.edda.0)on disk scn: 0x0000000002a232bc 05/30/2019 09:15:37resetlogs scn: 0x0000000000157e2e 03/31/2019 23:47:49heartbeat: 1009031373 mount id: 1222276307

控制文件還有跟多其它記錄,大家可以轉(zhuǎn)儲(chǔ)出來(lái)仔細(xì)閱讀接下來(lái)的每個(gè)條目。

接下來(lái)我們看看PostgreSQL控制文件都記錄了什么。

PostgreSQL控制文件內(nèi)容

相比Oracle的控制文件,PostgreSQL控制文件內(nèi)容就少了很多,主要分為是三部分,初始化靜態(tài)信息、WAL及檢查點(diǎn)的動(dòng)態(tài)信息、一些配置信息。

我們可以用過(guò)pg_controldata命令直接讀取PostgreSQL控制文件內(nèi)容:

[postgres@lsl-test1 ~]$ /usr/pgsql-11/bin/pg_controldata -D /pg/pg11/datapg_control version number: 1100Catalog version number: 201809051Database system identifier: 6691945724594983959Database cluster state: in productionpg_control last modified: Thu 30 May 2019 03:20:03 PM CSTLatest checkpoint location: 0/60001E8Latest checkpoint's REDO location: 0/60001E8Latest checkpoint's REDO WAL file: 000000010000000000000006Latest checkpoint's TimeLineID: 1Latest checkpoint's PrevTimeLineID: 1Latest checkpoint's full_page_writes: onLatest checkpoint's NextXID: 0:1048576Latest checkpoint's NextOID: 10000Latest checkpoint's NextMultiXactId: 65536Latest checkpoint's NextMultiOffset: 52352Latest checkpoint's oldestXID: 2296015872Latest checkpoint's oldestXID's DB: 0Latest checkpoint's oldestActiveXID: 0Latest checkpoint's oldestMultiXid: 65536Latest checkpoint's oldestMulti's DB: 0Latest checkpoint's oldestCommitTsXid:0Latest checkpoint's newestCommitTsXid:0Time of latest checkpoint: Thu 30 May 2019 03:20:03 PM CSTFake LSN counter for unlogged rels: 0/1Minimum recovery ending location: 0/0Min recovery ending loc's timeline: 0Backup start location: 0/0Backup end location: 0/0End-of-backup record required: nowal_level setting: replicawal_log_hints setting: offmax_connections setting: 100max_worker_processes setting: 8max_prepared_xacts setting: 0max_locks_per_xact setting: 64track_commit_timestamp setting: offMaximum data alignment: 8Database block size: 8192Blocks per segment of large relation: 131072WAL block size: 8192Bytes per WAL segment: 16777216Maximum length of identifiers: 64Maximum columns in an index: 32Maximum size of a TOAST chunk: 1996Size of a large-object chunk: 2048Date/time type storage: 64-bit integersFloat4 argument passing: by valueFloat8 argument passing: by valueData page checksum version: 0Mock authentication nonce: 0000000000000000000000000000000000000000000000000000000000000000

下面詳細(xì)介紹下各參數(shù)含義。

  • pg_control version number是控制文件版本號(hào)。
  • Catalog version number 是系統(tǒng)表版本號(hào),格式是yyyymmddN。記錄系統(tǒng)不兼容性的改變。N是yyymmdd當(dāng)天改變的次數(shù)。具體可以查看源碼文件catversion.h。
  • Database system identifier 數(shù)據(jù)庫(kù)系統(tǒng)號(hào) 這個(gè)標(biāo)識(shí)串是一個(gè)64bit的整數(shù),其中包含了創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)間戳和initdb時(shí)初始化的進(jìn)程號(hào),具體初始化方法可查看源碼文件xlog.c。

創(chuàng)建時(shí)間可以通過(guò)to_timestamp轉(zhuǎn)換查看到。

創(chuàng)建時(shí)間可以通過(guò)to_timestamp轉(zhuǎn)換查看到。postgres=# SELECT to_timestamp(((6691945724594983959>>32) & (2^32 -1)::bigint)); to_timestamp ------------------------2019-05-17 18:47:10+08(1 row)

Database cluster state 記錄實(shí)例的狀態(tài)。源碼文件中看到數(shù)據(jù)庫(kù)的幾種狀態(tài),源碼pg_control.h中可以看到:

starting up:表示數(shù)據(jù)庫(kù)正在啟動(dòng)狀態(tài)。shut down: 數(shù)據(jù)庫(kù)實(shí)例(非Standby)正常關(guān)閉后控制文件中就是此狀態(tài)。shut down in recovery:Standby實(shí)例正常關(guān)閉后控制文件中就是此狀態(tài)。shutting down:正常停庫(kù)時(shí),先做checkpoint,開(kāi)始做checkpoint時(shí),會(huì)把狀態(tài)設(shè)置為此狀態(tài),做完后把狀態(tài)設(shè)置為shut down。in crash recovery:數(shù)據(jù)庫(kù)實(shí)例非異常停止后,重新啟動(dòng)后,會(huì)先進(jìn)行實(shí)例的恢復(fù),在實(shí)例恢復(fù)時(shí)的狀態(tài)就是此狀態(tài)。in archive recovery:Standby實(shí)例正常啟動(dòng)后,就是此狀態(tài)。in production:數(shù)據(jù)庫(kù)實(shí)例正常啟動(dòng)后就是此狀態(tài)。Standby數(shù)據(jù)庫(kù)正常啟動(dòng)后不是此狀態(tài)
  • Latest checkpoint location數(shù)據(jù)庫(kù)異常停止后再重新啟動(dòng)時(shí),需要做實(shí)例恢復(fù),實(shí)例恢復(fù)的過(guò)程是從WAL日志中,找到最后一次的checkpoint點(diǎn),然后讀取這個(gè)點(diǎn)之后的WAL日志,重新應(yīng)用這些日志,此過(guò)程稱為數(shù)據(jù)庫(kù)實(shí)例前滾,最后一次的checkpoint點(diǎn)的信息記錄在Latest checkpont項(xiàng)中。
  • Latest checkpoint's REDO location 記錄數(shù)據(jù)庫(kù)日志文件上檢查點(diǎn)。
  • Latest checkpoint's REDO WAL file記錄WAL日志名,目錄下pg_wal可以查到文件。
  • Latest checkpoint's NextXID前面是新紀(jì)元值,冒號(hào)后面是下一個(gè)事務(wù)號(hào),當(dāng)前事務(wù)號(hào)最大值安全值可以在pg_xact目錄下通過(guò)文件名計(jì)算出來(lái)。
  • Latest checkpoint's NextMultiXactId參數(shù),可以通過(guò)pg_multixact/offsets文件名計(jì)算出來(lái)安全值。
  • Latest checkpoint's NextMultiOffset參數(shù),當(dāng)恢復(fù)控制文件時(shí)可以通過(guò)pg_multixact/members文件夾下計(jì)算出此參數(shù)的安全值。
  • Maximum length of identifiers是指一些數(shù)據(jù)庫(kù)對(duì)象名稱的最大長(zhǎng)度,如表名、索引名的最大長(zhǎng)度 Maximum columns in an index 表示一個(gè)索引最多多少列,目前為32個(gè)。
  • Maximum size of a TOAST chunk是TOAST chunk的最大長(zhǎng)度。TOAST是解決當(dāng)列的內(nèi)容太長(zhǎng),在一個(gè)數(shù)據(jù)塊中存不下時(shí)的一種行外存儲(chǔ)的方式。類似Oracle的行鏈接。
  • Data page checksum version是數(shù)據(jù)塊checksum的版本,默認(rèn)為0,數(shù)據(jù)塊沒(méi)有使用checksum。運(yùn)行initdb時(shí)加了-k參數(shù),PG才會(huì)在數(shù)據(jù)塊上啟用checksum功能。
  • 參數(shù)介紹到這里,控制文件各內(nèi)容定義可以查看源文件pg_control.h。

重建控制文件


如果控制文件損壞或丟失,數(shù)據(jù)庫(kù)將運(yùn)行異常,也無(wú)法啟動(dòng)。對(duì)于Oracle和PostgreSQL 控制文件同樣重要。

Oracle控制文件重建

對(duì)于Oracle來(lái)說(shuō),當(dāng)控制文件損壞無(wú)備份的情況下,可以通過(guò)手工重建控制文件的方法來(lái)恢復(fù)控制文件。

具體命令如下圖:



從Oracle到PostgreSQL:最全控制文件

詳細(xì)信息可以查看官方文檔:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/CREATE-CONTROLFILE.html#GUID-9B389F28-C4D0-405D-BFE6-48237E8BD791https://docs.oracle.com/en/database/oracle/oracle-database/12.2/admin/managing-control-files.html#GUID-98A05D29-DD80-4D87-9615-76CBCF8FE694

PostgreSQL控制文件重建

pg9.6前使用 pg_resetxlog,pg10之后使用pg_resetwal清理wal日志或重置控制文件中一些控制信息。

命令詳細(xì)介紹可以查看官方文檔:

https://www.postgresql.org/docs/11/app-pgresetwal.html

[postgres@lsl-test1 ~]$ /usr/pgsql-11/bin/pg_resetwal -n -D /pg/pg11/datapg_resetwal: lock file "postmaster.pid" existsIs a server running? If not, delete the lock file and try again.[postgres@lsl-test1 ~]$ ./pg_resetwal --helppg_resetwal resets the PostgreSQL write-ahead log.Usage: pg_resetwal [OPTION]... DATADIROptions: -c, --commit-timestamp-ids=XID,XID set oldest and newest transactions bearing commit timestamp (zero means no change)[-D, --pgdata=]DATADIR data directory -e, --epoch=XIDEPOCH set next transaction ID epoch -f, --force force update to be done -l, --next-wal-file=WALFILE set minimum starting location for new WAL -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID -n, --dry-run no update, just show what would be done -o, --next-oid=OID set next OID -O, --multixact-offset=OFFSET set next multitransaction offset -V, --version output version information, then exit -x, --next-transaction-id=XID set next transaction ID --wal-segsize=SIZE size of WAL segments, in megabytes -?, --help show this help, then exit

下面看下命令各個(gè)參數(shù)具體含義:

-c參數(shù)有兩個(gè)參數(shù)值,一個(gè)最舊的事務(wù)號(hào),一個(gè)最新的事務(wù)號(hào)。最舊的事務(wù)號(hào)的安全值,可以在pg_commit_ts目錄查詢最小的文件名;最新事務(wù)ID的安全值,可以在pg_commit_ts目錄查詢最大的文件名。文件名都是16進(jìn)制。實(shí)際測(cè)試在11的版本pg_commit_ts目錄下未發(fā)現(xiàn)文件。

[postgres@lsl-test1 data]$ cd pg_commit_ts/[postgres@lsl-test1 pg_commit_ts]$ ls -ltotal 0

-e參數(shù)是設(shè)置事務(wù)號(hào)的新紀(jì)元(epoch),除了pg_resetwal設(shè)置的字段之外,事務(wù)ID新紀(jì)元實(shí)際上并不存儲(chǔ)在數(shù)據(jù)庫(kù)的任何位置。您可能需要調(diào)整此值,以確保Slony或者Skytools等復(fù)制系統(tǒng)能夠正確工作。如果是這樣的話,應(yīng)該可以從下游復(fù)制數(shù)據(jù)庫(kù)的狀態(tài)獲得適當(dāng)?shù)闹怠?

-l 參數(shù)通過(guò)指定下一個(gè)WAL段文件的名稱,手動(dòng)設(shè)置WAL啟動(dòng)位置。該選項(xiàng)使用WAL文件名,而不是LSN。下一個(gè)段的名字應(yīng)該大于當(dāng)前存在pg_wal目錄下的任何WAL段文件名。

[postgres@lsl-test1 pg_commit_ts]$ cd ../pg_wal/[postgres@lsl-test1 pg_wal]$ ls -ltotal 32768-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000007-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000008drwx------. 2 postgres postgres 6 May 17 17:22 archive_status

這些名稱也是十六進(jìn)制的,文件名包含三部分 ,第一部分時(shí)間線號(hào)(timeline ID) ,第二部分邏輯日志號(hào) ,第三部分日志段號(hào)。

-m參數(shù)也是兩個(gè)值,一個(gè)是下一個(gè)多事務(wù)號(hào),一個(gè)是最舊的多事務(wù)號(hào)。

下一個(gè)多事務(wù)號(hào)的安全值,可以在目錄pg_multixact/offsets查找數(shù)值最大的文件名,加1然后乘以65536(0x10000)。

最舊的多事務(wù)號(hào)的安全值可以通過(guò)查詢目錄下數(shù)值最小的文件名乘以65536。文件名都是十六進(jìn)制。

[postgres@lsl-test1 pg_wal]$ cd ../pg_multixact/offsets/[postgres@lsl-test1 offsets]$ ls -ltotal 8-rwx------. 1 postgres postgres 8192 May 17 18:04 0000

-o參數(shù)是設(shè)置下一個(gè)OID(OID,object 是pg內(nèi)部使用,作為系統(tǒng)表的主鍵),我們恢復(fù)時(shí)可以不設(shè)置這個(gè)參數(shù),因?yàn)樵O(shè)置一個(gè)超過(guò)數(shù)據(jù)庫(kù)中最大值OID沒(méi)有好的辦法。

-O參數(shù)是設(shè)置下一個(gè)多事務(wù)偏移量。查找pg_multixact/members目錄下數(shù)值最大的文件名,+1乘以52352 (0xCC80),可以計(jì)算出偏移量的安全值。目錄下文件的文件名也是十六進(jìn)制的。

[postgres@lsl-test1 offsets]$ ls -l ../members/total 8-rwx------. 1 postgres postgres 8192 May 17 17:22 0000

--wal-segsize參數(shù)設(shè)置新的WAL段大小 。

-x參數(shù)是手工設(shè)置下一個(gè)事務(wù)ID,pg_xact目錄下可以查看數(shù)值最大的文件名,+1乘以 1048576 (0x100000),獲取安全值。文件名也是十六進(jìn)制。

[postgres@lsl-test1 offsets]$ ls -l ../../pg_xact/total 16-rwx------. 1 postgres postgres 8192 May 17 18:04 0000-rw-------. 1 postgres postgres 8192 May 30 17:26 0001

PostgreSQL控制文件恢復(fù)測(cè)試

測(cè)試過(guò)程如下(基于PostgreSQL 11.2) :

1. 新建測(cè)試數(shù)據(jù), 用到with oids的表, 因?yàn)镺ID無(wú)法確定, 看看是否會(huì)有異常

postgres=# create table lsl_oid1(id int primary key) with oids; CREATE TABLEpostgres=# insert into lsl_oid1 select generate_series(1,100000);INSERT 0 100000postgres=# select min(oid),max(oid) from lsl_oid1 ; min | max -------+--------16400 | 116399(1 row)

2. 關(guān)閉數(shù)據(jù),記錄下控制文件信息

[postgres@lsl-test1 bin]$ /usr/pgsql-11/bin/pg_ctl stop -D /pg/pg11/datawaiting for server to shut down.... doneserver stopped

## 記下pg_controldata信息, 方便修復(fù)后進(jìn)行比對(duì)

[postgres@lsl-test1 bin]$ /usr/pgsql-11/bin/pg_controldata -D /pg/pg11/datapg_control version number: 1100Catalog version number: 201809051Database system identifier: 6691945724594983959Database cluster state: shut downpg_control last modified: Thu 30 May 2019 05:26:41 PM CSTLatest checkpoint location: 0/79E9888Latest checkpoint's REDO location: 0/79E9888Latest checkpoint's REDO WAL file: 000000010000000000000007Latest checkpoint's TimeLineID: 1Latest checkpoint's PrevTimeLineID: 1Latest checkpoint's full_page_writes: onLatest checkpoint's NextXID: 0:1048585Latest checkpoint's NextOID: 116400Latest checkpoint's NextMultiXactId: 65536Latest checkpoint's NextMultiOffset: 52352Latest checkpoint's oldestXID: 561Latest checkpoint's oldestXID's DB: 13878Latest checkpoint's oldestActiveXID: 0Latest checkpoint's oldestMultiXid: 1Latest checkpoint's oldestMulti's DB: 13878Latest checkpoint's oldestCommitTsXid:0Latest checkpoint's newestCommitTsXid:0Time of latest checkpoint: Thu 30 May 2019 05:26:40 PM CSTFake LSN counter for unlogged rels: 0/1Minimum recovery ending location: 0/0Min recovery ending loc's timeline: 0Backup start location: 0/0Backup end location: 0/0End-of-backup record required: nowal_level setting: replicawal_log_hints setting: offmax_connections setting: 100max_worker_processes setting: 8max_prepared_xacts setting: 0max_locks_per_xact setting: 64track_commit_timestamp setting: offMaximum data alignment: 8Database block size: 8192Blocks per segment of large relation: 131072WAL block size: 8192Bytes per WAL segment: 16777216Maximum length of identifiers: 64Maximum columns in an index: 32Maximum size of a TOAST chunk: 1996Size of a large-object chunk: 2048Date/time type storage: 64-bit integersFloat4 argument passing: by valueFloat8 argument passing: by valueData page checksum version: 0Mock authentication nonce: 0000000000000000000000000000000000000000000000000000000000000000

3. 模擬控制文件故障,直接刪除控制文件

[postgres@lsl-test1 global]$ pwd/pg/pg11/data/global[postgres@lsl-test1 global]$ rm -rf pg_control

4. 啟動(dòng)數(shù)據(jù)庫(kù),模擬控制文件丟失場(chǎng)景

[postgres@lsl-test1 global]$ /usr/pgsql-11/bin/pg_ctl startwaiting for server to start....postgres: could not find the database systemExpected to find it in the directory "/pg/pg11/data",but could not open file "/pg/pg11/data/global/pg_control": No such file or directorystopped waitingpg_ctl: could not start serverExamine the log output.

下面開(kāi)始正式重建控制文件,使得數(shù)據(jù)庫(kù)可以正常啟動(dòng)。

5. 首先創(chuàng)建一個(gè)名為pg_control的空文件

[postgres@lsl-test1 global]$ touch $PGDATA/global/pg_control

6. 使用pg_resetwal修復(fù)pg_control

確認(rèn)pg_resetwal參數(shù)值。

首先確認(rèn)-c參數(shù),上面參數(shù)詳細(xì)分析發(fā)現(xiàn)目錄下為空,因此暫時(shí)忽略此參數(shù)。

-e參數(shù)是設(shè)置下一個(gè)事務(wù)號(hào)的新紀(jì)元,我們測(cè)試環(huán)境沒(méi)有其它復(fù)制系統(tǒng)因此也可以忽略。

-l參數(shù),查看pg_wal下文件文件名,大于文件名最大值即可。


[postgres@lsl-test1 ~]$ cd /pg/pg11/data/pg_wal[postgres@lsl-test1 pg_wal]$ ls -ltotal 32768-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000007-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000008drwx------. 2 postgres postgres 6 May 17 17:22 archive_status之類要大于最大值,因此我們可以去-l=000000010000000000000009-m參數(shù)取pg_multixact/offsets目錄下最大值加1然后乘以65536(0x10000)和最小值 乘以65536(0x10000)[postgres@lsl-test1 pg_commit_ts]$ cd ../pg_multixact/offsets/[postgres@lsl-test1 offsets]$ ls -ltotal 8-rwx------. 1 postgres postgres 8192 May 17 18:04 0000

因此-m可以取0x10000,0x00000。

-o參數(shù)不確定時(shí),由于測(cè)試沒(méi)有復(fù)制軟件因此可以暫時(shí)忽略。

-O 查找pg_multixact/members目錄下數(shù)值最大的文件名,+1乘以52352 (0xCC80)。

[postgres@lsl-test1 offsets]$ cd ../members/[postgres@lsl-test1 members]$ ls -ltotal 8-rwx------. 1 postgres postgres 8192 May 17 17:22 0000

因此-O=0xCC80。

-x參數(shù)查找pg_xact目錄下可以查看數(shù)值最大的文件名,+1乘以 1048576 (0x100000)。

[postgres@lsl-test1 members]$ cd ../../pg_xact/[postgres@lsl-test1 pg_xact]$ ls -ltotal 16-rwx------. 1 postgres postgres 8192 May 17 18:04 0000-rw-------. 1 postgres postgres 8192 May 30 17:26 0001

因此-x=0x200000。

不加-f參數(shù)時(shí)可以查看要寫(xiě)入控制文件中的參數(shù)內(nèi)容。

[postgres@lsl-test1 pg_xact]$ /usr/pgsql-11/bin/pg_resetwal -l 000000010000000000000009 -m 0x10000,0x00000 -O 0xCC80 -x 0x200000 -D /pg/pg11/datapg_resetwal: oldest multitransaction ID (-m) must not be 0[postgres@lsl-test1 pg_xact]$ /usr/pgsql-11/bin/pg_resetwal -l 000000010000000000000009 -m 0x10000,0x00001 -O 0xCC80 -x 0x200000 -D /pg/pg11/datapg_resetwal: pg_control exists but is broken or wrong version; ignoring itGuessed pg_control values:pg_control version number: 1100Catalog version number: 201809051Database system identifier: 6696828635748080009Latest checkpoint's TimeLineID: 1Latest checkpoint's full_page_writes: offLatest checkpoint's NextXID: 0:3Latest checkpoint's NextOID: 10000Latest checkpoint's NextMultiXactId: 1Latest checkpoint's NextMultiOffset: 0Latest checkpoint's oldestXID: 3Latest checkpoint's oldestXID's DB: 0Latest checkpoint's oldestActiveXID: 0Latest checkpoint's oldestMultiXid: 1Latest checkpoint's oldestMulti's DB: 0Latest checkpoint's oldestCommitTsXid:0Latest checkpoint's newestCommitTsXid:0Maximum data alignment: 8Database block size: 8192Blocks per segment of large relation: 131072WAL block size: 8192Bytes per WAL segment: 16777216Maximum length of identifiers: 64Maximum columns in an index: 32Maximum size of a TOAST chunk: 1996Size of a large-object chunk: 2048Date/time type storage: 64-bit integersFloat4 argument passing: by valueFloat8 argument passing: by valueData page checksum version: 0Values to be changed:First log segment after reset: 000000010000000000000009NextMultiXactId: 65536OldestMultiXid: 1OldestMulti's DB: 0NextMultiOffset: 52352NextXID: 2097152OldestXID: 2297064448OldestXID's DB: 0If these values seem acceptable, use -f to force reset.[postgres@lsl-test1 pg_xact]$ cd ../global/[postgres@lsl-test1 global]$ ls -l pg_control-rw-r--r--. 1 postgres postgres 0 May 30 17:36 pg_control

7. 啟動(dòng)數(shù)據(jù)庫(kù)

確認(rèn)控制文件參數(shù)無(wú)誤后加上-f會(huì)寫(xiě)入到控制文件里。

[postgres@lsl-test1 global]$ /usr/pgsql-11/bin/pg_resetwal -l 000000010000000000000009 -m 0x10000,0x00001 -O 0xCC80 -x 0x200000 -D /pg/pg11/data -fpg_resetwal: pg_control exists but is broken or wrong version; ignoring itWrite-ahead log reset

啟動(dòng)數(shù)據(jù)庫(kù)。

[postgres@lsl-test1 global]$ /usr/pgsql-11/bin/pg_ctl start -D /pg/pg11/data/waiting for server to start....2019-05-30 22:42:50.946 CST [2471] LOG: listening on IPv6 address "::1", port 54322019-05-30 22:42:50.946 CST [2471] LOG: listening on IPv4 address "127.0.0.1", port 54322019-05-30 22:42:50.949 CST [2471] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"2019-05-30 22:42:50.961 CST [2471] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"2019-05-30 22:42:50.987 CST [2471] LOG: redirecting log output to logging collector process2019-05-30 22:42:50.987 CST [2471] HINT: Future log output will appear in directory "log".doneserver started

8. 查看測(cè)試數(shù)據(jù)是否正常,然后插入新數(shù)據(jù)看數(shù)據(jù)庫(kù)是否可用。

[postgres@lsl-test1 global]$ psqlpsql (11.2)Type "help" for help.postgres=# select min(oid),max(oid),count(*) from lsl_oid1 ; min | max | count -------+--------+--------16400 | 116399 | 100000(1 row)postgres=# insert into lsl_oid1 select generate_series(100001,200000); INSERT 0 100000postgres=# select min(oid),max(oid),count(*) from lsl_oid1 ; min | max | count -------+--------+--------16384 | 116399 | 200000(1 row)

數(shù)據(jù)庫(kù)可以正常訪問(wèn)。

至此,本文關(guān)于Oracle和PostgreSQL的控制文件內(nèi)容介紹到這里。

想了解更多關(guān)于數(shù)據(jù)庫(kù)、云技術(shù)的內(nèi)容嗎?

快來(lái)關(guān)注“數(shù)據(jù)和云”公眾號(hào)、“云和恩墨”官方網(wǎng)站,我們期待與大家一同學(xué)習(xí)和進(jìn)步!

從Oracle到PostgreSQL:最全控制文件

(掃描上方二維碼,關(guān)注“數(shù)據(jù)和云”公眾號(hào),即可查看更多科技文章)


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI