Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从Oracle到PostgreSQL:最全控制文件

从Oracle到PostgreSQL:最全控制文件

作者头像
数据和云
发布于 2019-07-22 08:58:24
发布于 2019-07-22 08:58:24
2.9K00
代码可运行
举报
文章被收录于专栏:数据和云数据和云
运行总次数:0
代码可运行

墨墨导读:本文介绍了Oracle和PostgreSQL控制文件基本内容,对如何重建PostgreSQL控制文件进行了详细描述并进行了恢复测试。

控制文件内容


Oracle控制文件内容

从官方文档上可以知道控制文件保存着下列信息:

  • 数据库名以及数据创建时间等
  • 相关数据文件和重做日志文件的名称和位置
  • 表空间信息
  • 重做日志线程、文件信息
  • 备份集及备份文件信息
  • 检查点及SCN信息等
  • 12c增加了PDB的信息

由于控制文件是个二进制文件,无法直接打开查阅,可以将控制文件内容转储出来便于查看,可以使用以下命令来做转存。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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开始可以通过v$diag_info获得当前会话转储文件的名称。

打开跟踪文件可以清晰的看到控制文件的内容,最开始的一段是关于数据库ID、名称等的概要信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Trace file /u01/app/oracle/diag/rdbms/rac12201/RAC122011/trace/RAC122011_ora_24813.trc
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Build label:    RDBMS_12.2.0.1.0_LINUX.X64_170125
ORACLE_HOME:    /u01/app/oracle/product/12.2.0.1/dbhome_1
System name:    Linux
Node name:      ractest1
Release:        2.6.32-431.el6.x86_64
Version:        #1 SMP Sun Nov 10 22:19:54 EST 2013
Machine:        x86_64
Instance name: RAC122011
Redo thread mounted by this instance: 1
Oracle process number: 96
Unix 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:00
DUMP OF CONTROL FILES, Seq # 233771 = 0x3912b
V10 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

接下来是数据条目的详细信息,包括了数据的名称、数据文件及日志文件的数量、数据库的检查点及SCN信息等:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
***************************************************************************
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:46
DB Name "RAC12201"
Database flags = 0x10406001 0x00001200 0x00000082
Controlfile Creation Timestamp  03/31/2019 23:47:47
Incmplt recovery scn: 0x0000000000000000
Resetlogs scn: 0x0000000000157e2e Resetlogs Timestamp  03/31/2019 23:47:49
Prior resetlogs scn: 0x0000000000000001 Prior resetlogs Timestamp  01/26/2017 13:52:29
Redo Version: compatible=0xc200100
#Data files = 28, #Online files = 25
Database checkpoint: Thread=1 scn: 0x0000000002a1699e
Threads: #Enabled=2, #Open=2, Head=1, Tail=2
enabled  threads:  01100000 00000000 00000000 00000000 00000000 00000000
.......
Max log members = 3, Max data members = 1
Arch list: Head=1, Tail=9, Force scn: 0x00000000029c57a6scn: 0x0000000000000000
Activation ID: 1217928802
Snapshot Controlfile filename
  name #31: +DATA/snapcf_rac12201.f
Snapshot Controlfile checkpoint scn: 0x00000000026d24dd 05/25/2019 22:40:30
SCN compatibility 1
Auto-rollover enabled
Controlfile Checkpointed at scn:  0x0000000002a231ff 05/30/2019 09:15:32
thread:0 rba:(0x0.0.0)
enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000
.......

再接下来是检查点记录信息,这部分内容包含了Low Cache RBA 和 On Disk RBA信息,在执行数据库实例恢复时,前者是恢复的起点,后者是恢复的终点,其分别指向了日志文件中的确定地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
***************************************************************************
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:54
low cache rba:(0x13c.ec78.0) on disk rba:(0x13c.edda.0)
on disk scn: 0x0000000002a232bc 05/30/2019 09:15:37
resetlogs scn: 0x0000000000157e2e 03/31/2019 23:47:49
heartbeat: 1009031373 mount id: 1222276307

控制文件还有跟多其它记录,大家可以转储出来仔细阅读接下来的每个条目。 接下来我们看看PostgreSQL控制文件都记录了什么。

PostgreSQL控制文件内容

相比Oracle的控制文件,PostgreSQL控制文件内容就少了很多,主要分为是三部分,初始化静态信息、WAL及检查点的动态信息、一些配置信息。

