├── bin #系统工具目录
│?? ├── clusterdb
│?? ├── createdb
│?? ├── createuser
│?? ├── dropdb
│?? ├── dropuser
│?? ├── ecpg
│?? ├── initdb
│?? ├── pg_amcheck
│?? ├── pg_archivecleanup
│?? ├── pg_basebackup
│?? ├── pgbench
│?? ├── pg_checksums
│?? ├── pg_config
│?? ├── pg_controldata
│?? ├── pg_ctl
│?? ├── pg_dump
│?? ├── pg_dumpall
│?? ├── pg_isready
│?? ├── pg_receivewal
│?? ├── pg_recvlogical
│?? ├── pg_resetwal
│?? ├── pg_restore
│?? ├── pg_rewind
│?? ├── pg_test_fsync
│?? ├── pg_test_timing
│?? ├── pg_upgrade
│?? ├── pg_verifybackup
│?? ├── postgres
│?? ├── psql
│?? ├── reindexdb
│ └── vacuumdb
├── include #系统文件目录
├── lib #引用库目录
└── share #插件及配置文件
├── extension #存放插件目录
创建一个新的 PostgreSQL 数据库
initdb [option...] [ --pgdata | -D ] directory
聚簇一个PostgreSQL数据库
clusterdb [connection-option...] [ --verbose | -v ] [ --table | -t table ] ... [dbname]
clusterdb [connection-option...] [ --verbose | -v ] --all | -a
显示 PostgreSQL 数据库簇控制信息.
pg_controldata [option...] [ -D | --pgdata ]datadir
pg_controldata
打印那些在initdb
过程中初始化的信息, 比如表版本。它还显示有关预写日志和检查点处理相关的信息。这些信息是集群范围内有效的, 并不和某个数据库相关。PGDATA
环境变量。 这个工具支持-V
和--version
选项,可以打印 pg_controldata的版本然后退出。还支持?-?
和--help
选项,输出支持的参数。?清理PostgreSQL?WAL归档文件
pg_archivecleanup [option...] archivelocation oldestkeptwalfile
要配置备用服务器使用pg_archivecleanup,将下列代码放入?recovery.conf配置文件中:
archive_cleanup_command = 'pg_archivecleanup archivelocation %r'
这里的archivelocation是应该被移除的WAL段文件的目录。
pg_archivecleanup -d archive 000000010000003700000010.00000020.backup pg_archivecleanup: keep WAL file "archive/000000010000003700000010" and later pg_archivecleanup: removing file "archive/00000001000000370000000F" pg_archivecleanup: removing file "archive/00000001000000370000000E"
pg_archivecleanup假设archivelocation?是一个服务器所有者用户可读和可写的目录。
PostgreSQL判断最快的?wal_sync_method
pg_test_fsync [option...]
pg_test_fsync是想告诉你在特定的系统上,哪一种?wal_sync_method
最快,还可以在发生认定的 I/O 问题时提供诊断信息。不过,pg_test_fsync?显示的区别可能不会在真实的数据库吞吐量上产生显著的区别,特别是由于 很多数据库服务器被它们的预写日志限制了速度。?pg_test_fsync为?wal_sync_method
报告以微秒计的平均文件同步操作时间, 也能被用来提示用于优化commit_delay
值的方法。
测量定时开销
pg_test_timing [ option ...]
?pg_test_timing 是一种工具,用于测量系统上的计时开销,并确认系统时间永远不会向后移动。收集时序数据的系统较慢,可能会产生不太准确的EXPLAIN ANALYZE
结果。
升级服务器实例
pg_upgrade -b oldbindir [-B newbindir] -d oldconfigdir -D newconfigdir [option...]
重置 PostgreSQL 数据库集群的预写日志和其他控制信息
pg_resetwal [ -f | --force ] [ -n | --dry-run ] [option...] [ -D | --pgdata ]datadir
pg_resetwal
清除预写日志?WAL
,并可选地重置pg_control文件中的一些其他控制信息。当?WAL
?文件或?pg_control?
控制文件损坏时,导致数据库无法启动时,该操作将作为数据库修复的最后手段使用。pg_resetwal
?修复而启动数据库后,可能会由于部分提交的事务,导致数据库可能存在数据不一致的情况。所以,应该立即转储数据,建议重新初始化新的数据库恢复。恢复后再检查不一致,并根据需要进一步修复。pg_resetwal
只能由安装数据库用户运行,因为它需要对数据目录进行读/写访问。注意:考虑安全原因,pg_resetwal
不使用环境变量 PGDATA,所以必须在命令行上指定数据目录。pg_resetwa
l 提示无法确定pg_control的有效数据,可以通过指定-f(force)选项强制继续执行。大多数字段可以自动匹配,但下一个OID、下一个事务ID和epoch、下一多事务ID和偏移量以及WAL起始位置字段值可能需要手动指定。可以使用一些选项设置这些字段值。如果无法确定这些字段的正确值,也可使用-f,但必须对恢复的数据库更为严谨的处理:必须立即转储和恢复。在转储之前,不要在数据库中执行任何数据修改操作,因为任何此类操作都可能会使损坏更严重。创建一个新的PostgreSQL数据库
createdb [connection-option...] [option...] [dbname [description]]
-O
选项指定一个不同的所有者。定义一个新的PostgreSQL用户账户
createuser [connection-option...] [option...] [username]
CREATEROLE
特权的用户才能创建新用户,因此createuser必须被以上两种用户调用。CREATEROLE
特权。作为一个超级用户意味着绕过数据库中所有访问权限检查的能力,因此超级用户访问权限不能轻易被授予。移除一个PostgreSQL数据库
dropdb [connection-option...] [option...] dbname
移除一个PostgreSQL用户账户
CREATEROLE
特权的用户能够移除PostgreSQL用户(要移除一个超级用户,你必须自己是一个超级用户)。ecpg [option...] file...
嵌入式 SQL C 预处理器
ecpg
是用于 C 程序的嵌入式 SQL 预处理器。它通过将 SQL 调用替换为特殊函数调用把带有嵌入式 SQL 语句的 C 程序转换为普通 C 代码。输出文件可以被任何 C 编译器工具链处理。ecpg
将把命令行中给出的每一个输入文件转换为相应的 C 输出文件。 如果输入文件名没有任何扩展名,则假定为.pgc
。文件扩展名将由?.c
替换以构造输出文件名。 但是输出文件名可以使用-o
选项覆盖。-
,ecpg
从标准输入 读取程序(并写入标准输出,除非用-o
重写)。在一个或多个PostgreSQL数据库中检查损坏
pg_amcheck [option...] [dbname]
dbname
,则它应该是要检查的单个数据库的名称,并且不应该存在其他数据库选择选项。否则,如果存在任何数据库选择选项,将检查所有匹配的数据库。如果不存在此类选项,将选中默认数据库。数据库选择选项包括--all
,--database
和--exclude-database
。它们还包括--relation
,--exclude-relation
,?--table
,--exclude-table
,--index
,和--exclude-index
,但仅当这些选项与三段式模式一起使用时(例如,mydb*.myschema*.myrel*
)。最后,它们包括--schema
和--exclude-schema
?当这些选项与两段式模式一起使用时(例如mydb*.myschema*
)。dbname
也可以是一个链接字符串.?获得一个PostgreSQL集簇的一个基础备份
pg_basebackup [option...]
?每当pg_basebackup进行基本备份时,服务器的pg_stat_progress_basebackup视图将报告备份的进度。?
在PostgreSQL上运行一个基准测试
pgbench -i [option...] [dbname]
pgbench [option...] [dbname]
SELECT
、UPDATE
以及INSERT
命令。但是,通过编写自己的事务脚本文件很容易用来测试其他情况。获取已安装的PostgreSQL的信息
pg_config [option...]
把PostgreSQL数据库抽取为一个脚本文件或其他归档文件
pg_dump [connection-option...] [option...] [dbname]
-Fc
)和“目录”格式(-Fd
)。它们允许选择和重排序所有已归档项、支持并行恢复并且默认是压缩的。“目录”格式是唯一一种支持并行转储的格式。将一个PostgreSQL数据库集簇抽取到一个脚本文件中
pg_dumpall [connection-option...] [option...]
-f
/--file
?选项或者 shell 操作符可以把它重定向到一个文件。~/.pgpass
会比较方便。?检查一个PostgreSQL服务器的连接状态
pg_isready [connection-option...] [option...]
以流的方式从一个PostgreSQL服务器得到预写式日志
pg_receivewal [option...]
--synchronous
。 由于pg_receivewal不应用于WAL,当synchronous_commit等于?remote_apply
时,你将不允许它成为同步备用。 如果发生这样的情况,它将成为一个永远不能拉起的备用数据库,并且会导致事务提交阻塞。 为了避免这种情况,你应该为synchronous_standby_names配置一个适当的值,或规定为pg_receivewal?的application_name
?与它不匹配,或将synchronous_commit
的值更改为remote_apply
以外的内容。REPLICATION
权限的用户或者一个超级用户建立,并且pg_hba.conf
必须允许复制连接。服务器也必须被配置一个足够高的max_wal_senders来至少留出一个可用会话给流。? ? ? ?The starting point of the write-ahead log streaming is calculated when?pg_receivewal?starts:
? ? ? ?1.首先,扫描WAL段文件所写入的目录,并发现最新完成的段文件,作为下一个段文件的开始的起始点。 这是独立计算的,根据用于压缩每个段的压缩方法。
? ? ? ?2.如果用前面的方法无法计算出起点,最新的WAL刷写位置用作由服务器通过IDENTIFY_SYSTEM
命令的报告。
-n
参数。控制?PostgreSQL?逻辑解码流
pg_recvlogical [option...]
pg_recvlogical
控制逻辑解码复制槽以及来自这种复制槽的流数据。pg_recvlogical
与逻辑解码SQL接口的peek和get模式没有等效性。它咋接收到数据以及干净地退出时,它会惰性地发送数据的确认。为了检查一个槽上还未消费的待处理数据,可以使用从一个由pg_dump创建的归档文件恢复一个PostgreSQL数据库
pg_restore [connection-option...] [option...] [filename]
INSERT
命令转储数据”选项创建,?pg_restore将无法使用COPY
语句装载数据。验证PostgreSQL集群的基础备份的完整性
pg_verifybackup [option...]
backup_manifest
检查使用pg_basebackup
进行的数据库群集备份的完整性。备份必须以“普通”格式存储;“tar”格式的备份可以在解压缩后进行检查。pg_verifybackup
读取backup_manifest
文件。如果该文件不存在、无法读取、格式不正确或无法根据其内部校验和进行验证,pg_verifybackup
?将以致命错误终止。pg_verifybackup
?将尝试验证当前存储在磁盘上的数据文件是否与服务器打算发送的数据文件完全相同,下面将介绍一些例外情况。 除了少数例外,额外和丢失的文件将被检测到。此步骤将忽略?postgresql.auto.conf
、standby.signal
?和?recovery.signal
?的存在与否或对其的任何修改,因为预计这些文件可能是在备份过程中创建或修改的。它也不会抱怨目标目录中的?backup_manifest
?文件或?pg_wal
?中的任何内容,即使这些文件不会列在备份清单中。只检查文件;不验证目录的存在与否,除非间接验证:如果目录丢失,则它应该包含的任何文件也必然会丢失。pg_verifybackup
将对所有文件进行校验和计算,将校验和与清单中的值进行比较,并对计算出的校验和与清单中存储的校验和不匹配的任何文件发出错误。对于在上一步中产生错误的任何文件,不执行此步骤,因为已知这些文件存在问题。在上一步中被忽略的文件在此步骤中也被忽略。pg_verifybackup
?将使用清单来验证恢复备份所需的预写式日志记录是否存在,并且它们可以被读取和解析。?backup_manifest
?包含有关需要哪些预写式日志记录的信息,并且?pg_verifybackup
?将使用该信息来调用?pg_waldump
?来解析这些预写式日志记录。?--quiet
?标志将被使用,因此?pg_waldump
?只会报告错误,而不会产生任何其他输出。虽然这种级别的验证足以检测明显的问题,例如丢失的文件或内部校验和不匹配的问题,但它们还不足以检测尝试恢复时可能出现的所有问题。例如,此方法无法检测到产生具有正确校验和但指定无意义操作的预写式日志记录的服务器错误。pg_waldump
?调用。 另请注意,WAL 验证是特定于版本的:您必须使用?pg_verifybackup
?的版本,因此是?pg_waldump
?的版本,它与正在检查的备份有关。 相比之下,数据文件完整性检查应适用于生成?backup_manifest
?文件的任何版本的服务器。PostgreSQL的交互式终端
psql [option...] [dbname [username]]
重索引一个PostgreSQL数据库
reindexdb [connection-option...] [option...] [ -S | --schema schema ] ... [ -t | --table table ] ... [ -i | --index index ] ... [dbname]
reindexdb [connection-option...] [option...] -a | --all
reindexdb [connection-option...] [option...] -s | --system [dbname]
vacuumdb — 对一个PostgreSQL数据库进行垃圾收集和分析
vacuumdb [connection-option...] [option...] [ -t | --table table [( column [,...] )] ] ... [dbname]
vacuumdb [connection-option...] [option...] -a | --all
├── base #存储数据库用户所创建的各个数据库,同时也包括postgres、template0和template1的pg_defaulttablespace。
├── global #存储集群范围的各个表和相关视图。(pg_database、pg_tablespace)
├── pg_commit_ts #存储已提交事务的时间
├── pg_dynshmem #存储动态共享内存子系统使用的文件。
├── pg_hba.conf #认证配置文件,配置了允许哪些IP访问数据库,及认证方式等信息。 #存储 committed serializable transactions 信息
├── pg_ident.conf #"ident"认证方式的用户映射文件。
├── pg_logical #存储包含逻辑解码的状态数据
│?? ├── mappings
│?? ├── replorigin_checkpoint
│?? └── snapshots
├── pg_multixact #该目录包含多事务状态数据。(等待锁定的并发事务)
├── pg_notify #该目录包含LISTEN/NOTIFY状态数据。
├── pg_replslot #该目录包含复制槽数据。
├── pg_serial
├── pg_snapshots #存储导出的snapshots(快照)。
├── pg_stat #存储统计子系统的永久文件。
├── pg_stat_tmp #存储统计子系统的临时文件。
├── pg_subtrans #存储子事务状态数据。
│?? └── 0000
├── pg_tblspc #存储指向表空间的符号链接
│?? └── 16399 -> /data/16.1/tablespace/dba_circle #表空间软连接
├── pg_twophase #该目录包含预备事务的状态文件。
├── PG_VERSION #记录了数据库版本号信息。
├── pg_wal #存储wal日志。(undo,redo)
│?? ├── 000000010000000000000003
│?? ├── 000000010000000000000004
│?? └── archive_status
├── pg_xact #存储事务提交状态数据。
├── postgresql.auto.conf #作用同 postgresql.conf ,优先级高于 postgresql.conf,在数据库中通过alter命令更改的参数记录在此文件中。
├── postgresql.conf #数据库实例主配置文件,基本上所有的数据库参数配置都在此文件中。
├── postmaster.opts #存储上一次启动该数据库时用到的命令。
└── postmaster.pid #锁文件,只有在 postgresql 服务运行时存在,存储当前 postmaster 的 PID,PGDATA,postmaster 启动时间,端口号,Unix-domain socket 目录,第一个有效的 listen_address,共享内存的 segment ID
base目录存储用户创建的数据库文件,及隶属于用户数据库的所有关系,比如表、索引等。
base目录结构分为两级,第一级结构如下图所示,一级目录名是用户数据库对象的OID,1代表的是postgres数据库,一级目录内的二级子文件都是隶属于该数据库对象的关系,包括表、索引、视图等。
主表数据文件
或索引数据文件
。├── base
│?? ├── 1 #用户数据库对象的OID,1代表的是postgres数据库
│?? │?? ├── 112 #隶属于该数据库对象的关系,包括表、索引、视图等。
│?? │?? ├── ...
│?? │?? ├── 828
│?? │?? ├── pg_filenode.map
│?? │?? └── PG_VERSION
│?? ├── 4
│?? │?? ├── 112 #以关系OID命名的是主数据文件
│?? │?? ├── 113
│?? │?? ├── 1247
│?? │?? ├── 1247_fsm #以_fsm结尾的是空闲空间映射文件
│?? │?? ├── 1247_vm #以_vm结尾的是可见性映射文件
│?? │?? ├── ...
│?? │?? ├── 828
│?? │?? ├── pg_filenode.map
│?? │?? └── PG_VERSION
│?? └── 5
│?? ├── 112
│?? ├── 113
│?? ├── 1247
│?? ├── 1247_fsm
│?? ├── 1247_vm
│?? ├── ...
│?? ├── 828
│?? ├── pg_filenode.map
│?? └── PG_VERSION
主数据文件的层级结构图?
??
?page内部结构的元数据信息表
名称 | 作用 | |||
---|---|---|---|---|
1 | pd_lsn | 最近一次变更写入的XLOG记录对应的LSN | ||
2 | pd_checksum | checksum | ||
3 | pd_lower | 指向行指针的末尾 | ||
4 | pd_upper | 指向最新堆元组的起始位置 | ||
5 | pd_flags | 标记位 | ||
6 | pd_linp | 行指针:指向堆元组的指针数组 |
第三方
tuple内部结构的元数据信息表
名称 | 作用 | |||
---|---|---|---|---|
1 | t_xmin | tuple插入时的XID | ||
2 | t_xmax | tuple更新或剧除时的XID | ||
3 | t_cid | command Io | ||
4 | t_ctid | TID:BLOCK_ID和行指针偏移号 | ||
5 | t_infomask | 状态位:方便检查元组xmin和xmax对应事务的状恋,避免频繁访问共享内存 | ||
6 | tinfomask2 | 状态位:标记HOT |
FSM是空闲空间映射文件,记录着heap和index的每个page的空闲空间信息,有利于快速定位到有充足空闲空间的page以便存储tuple,如果没有定位到则需要扩展新page。除了Hash Index文件没有FSM文件,其他heap和index都需要FSM文件。
总体上,FSM采用3-4级多叉树的结构组织FSM page,单个FSM page内部采用完全二叉树的结构进行管理,高级别FSM page的叶子节点关联低级别的FSM page,低级别FSM Page的叶子节点存储着heap、index page的可用空间数目,而非叶子结点依次存储叶子节点的最大可用空间数目,每个节点占用1个字节。
global目录存储pg_control及数据库集群维度的数据库及其关系,非客户维度的数据,例如pg_database、pg_class等。目录内的文件结构和base是一致的。
[postgres@postgre-sql data2]$ ls -l global/
总用量 540
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1213
-rw-------. 1 postgres postgres 24576 12月 16 09:37 1213_fsm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1213_vm
-rw-------. 1 postgres postgres 0 12月 16 09:37 1214
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1232
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1233
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1260
-rw-------. 1 postgres postgres 24576 12月 16 09:37 1260_fsm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1260_vm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1261
-rw-------. 1 postgres postgres 24576 12月 16 09:37 1261_fsm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1261_vm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1262
-rw-------. 1 postgres postgres 24576 12月 16 09:37 1262_fsm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 1262_vm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 2396
-rw-------. 1 postgres postgres 24576 12月 16 09:37 2396_fsm
-rw-------. 1 postgres postgres 8192 12月 16 09:37 2396_vm
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2397
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2671
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2672
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2676
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2677
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2694
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2695
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2697
-rw-------. 1 postgres postgres 16384 12月 16 09:37 2698
-rw-------. 1 postgres postgres 0 12月 16 09:37 2846
-rw-------. 1 postgres postgres 8192 12月 16 09:37 2847
-rw-------. 1 postgres postgres 0 12月 16 09:37 2964
-rw-------. 1 postgres postgres 8192 12月 16 09:37 2965
-rw-------. 1 postgres postgres 0 12月 16 09:37 2966
-rw-------. 1 postgres postgres 8192 12月 16 09:37 2967
-rw-------. 1 postgres postgres 0 12月 16 09:37 3592
-rw-------. 1 postgres postgres 8192 12月 16 09:37 3593
-rw-------. 1 postgres postgres 0 12月 16 09:37 4060
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4061
-rw-------. 1 postgres postgres 0 12月 16 09:37 4175
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4176
-rw-------. 1 postgres postgres 0 12月 16 09:37 4177
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4178
-rw-------. 1 postgres postgres 0 12月 16 09:37 4181
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4182
-rw-------. 1 postgres postgres 0 12月 16 09:37 4183
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4184
-rw-------. 1 postgres postgres 0 12月 16 09:37 4185
-rw-------. 1 postgres postgres 8192 12月 16 09:37 4186
-rw-------. 1 postgres postgres 0 12月 16 09:37 6000
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6001
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6002
-rw-------. 1 postgres postgres 0 12月 16 09:37 6100
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6114
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6115
-rw-------. 1 postgres postgres 0 12月 16 09:37 6243
-rw-------. 1 postgres postgres 0 12月 16 09:37 6244
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6245
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6246
-rw-------. 1 postgres postgres 8192 12月 16 09:37 6247
-rw-------. 1 postgres postgres 16384 12月 16 09:37 6302
-rw-------. 1 postgres postgres 16384 12月 16 09:37 6303
-rw-------. 1 postgres postgres 16384 12月 16 09:37 pg_internal.init
-rw-------. 1 postgres postgres 8192 12月 16 09:37 pg_control
-rw-------. 1 postgres postgres 524 12月 16 09:37 pg_filenode.map
pg_wal是WAL机制中的wal日志存储目录。PG10及之后的高版本改目录名为pg_wal,10之前目录名称是pg_xlog。
WAL(Write-Ahead-Logging)机制:日志先行机制。数据变更优先写入日志文件,事务失败则变更记录被忽略,事务成功再选择合适时机写入数据文件,数据的刷盘速度慢于日志刷盘速度。当数据库系统崩溃后,引擎会从上一次成功的checkpoint点开始依次重放wal记录,如果LSN>pd_lsn则重放wal记录,反之跳过,确保数据记录恢复到崩溃前的状态。
??
wal segment 文件存储着数据库行记录明细,每一条记录明细都是服务于数据库恢复操作的,确保前后数据一致。首先针对数据的任意一次修改操作均被记录在wal段文件中,包括insert、update和delete,其次系统的一些管理行为也会被记录在wal段文件中,例如事务提交和vacuum等行为。
wal segment 文件命名形如00000046 00000000 000000F3,文件名共24位,
前8位是timeline,
中间8位是logid
后8位是logseg,
logseg的前6位始终是0,
后2位是lsn的前2位。
根据wal段文件名的最后2位,wal记录根据对应的LSN分别记录在不同的wal段文件中。
-rw-------. 1 postgres postgres 16777216 12月 15 12:28 000000010000000000000003
-rw-------. 1 postgres postgres 16777216 12月 15 11:53 000000010000000000000004
-rw-------. 1 postgres postgres 16777216 12月 15 11:54 00000002.history
-rw-------. 1 postgres postgres 16777216 12月 15 11:54 000000020000000000000001
drwx------. 2 postgres postgres 6 12月 13 15:51 archive_status
g_xact是事务提交日志(Commit Log)的存储目录,事务提交日志默认256KB,文件名形如NNNN,系统初始化后从0000开始递增至FFFF。PG 10及之后的高版本改目录名为pg_xact,10之前目录名称是pg_clog。
[postgres@postgre-sql data2]$ ls -l pg_xact/
总用量 8
-rw-------. 1 postgres postgres 8192 12月 16 09:37 0000
[postgres@postgre-sql data2]$
Commit Log : 事务提交日志存储数据库的单个事务运行状态。Commit Log由共享内存中一组8KB的page组成,每个page包含一列数组,每个数组元素包含XID和该事物的实时状态。当page不足时,创建新的page来存储新的事务。
当pg_hba.conf
使用ident认证方式时,需要建立映射用户或具备同名用户。
ident是Linux下PostgreSQL默认的local认证方式,
凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。
pg_ident.conf就是用来配置哪些操作系统用户映射为哪些数据库用户的。
如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。
pg_ident.conf的格式如下:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
[postgres@postgre-sql data2]$
usermap
为映射名,要在pg_hba.conf中用到,多个映射可以共用同一个映射名,username
为操作系统用户名,dbuser
为映射到的数据库用户。pg_hba.conf
的格式如下:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
local all all ident map=mapzy
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
[postgres@postgre-sql data2]$
map
是pg_hba.conf
的auth-options
选项,map=mapzy
指示该认证条件使用mapzy
映射。
指定映射后原本的同名操作系统用户就不能连接数据库了。
postgresql.auto.conf
的优先级高于postgresql.conf
,
如果一个参数同时存在postgresql.auto.conf
和postgresql.conf
里面,系统会先读postgresql.auto.conf
的参数配置。
使用alter system set
修改的是postgresql.auto.conf
文件的内容,postgresql.conf
则是通过文本编辑方式修改。
比如执行alter system set max_wal_size=default
将参数设回 default
时,postgresql.auto.conf
文件里的max_wal_size
这项配置会被删除,重新用回postgresql.conf
文件的设置。
postgresql.conf
文件内容太多, 详细内容另开一篇文件来讲。postgresql.conf
文件的参数后面有# (change requires restart),表示必须重启才能生效,使用select pg_reload_conf()
或pg_ctl reload
不行。
[postgres@postgre-sql data]$ cat postmaster.pid
4856
/data/16.1/data
1702532710
5432
/tmp
*
34133634 6
ready
[postgres@postgre-sql data]$ ipcs
--------- 消息队列 -----------
键 msqid 拥有者 权限 已用字节数 消息
------------ 共享内存段 --------------
键 shmid 拥有者 权限 字节 nattch 状态
0x0208d682 6 postgres 600 56 6
--------- 信号量数组 -----------
键 semid 拥有者 权限 nsems
[postgres@postgre-sql data]$ echo 0x0208d682 | printf "%d\n" $(cat)
34133634
[postgres@postgre-sql data]$
通过ipcs命令查看共享内存的地址信息
可以看到shared memory segments中的key是0x0208d682
0x0208d682十六进制转换为十进制为34133634,正好等于第一个数字,即为共享内存的key。
第二个数字为shmid的值,即为共享内存的id。
?