我们可以用过pg_controldata命令直接读取PostgreSQL控制文件内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 ~]$ /usr/pgsql-11/bin/pg_controldata  -D /pg/pg11/data
pg_control version number:            1100
Catalog version number:               201809051
Database system identifier:           6691945724594983959
Database cluster state:               in production
pg_control last modified:             Thu 30 May 2019 03:20:03 PM CST
Latest checkpoint location:           0/60001E8
Latest checkpoint's REDO location:    0/60001E8
Latest checkpoint's REDO WAL file:    000000010000000000000006
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:1048576
Latest checkpoint's NextOID:          10000
Latest checkpoint's NextMultiXactId:  65536
Latest checkpoint's NextMultiOffset:  52352
Latest checkpoint's oldestXID:        2296015872
Latest checkpoint's oldestXID's DB:   0
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   65536
Latest checkpoint's oldestMulti's DB: 0
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Thu 30 May 2019 03:20:03 PM CST
Fake LSN counter for unlogged rels:   0/1
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    replica
wal_log_hints setting:                off
max_connections setting:              100
max_worker_processes setting:         8
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0
Mock authentication nonce:            0000000000000000000000000000000000000000000000000000000000000000

下面详细介绍下各参数含义。

  • pg_control version number是控制文件版本号。
  • Catalog version number 是系统表版本号,格式是yyyymmddN。记录系统不兼容性的改变。N是yyymmdd当天改变的次数。具体可以查看源码文件catversion.h。
  • Database system identifier 数据库系统号 这个标识串是一个64bit的整数,其中包含了创建数据库的时间戳和initdb时初始化的进程号,具体初始化方法可查看源码文件xlog.c。

创建时间可以通过to_timestamp转换查看到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
创建时间可以通过to_timestamp转换查看到。
postgres=# SELECT to_timestamp(((6691945724594983959>>32) & (2^32 -1)::bigint));
      to_timestamp      
------------------------
2019-05-17 18:47:10+08
(1 row)

Database cluster state 记录实例的状态。源码文件中看到数据库的几种状态,源码pg_control.h中可以看到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
starting up:表示数据库正在启动状态。
shut down:   数据库实例(非Standby)正常关闭后控制文件中就是此状态。
shut down in recovery:Standby实例正常关闭后控制文件中就是此状态。
shutting down:正常停库时,先做checkpoint,开始做checkpoint时,会把状态设置为此状态,做完后把状态设置为shut down。
in crash recovery:数据库实例非异常停止后,重新启动后,会先进行实例的恢复,在实例恢复时的状态就是此状态。
in archive recovery:Standby实例正常启动后,就是此状态。
in production:数据库实例正常启动后就是此状态。Standby数据库正常启动后不是此状态
  • Latest checkpoint location数据库异常停止后再重新启动时,需要做实例恢复,实例恢复的过程是从WAL日志中,找到最后一次的checkpoint点,然后读取这个点之后的WAL日志,重新应用这些日志,此过程称为数据库实例前滚,最后一次的checkpoint点的信息记录在Latest checkpont项中。
  • Latest checkpoint's REDO location 记录数据库日志文件上检查点。
  • Latest checkpoint's REDO WAL file记录WAL日志名,目录下pg_wal可以查到文件。
  • Latest checkpoint's NextXID前面是新纪元值,冒号后面是下一个事务号,当前事务号最大值安全值可以在pg_xact目录下通过文件名计算出来。
  • Latest checkpoint's NextMultiXactId参数,可以通过pg_multixact/offsets文件名计算出来安全值。
  • Latest checkpoint's NextMultiOffset参数,当恢复控制文件时可以通过pg_multixact/members文件夹下计算出此参数的安全值。
  • Maximum length of identifiers是指一些数据库对象名称的最大长度,如表名、索引名的最大长度 Maximum columns in an index 表示一个索引最多多少列,目前为32个。
  • Maximum size of a TOAST chunk是TOAST chunk的最大长度。TOAST是解决当列的内容太长,在一个数据块中存不下时的一种行外存储的方式。类似Oracle的行链接。
  • Data page checksum version是数据块checksum的版本,默认为0,数据块没有使用checksum。运行initdb时加了-k参数,PG才会在数据块上启用checksum功能。 参数介绍到这里,控制文件各内容定义可以查看源文件pg_control.h。

重建控制文件


如果控制文件损坏或丢失,数据库将运行异常,也无法启动。对于Oracle和PostgreSQL 控制文件同样重要。

Oracle控制文件重建

对于Oracle来说,当控制文件损坏无备份的情况下,可以通过手工重建控制文件的方法来恢复控制文件。

具体命令如下图:

详细信息可以查看官方文档:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/CREATE-CONTROLFILE.html#GUID-9B389F28-C4D0-405D-BFE6-48237E8BD791 https://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日志或重置控制文件中一些控制信息。

命令详细介绍可以查看官方文档:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 ~]$  /usr/pgsql-11/bin/pg_resetwal -n -D /pg/pg11/data
pg_resetwal: lock file "postmaster.pid" exists
Is a server running?  If not, delete the lock file and try again.
[postgres@lsl-test1 ~]$ ./pg_resetwal --help
pg_resetwal resets the PostgreSQL write-ahead log.

Usage:
  pg_resetwal [OPTION]... DATADIR

Options:
  -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

下面看下命令各个参数具体含义:

-c参数有两个参数值,一个最旧的事务号,一个最新的事务号。最旧的事务号的安全值,可以在pg_commit_ts目录查询最小的文件名;最新事务ID的安全值,可以在pg_commit_ts目录查询最大的文件名。文件名都是16进制。实际测试在11的版本pg_commit_ts目录下未发现文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 data]$ cd pg_commit_ts/
[postgres@lsl-test1 pg_commit_ts]$ ls -l
total 0

-e参数是设置事务号的新纪元(epoch),除了pg_resetwal设置的字段之外,事务ID新纪元实际上并不存储在数据库的任何位置。您可能需要调整此值,以确保Slony或者Skytools等复制系统能够正确工作。如果是这样的话,应该可以从下游复制数据库的状态获得适当的值。

-l 参数通过指定下一个WAL段文件的名称,手动设置WAL启动位置。该选项使用WAL文件名,而不是LSN。下一个段的名字应该大于当前存在pg_wal目录下的任何WAL段文件名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 pg_commit_ts]$ cd ../pg_wal/
[postgres@lsl-test1 pg_wal]$ ls -l
total 32768
-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000007
-rw-------. 1 postgres postgres 16777216 May 30 17:26 000000010000000000000008
drwx------. 2 postgres postgres        6 May 17 17:22 archive_status

这些名称也是十六进制的,文件名包含三部分 ,第一部分时间线号(timeline ID) ,第二部分逻辑日志号 ,第三部分日志段号。

-m参数也是两个值,一个是下一个多事务号,一个是最旧的多事务号。

下一个多事务号的安全值,可以在目录pg_multixact/offsets查找数值最大的文件名,加1然后乘以65536(0x10000)。

最旧的多事务号的安全值可以通过查询目录下数值最小的文件名乘以65536。文件名都是十六进制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 pg_wal]$ cd ../pg_multixact/offsets/
[postgres@lsl-test1 offsets]$ ls -l
total 8
-rwx------. 1 postgres postgres 8192 May 17 18:04 0000

-o参数是设置下一个OID(OID,object 是pg内部使用,作为系统表的主键),我们恢复时可以不设置这个参数,因为设置一个超过数据库中最大值OID没有好的办法。

-O参数是设置下一个多事务偏移量。查找pg_multixact/members目录下数值最大的文件名,+1乘以52352 (0xCC80),可以计算出偏移量的安全值。目录下文件的文件名也是十六进制的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 offsets]$ ls -l ../members/
total 8
-rwx------. 1 postgres postgres 8192 May 17 17:22 0000

--wal-segsize参数设置新的WAL段大小 。

-x参数是手工设置下一个事务ID,pg_xact目录下可以查看数值最大的文件名,+1乘以 1048576 (0x100000),获取安全值。文件名也是十六进制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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控制文件恢复测试

测试过程如下(基于PostgreSQL 11.2) :

1. 新建测试数据, 用到with oids的表, 因为OID无法确定, 看看是否会有异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# create table lsl_oid1(id int primary key) with oids;  
CREATE TABLE
postgres=#  insert into lsl_oid1 select generate_series(1,100000);
INSERT 0 100000
postgres=# select min(oid),max(oid) from lsl_oid1 ;   
  min  |  max   
-------+--------
16400 | 116399
(1 row)

2. 关闭数据,记录下控制文件信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 bin]$ /usr/pgsql-11/bin/pg_ctl  stop -D /pg/pg11/data
waiting for server to shut down.... done
server stopped

## 记下pg_controldata信息, 方便修复后进行比对

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 bin]$ /usr/pgsql-11/bin/pg_controldata  -D /pg/pg11/data
pg_control version number:            1100
Catalog version number:               201809051
Database system identifier:           6691945724594983959
Database cluster state:               shut down
pg_control last modified:             Thu 30 May 2019 05:26:41 PM CST
Latest checkpoint location:           0/79E9888
Latest checkpoint's REDO location:    0/79E9888
Latest checkpoint's REDO WAL file:    000000010000000000000007
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:1048585
Latest checkpoint's NextOID:          116400
Latest checkpoint's NextMultiXactId:  65536
Latest checkpoint's NextMultiOffset:  52352
Latest checkpoint's oldestXID:        561
Latest checkpoint's oldestXID's DB:   13878
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 13878
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Thu 30 May 2019 05:26:40 PM CST
Fake LSN counter for unlogged rels:   0/1
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    replica
wal_log_hints setting:                off
max_connections setting:              100
max_worker_processes setting:         8
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0
Mock authentication nonce:            0000000000000000000000000000000000000000000000000000000000000000    

3. 模拟控制文件故障,直接删除控制文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 global]$ pwd
/pg/pg11/data/global
[postgres@lsl-test1 global]$ rm -rf pg_control

4. 启动数据库,模拟控制文件丢失场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 global]$ /usr/pgsql-11/bin/pg_ctl  start
waiting for server to start....postgres: could not find the database system
Expected to find it in the directory "/pg/pg11/data",
but could not open file "/pg/pg11/data/global/pg_control": No such file or directory
stopped waiting
pg_ctl: could not start server
Examine the log output.

下面开始正式重建控制文件,使得数据库可以正常启动。

5. 首先创建一个名为pg_control的空文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 global]$ touch $PGDATA/global/pg_control

6. 使用pg_resetwal修复pg_control

确认pg_resetwal参数值。

首先确认-c参数,上面参数详细分析发现目录下为空,因此暂时忽略此参数。

-e参数是设置下一个事务号的新纪元,我们测试环境没有其它复制系统因此也可以忽略。

-l参数,查看pg_wal下文件文件名,大于文件名最大值即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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参数取pg_multixact/offsets目录下最大值加1然后乘以655360x10000)和最小值 乘以655360x10000[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参数不确定时,由于测试没有复制软件因此可以暂时忽略。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 offsets]$ cd ../members/
[postgres@lsl-test1 members]$ ls -l
total 8
-rwx------. 1 postgres postgres 8192 May 17 17:22 0000

因此-O=0xCC80。

-x参数查找pg_xact目录下可以查看数值最大的文件名,+1乘以 1048576 (0x100000)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 members]$ cd ../../pg_xact/
[postgres@lsl-test1 pg_xact]$ ls -l
total 16
-rwx------. 1 postgres postgres 8192 May 17 18:04 0000
-rw-------. 1 postgres postgres 8192 May 30 17:26 0001

因此-x=0x200000。

不加-f参数时可以查看要写入控制文件中的参数内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 pg_xact]$ /usr/pgsql-11/bin/pg_resetwal   -l 000000010000000000000009 -m  0x10000,0x00000  -O  0xCC80  -x 0x200000 -D /pg/pg11/data
pg_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/data
pg_resetwal: pg_control exists but is broken or wrong version; ignoring it
Guessed pg_control values:
pg_control version number:            1100
Catalog version number:               201809051
Database system identifier:           6696828635748080009
Latest checkpoint's TimeLineID:       1
Latest checkpoint's full_page_writes: off
Latest checkpoint's NextXID:          0:3
Latest checkpoint's NextOID:          10000
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        3
Latest checkpoint's oldestXID's DB:   0
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 0
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0


Values to be changed:
First log segment after reset:        000000010000000000000009
NextMultiXactId:                      65536
OldestMultiXid:                       1
OldestMulti's DB:                     0
NextMultiOffset:                      52352
NextXID:                              2097152
OldestXID:                            2297064448
OldestXID's DB:                       0
If 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. 启动数据库

确认控制文件参数无误后加上-f会写入到控制文件里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 global]$ /usr/pgsql-11/bin/pg_resetwal   -l 000000010000000000000009 -m  0x10000,0x00001  -O  0xCC80  -x 0x200000 -D /pg/pg11/data  -f
pg_resetwal: pg_control exists but is broken or wrong version; ignoring it
Write-ahead log reset

启动数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 5432
2019-05-30 22:42:50.946 CST [2471] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2019-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 process
2019-05-30 22:42:50.987 CST [2471] HINT:  Future log output will appear in directory "log".
done
server started

8. 查看测试数据是否正常,然后插入新数据看数据库是否可用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@lsl-test1 global]$ psql
psql (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 100000
postgres=#  select min(oid),max(oid),count(*) from lsl_oid1 ;    
  min  |  max   | count  
-------+--------+--------
16384 | 116399 | 200000
(1 row)

数据库可以正常访问。

至此,本文关于Oracle和PostgreSQL的控制文件内容介绍到这里。

原创:李思雷

编辑:肖悦

扩展阅读


  1. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(上)
  2. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(下)
  3. 史上最全PostgreSQL体系结构
  4. “王者对战”之 MySQL 8 vs PostgreSQL 10
  5. 大象起舞:用PostgreSQL解海盗分金问题
  6. 解读年度数据库PostgreSQL:如何巧妙地实现缓冲区管理器
  7. 解读年度数据库PostgreSQL:如何处理并发控制(一)
  8. 数据和云,半年文章精选(文末赠书)

数据和云

ID:OraNews

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用OnBackPressedDispatcher处理回退事件
在单 Activity 多 Fragment 的场景下处理回退按键一直是一件比较恶心的事情。前段时间看 jetpack 在宣传中有提到利用 OnBackPressedDispatcher 处理回退,于是研究了一下。
烧麦程
2022/05/10
1.8K0
使用OnBackPressedDispatcher处理回退事件
Android onBackPressed不执行的解决方案
应用中经常会用到双击返回键在退出应用的效果,目的是为了防止用户误触返回键而导致退出应用。 通常的写法如下: 首先定义一个变量
longzeqiu
2019/08/14
3.5K0
Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)
ViewModel 是 Jetpack 组件中较常用的组件之一,也是实现 MVVM 模式或 MVI 模式的标准组件之一。在这篇文章里,我将与你讨论 ViewModel 实用和面试常见的知识点。如果能帮上忙请务必点赞加关注,这对我非常重要。
用户9995743
2022/09/26
1.4K0
Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)
Android项目开发填坑记-Fragment的onBackPressed
版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出处,否则禁止转载。 https://micro.blog.csdn.net/article/details/51228934
他叫自己MR.张
2019/07/01
1.2K0
Fragment响应onBackPressed的三个方案
经常会碰到Fragment需要响应activity的onBackPressed事件,对比下三个不同方案
韦东锏
2021/09/29
2.2K0
抽丝剥茧 Jetpack | Lifecycle 到底解决了什么问题?
Lifecycle(生命周期) 在任何 GUI 编程中都是基石般的存在,Android 也不例外。
路遥TM
2022/03/29
3040
抽丝剥茧 Jetpack | Lifecycle 到底解决了什么问题?
“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!
也就是说,LiveData使得 数据的更新 能以观察者模式 被observer感知,且此感知只发生在 LifecycleOwner的活跃生命周期状态。
胡飞洋
2020/12/15
4.1K0
Fragment回退栈及弹出方法
在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习。 一、回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操
分享达人秀
2018/02/05
4.7K1
Fragment回退栈及弹出方法
Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)
Lifecycle 的主要作用是简化实现生命周期感知型组件的复杂度。 在传统的方式中,需要手动从外部宿主(如 Activity、Fragment 或自定义宿主)中将生命周期事件分发到功能组件内部,这势必会造成宿主代码复杂度增加。例如:
用户9995743
2022/09/26
1.2K0
Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)
Jetpack路由组件学习:深入理解功能强大的Navigation架构之接管系统的返回操作
不管你之前用没用过Jetpack Navigation组件,但是或多或少你也可能听说过它。它是Jetpack库中的一个路由组件。此刻你的脑海中可能会浮现阿里ARouter框架。如果你熟悉ARouter但是对Navigation比较陌生,那么你先简单把它们联系在一起,有个直观的感受。
Android技术干货分享
2021/08/05
1.5K0
Jetpack路由组件学习:深入理解功能强大的Navigation架构之接管系统的返回操作
全网最全:Jetpack AAC(-)解析
原文链接:https://juejin.cn/post/6893870636733890574
程序员小顾
2021/12/07
1.4K0
Navigation深入浅出,到出神入化,再到实战改造(二)
NavDestination 节点的封装类对应nav_graph.xml文件中的 </navigation>, </fragment> </activity>, </dialog>目标节点(即Destination),同时有如四个子类:NavGraph,FragmentNavigator#Destination,ActivityNavigator#Destination,DialogFragmentNavigator#Destination
g小志
2022/03/29
2.2K0
Navigation深入浅出,到出神入化,再到实战改造(二)
Fragment 的过去、现在和将来
Fragment 是 Android 中历史十分悠久的一个组件,它在 API 11 被加入,时至今日已成为 Android 开发中最常用的组件之一。Fragment 有了哪些新特性、修复了哪些问题,都是开发者们十分关心的话题。下面我们就来重新说一说 Fragment —— 不仅仅是说现在的 Fragment,还会回顾它的发展,并让您一瞥它未来的样子。
Android 开发者
2020/06/24
9600
Fragment 的过去、现在和将来
Android Jetpack架构组件(四)之LiveData
LiveData是Jetpack架构组件Lifecycle 库的一部分,是一个可感知生命周期的可观察容器类 (Observable)。与常规的可观察类不同,LiveData 具有生命周期感知能力,这意味着它具有感知应用组件(如 Activity、Fragment 或 Service)的生命周期的能力,并且LiveData仅更新处于活跃生命周期状态的应用组件观察者。
xiangzhihong
2020/12/21
3.6K0
Android-Jetpack笔记-Lifecycles
Lifecycle即生命周期,一些业务场景如三方地图、播放器等,依赖于activity的生命周期,会有类似下面的用法:
Holiday
2020/08/10
3830
Android-Jetpack笔记-Lifecycles
Android实现点击两次返回退出APP
这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客。
全栈程序员站长
2022/09/07
1.6K0
Android APP 快速 Pad 化实现
如何能在最快的时间内,实现一个最新版本 Android app 的 pad 化呢?从拿到一个大型手机 app 代码开始开发到第一个其全新 pad 版本的发布,我们用了不到3个月时间给出了一份满意的答案。 项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验。为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目经典页面的构成以及 Pad 化后的页面结构的变化。 1.MyApp 页面经典构成 现在主流手机 APP 主页
腾讯Bugly
2018/03/23
2.3K0
Android APP 快速 Pad 化实现
Android Jetpack - Lifecycles
Lifecycles 简介 Lifecycles 即生命周期,属于 Jetpack 架构组件之一的 Lifecycles 组件是可以为其它组件提供生命周期感知能力的一个组件,而具备了生命周期感知能力的组件就叫生命周期感知组件,注意加粗部分多读两遍,我看网上很多文章直接把 Lifecycles 组件叫生命周期感知组件那么什么是生命周期感知能力呢?我们知道四大基础组件有生命周期,能感知这些生命周期的组件就具备了生命周期感知能力,所以我认为以前我们使用的 MVP 模式中的 Presenter 如果它通过接口等方式
SkyRiN
2019/08/08
1.4K0
037android初级篇之Activity的几个重要函数
手机屏幕事件的处理方法onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。该方法的签名如下所示。
上善若水.夏
2018/09/28
7760
笔记64 | 个人项目“易来”开发记录《二》处理Fragment中返回的问题
需求描述 问题: 一个WebView放在Fragment中,我们都知道webView有一个goBack()方法,可以通过该方法对网页进行后退处理,由于Fragment本身并没有监听onBackPressed的方法,又处于一个Activity中,Activity除又对后退进行了3秒确定退出处理,所有导致 Fragment中的WebView无法进行goBack(); 需求: 需要在Fragment中监听到返回键,当WebView可以后退网页的时候,进行后退网页,当没有可后退的网页时(首页状态),点击返回调Act
项勇
2018/06/19
5950
推荐阅读
相关推荐
使用OnBackPressedDispatcher处理回退事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验