暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 12 新特性学习-实用程序功能增强、扩展调整

原创 柚子身上依 2025-02-27
201

1.实用程序

PostgreSQL 11 新特性学习-参数、实用程序、扩展调整
介绍实用程序命令的主要增强功能。

1.1.configure

“--disable-strong-random”选项已从从源代码安装 PostgreSQL 时运行的“configure”命令中删除。

1.2.initdb

initdb 命令现在在确定数据库集群的时区时引用 /etc/localtime 文件。如果未指定环境变量 TZ,则引用此文件。

1.3.oid2name

已查看 oid2name 命令的选项,现在可以使用长名称选项。

短命令选项 长命令选项 描述
-f --filenode File node specification
-i --indexes Include index and sequence
-o --oid Specify OID
-q --quiet Omit header
-s --tablespaces Show tablespace OID
-S --system-objects Contains system objects
-t --table Specify table name
-x --extended Output additional information
-d --dbname Database to connect to
-h --host Hostname to connect to (-H option is deprecated)
-p --port Port number to connect to
-U --username Database username

1.4.pg_basebackup

指定 --write-recovery-conf 参数 (-R) 时,pg_basebackup 命令的行为已更改。standby.signal 文件将在备份目标文件夹中自动创建,primary_conninfo 参数将添加到 postgresql.auto.conf 文件中。仅当连接到 PostgreSQL 12 或更高版本的实例时,才会执行此行为。

$ pg_basebackup -D back -R
$ ls -l back
...
...
-rw------- 1 postgres postgres   451 Feb 25 03:18 postgresql.auto.conf
-rw------- 1 postgres postgres 26802 Feb 25 03:18 postgresql.conf
-rw------- 1 postgres postgres     0 Feb 25 03:18 standby.signal

$ cat back/postgresql.auto.conf 
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
logging_collector = 'on'
allow_system_table_mods = 'on'
primary_conninfo = 'user=postgres passfile=''/var/lib/postgresql/.pgpass'' channel_binding=prefer port=5432 sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

1.5.pg_checksums

用于检查校验和完整性的命令 pg_verify_checksums 已重命名为 pg_checksums。除了检查校验和的完整性外,现在还可以更改校验和的激活/停用。

Options:
  -c, --check              check data checksums (default)
  -d, --disable            disable data checksums
  -e, --enable             enable data checksums
...
...

指定 --check 选项以检查块的完整性。如果确认一致性错误,则命令以返回值 1 结束。

$ pg_checksums -D data --check 
Checksum operation completed 
Files scanned:  973 
Blocks scanned: 11187 
Bad checksums:  0 
Data checksum version: 1 
$ echo $? 
0 
$

指定 --enable 选项(–disable 选项可禁用)以启用数据库集群校验和。即使启用了校验和,也会执行一致性检查。

$ pg_checksums -D data --enable 
Checksum operation completed 
Files scanned:  973 
Blocks scanned: 11187 
pg_checksums: syncing data directory 
pg_checksums: updating control file 
Checksums enabled in cluster 
$ 

必须在实例成功关闭的情况下运行此命令。如果实例异常终止或无法执行,则数据库集群在实例启动期间。

$ pg_ctl -D data -m immediate stop 
waiting for server to shut down.... done server stopped  
$ pg_checksums -D data --check 
pg_checksums: cluster must be shut down 
$

指定 --progress 选项(-P 选项)以显示处理状态。

$ pg_checksums -D data --check --progress 
87/87 MB (100%) computed 
Checksum operation completed 
Files scanned:  973 
Blocks scanned: 11187 
Bad checksums:  0 
Data checksum version: 1 

1.6.pg_ctl

pg_ctl 命令中添加了以下功能。

  • logrotate

pg_ctl 命令中新增用于日志轮换的参数 logrotate。过去,需要向 logger 进程发送 SIGHUP 信号。要禁止显示该消息,请同时指定 -s 参数。

$ pg_ctl -D data logrotate
server signaled to rotate log file

1.7.pg_dump

pg_dump 命令中添加了以下选项。

  • --on-conflict-do-nothing

此选项自动将 ON CONFLICT DO NOTHING 子句分配给输出 INSERT 语句。必须使用 --inserts 选项或 --column-inserts 选项指定。

$ pg_dump -t data1 --inserts --on-conflict-do-nothing 
-- 
-- PostgreSQL database dump 
… 
-- Data for Name: data1; Type: TABLE DATA; Schema: public; Owner: demo 
-- 

INSERT INTO public.data1 VALUES (1, 'data1') ON CONFLICT DO NOTHING; 
INSERT INTO public.data1 VALUES (2, 'data1') ON CONFLICT DO NOTHING; 
… 
  • --extra-float-digits

如果为此参数指定了整数值,则在使用 pg_dump 命令进行数据采集之前执行 “SET extra_float_digits = specified value” 语句。转储文件不包含 SET 语句。可以指定的值范围是 -15 到 3。如果指定了非数字值,则将其视为 0。

  • --rows-per-insert

此选项与 --inserts 选项一起使用。可以在单个 INSERT 语句中插入多个元组。值的范围是 1 到 2,147,483,647。

$ pg_dump -t data1 --inserts --rows-per-insert=2 
-- 
-- PostgreSQL database dump 
… 
-- Data for Name: data1; Type: TABLE DATA; Schema: public; Owner: postgres 
-- 
INSERT INTO public.data1 VALUES 
(1, 'data1'), 
(2, 'data1'); 
INSERT INTO public.data1 VALUES 
(3, 'data1'), 
… 

1.8.pg_dumpall

pg_dumpall 命令中添加了以下选项。

  • --extra-float-digits

如果为此参数指定了整数值,则在使用 pg_dumpall 命令进行数据采集之前执行 “SET extra_float_digits = specified value” 语句。转储文件不包含 SET 语句。可以指定的值范围是 -15 到 3。如果指定了非数字值,则将其视为 0。

pg_dumpall -f all2.sql --extra-float-digits=-1
  • --exclude-database

在 PostgreSQL 12 中,添加了 --exclude-database 选项。此选项指定要从备份中排除的数据库。指定多个数据库时,请使用与 psql 命令相同的模式。也可以多次指定相同的选项。在以下示例中,db1 和 db2 被指定为排除数据库。

$ pg_dumpall --exclude-database='db1' --exclude-database='db2' -f alldump.sql
  • --oids

此选项已被删除。

  • 其他注释

在输出文件中添加了用户设置(ALTER USER SET 语句)和数据库设置的注释

-- User Configurations 
-- User Config {User_name} 
-- Databases 
-- Database {Database_name} dump

1.9.pg_rewind

pg_rewind 命令中添加了不执行存储同步系统调用的 --no-sync 选项。

Options:
...
...
  -N, --no-sync                  do not wait for changes to be written
...
...

1.10.pg_restore

将标准输出指定为数据输出目标时,请指定 “-f -”。

$ pg_dump -Fc db1|pg_restore -c -f -

1.11.pg_upgrade

pg_upgrade 命令中添加了以下选项。

  • --socketdir

添加了 --socketdir 选项(或 -s 选项),用于指定用于创建本地套接字的目录。

Options:
...
  -s, --socketdir=DIR           socket directory to use (default current dir.)
...
  • --clone

–clone 选项使用 “reflink” 功能执行快速克隆。此功能仅在某些操作系统和文件系统上可用。

Options:
...
  --clone                       clone instead of copying files to new cluster
...

1.12.psql

psql 命令中添加了以下功能。

  • CSV format

psql 命令的输出格式可以更改为 CSV 格式。可以通过以下任一方式更改它。

指定 psql 命令参数 --csv
从 psql 命令中执行 “pset format csv” 命令

列分隔符的默认值是逗号 (,),但可以通过 “\pset csv_fieldsep” 命令进行更改。如果输出值包含分隔符,则该值用双引号 (“) 括起来。可以使用 “\pset tuples_only on” 命令抑制列标题。

postgres=# \pset format csv
Output format is csv.
postgres=#  \pset csv_fieldsep
Field separator for CSV is ",". 

postgres=# SELECT * FROM t;
id,n
1,a
  • 显示分区表

在执行 \d 命令时,分区表会显式输出。

postgres=# \d+ part1
                                    Partitioned table "public.part1"
 Column |         Type          | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
 c1     | numeric               |           |          |         | main     |              | 
 c2     | character varying(10) |           |          |         | extended |              | 
Partition key: RANGE (c1)
Partitions: part1v1 FOR VALUES FROM ('0') TO ('100'),
            part1v2 FOR VALUES FROM ('100') TO ('200')

现在显示分区索引的表空间。

postgres=#  \d idx1_part1
       Partitioned index "public.idx1_part1"
 Column |         Type          | Key? | Definition 
--------+-----------------------+------+------------
 c2     | character varying(10) | yes  | c2
btree, for table "public.part1"
Tablespace: "ts1"

postgres=# \db
               List of tablespaces
    Name    |  Owner   |        Location         
------------+----------+-------------------------
 pg_default | postgres | 
 pg_global  | postgres | 
 ts1        | postgres | /var/lib/postgresql/ts1
(3 rows)

  • 显示对象权限

分区表现在在对象权限列表中指定。

postgres=# \z part4  
                                   Access privileges
 Schema | Name  |       Type        | Access privileges | Column privileges | Policies 
--------+-------+-------------------+-------------------+-------------------+----------
 public | part4 | partitioned table |                   |                   | 
(1 row)
  • 显示连接信息

现在,在执行 \conninfo 命令时,会输出 TCP/IP 地址。

$ psql -h 127.1   
psql (12.20 (Debian 12.20-1.pgdg120+1))
Type "help" for help.

postgres=# \conninfo
You are connected to database "postgres" as user "postgres" on host "127.1" (address "127.0.0.1") at port "5432".
  • 具有 VERBOSITY 的 SQLSTATE

现在可以在 “\set VERBOSITY” 命令中指定 SQLSTATE。

postgres=> \set VERBOSITY sqlstate 
postgres=> SELECT * FROM not_exists ; 
psql: ERROR:  42P01
  • 分区表的显示

新增仅显示分区表的 “\dP” 命令。

postgres=# \dP
               List of partitioned relations
 Schema |    Name    |  Owner   |       Type        | Table 
--------+------------+----------+-------------------+-------
 public | fkey1      | postgres | partitioned table | 
 public | part1      | postgres | partitioned table | 
 public | part2      | postgres | partitioned table | 
 public | part3      | postgres | partitioned table | 
 public | part4      | postgres | partitioned table | 
 public | parttbs    | postgres | partitioned table | 
 public | fkey1_pkey | postgres | partitioned index | fkey1
 public | idx1_part1 | postgres | partitioned index | part1
(8 rows)
  • 显示手动 URL
    使用 \h 命令指定 DDL 会显示相应手册的 URL。
postgres=#  \h create index
Command:     CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
    ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    [ WHERE predicate ]

URL: https://www.postgresql.org/docs/12/sql-createindex.html

1.13.vacuumdb

以下选项已添加到 vacuumdb 命令中。

  • --disable-page-skipping
    此选项用于从命令行执行 VACUUM (DISABLE_PAGE_SKIPPING) 语句。可以为 PostgreSQL 9.6 或更高版本的实例指定此选项。
$ vacuumdb --disable-page-skipping
vacuumdb: vacuuming database "postgres"
  • --skip-locked

此选项用于从命令行执行 VACUUM (SKIPP_LOCKED) 语句。可以为 PostgreSQL 12 或更高版本的实例指定此选项。

$  vacuumdb --skip-locked
vacuumdb: vacuuming database "postgres"
  • --min-mxid-age

仅在multixact ID 年龄至少为mxid_age的表上执行 vacuum 或 analyze 命令。

  • --min-xid-age

仅在事务ID 年龄至少为xid_age的表上执行 vacuum 或 analyze 命令。

1.14.vacuumlo

vacuumlo 命令现在有一个可用的长名称选项。

短命令选项 长命令选项 描述
-l --limit The upper limit of objects to delete
-n --dry-run Not actually run
-v --verbose The output of additional information
-h --host Connect host
-p --port Connect port number
-U --username Connect user name
-w --no-password Do not output password prompt
-W --password Force password input

2.扩展调整

描述与 contrib 模块相关的新功能。

2.1.auto_explain

  • auto_explain.log_level
postgres=#  LOAD 'auto_explain' ;
LOAD
postgres=# SET auto_explain.log_level = NOTICE ;
SET
postgres=# SET auto_explain.log_min_duration = 0 ;
SET
postgres=# select * from api limit 1;
NOTICE:  duration: 0.079 ms  plan:
Query Text: select * from api limit 1;
Limit  (cost=0.00..0.21 rows=1 width=36)
  ->  Seq Scan on api  (cost=0.00..1.05 rows=5 width=36)
 id |                          jdoc                           
----+---------------------------------------------------------
  1 | {"guid": "1", "name": "Item 1", "tags": ["qui", "foo"]}
(1 row)
  • auto_explain.log_settings

确定是否将更改的优化器相关参数输出到日志中。默认值为 ‘off’,因此不会输出日志。

postgres=# LOAD 'auto_explain' ;
LOAD
postgres=# SET auto_explain.log_min_duration = 0 ;
SET
postgres=# set random_page_cost=8;
SET
postgres=# select * from api limit 1;
 id |                          jdoc                           
----+---------------------------------------------------------
  1 | {"guid": "1", "name": "Item 1", "tags": ["qui", "foo"]}
(1 row)

日志
2025-02-26 07:51:32.933 UTC [3004] LOG:  duration: 0.020 ms  plan:
        Query Text: select * from api limit 1;
        Limit  (cost=0.00..0.21 rows=1 width=36)
          ->  Seq Scan on api  (cost=0.00..1.05 rows=5 width=36)
        Settings: random_page_cost = '8'
  • auto_explain.sample_rate

指定日志输出的采样率。默认值为 1,输出所有的 SQL 语句。

  • 添加 JIT 编译信息

JIT 编译信息现在输出到日志中(向后移植到 PostgreSQL 11.2)。

2025-02-26 08:30:39.585 UTC [3004] LOG:  duration: 1.828 ms  plan:
        Query Text: select count(1) from t;
        Aggregate  (cost=1.01..1.02 rows=1 width=8)
          ->  Seq Scan on t  (cost=0.00..1.01 rows=1 width=0)
        Settings: jit_above_cost = '1', random_page_cost = '8'
        JIT:
          Functions: 2
          Options: Inlining false, Optimization false, Expressions true, Deforming true

2.2.citext

添加了计算 64 位哈希值的 citext_hash_extended。第二个参数指定 SEED。

postgres=# create extension citext;
CREATE EXTENSION
postgres=# CREATE TABLE users (
postgres(#     username CITEXT,
postgres(#     email CITEXT
postgres(# ) PARTITION BY HASH (citext_hash_extended(username, 0));
CREATE TABLE
postgres=# CREATE TABLE users_part1 PARTITION OF users
postgres-#     FOR VALUES WITH (MODULUS 4, REMAINDER 0);

CREATE TABLE users_part2 PARTITION OF users
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE
postgres=# 
postgres=# CREATE TABLE users_part2 PARTITION OF users
postgres-#     FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE
postgres=# 
postgres=# CREATE TABLE users_part3 PARTITION OF users
postgres-#     FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE
postgres=# 
postgres=# CREATE TABLE users_part4 PARTITION OF users
postgres-#     FOR VALUES WITH (MODULUS 4, REMAINDER 3);
CREATE TABLE
postgres=# INSERT INTO users (username, email) VALUES ('Admin', 'admin@example.com');
INSERT 0 1
postgres=# INSERT INTO users (username, email) VALUES ('User1', 'user1@example.com');
INSERT 0 1
postgres=# INSERT INTO users (username, email) VALUES ('User2', 'user2@example.com');
INSERT 0 1
postgres=# SELECT * FROM users;
 username |       email       
----------+-------------------
 Admin    | admin@example.com
 User1    | user1@example.com
 User2    | user2@example.com
(3 rows)

postgres=# select citext_hash_extended(username, 0) from users;
 citext_hash_extended 
----------------------
 -5410357177159054500
  -548550277032800196
 -1221930631176555206
(3 rows)

2.3.hstore

添加了 hstore_hash_extended 以计算 64 位哈希值。第二个参数指定 SEED。

postgres=# create extension hstore;
CREATE EXTENSION
postgres=# CREATE TABLE my_table (
postgres(#     id SERIAL,
postgres(#     data HSTORE
postgres(# ) PARTITION BY HASH (hstore_hash_extended(data, 12345));
CREATE TABLE
postgres=# INSERT INTO my_table (data) VALUES 
postgres-#     ('"key1"=>"value1", "key2"=>"value2"'),
postgres-#     ('"key3"=>"value3", "key4"=>"value4"'),
postgres-#     ('"key5"=>"value5", "key6"=>"value6"');
ERROR:  no partition of relation "my_table" found for row
DETAIL:  Partition key of the failing row contains (hstore_hash_extended(data, 12345::bigint)) = (9012811922705927596).
postgres=# 
postgres=# 
postgres=# CREATE TABLE my_table_part2 PARTITION OF my_table FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE
postgres=# CREATE TABLE my_table_part1 PARTITION OF my_table FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE
postgres=# CREATE TABLE my_table_part3 PARTITION OF my_table FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE
postgres=# CREATE TABLE my_table_part4 PARTITION OF my_table FOR VALUES WITH (MODULUS 4, REMAINDER 3);
CREATE TABLE
postgres=# INSERT INTO my_table (data) VALUES 
    ('"key1"=>"value1", "key2"=>"value2"'),
    ('"key3"=>"value3", "key4"=>"value4"'),
    ('"key5"=>"value5", "key6"=>"value6"');
INSERT 0 3
postgres=# SELECT 
postgres-#     id,
postgres-#     data,
postgres-#     hstore_hash_extended(data, 12345) AS hash_value
postgres-# FROM 
postgres-#     my_table;
 id |                data                |     hash_value      
----+------------------------------------+---------------------
  4 | "key5"=>"value5", "key6"=>"value6" | 6442377617269448344
  3 | "key3"=>"value3", "key4"=>"value4" | 1241036135797765354
  2 | "key1"=>"value1", "key2"=>"value2" | 9012811922705927596
(3 rows)

2.4.pg_stat_statements

pg_stat_statements 模块的 pg_stat_statements_reset 功能新增了限制统计信息删除范围的参数。可以通过指定数据库 ID、用户 ID 和查询 ID 来删除统计信息。如果省略这些参数(默认值为 0),则将像以前一样丢弃所有统计信息。


postgres=#  \dfS pg_stat_statements_reset
                                                        List of functions
 Schema |           Name           | Result data type |                        Argument data types                         | Type 
--------+--------------------------+------------------+--------------------------------------------------------------------+------
 public | pg_stat_statements_reset | void             | userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0 | func
(1 row)

拥有 pg_read_all_stats 角色的用户无法执行此函数。

2.5.postgres_fdw

postgres_fdw 模块添加了一个 “options” 选项,用于指定可以在远程会话中运行的 GUC 选项。例如,可以更改 work_mem 参数和 geqo 参数的设置。设置值以 “-c parameter name = value” 格式描述。指定多个参数时,请指定整个 “-c parameter_name = value” ,并用空格分隔。

postgres=# CREATE SERVER remsvr1 FOREIGN DATA WRAPPER postgres_fdw  OPTIONS (host '172.17.0.5', options '-c work_mem=4MB') ;
CREATE SERVER
postgres=# ALTER SERVER remsvr1 OPTIONS (SET options '-c work_mem=16MB -c geqo=off') ;
ALTER SERVER
postgres=#  SELECT * FROM pg_foreign_server ;
  oid  | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl |                        srvoptions                        
-------+---------+----------+--------+---------+------------+--------+----------------------------------------------------------
 74084 | remsvr1 |       10 |  74083 |         |            |        | {host=172.17.0.5,"options=-c work_mem=16MB -c geqo=off"}
(1 row)

参考

《PostgreSQL_12_GA_New_Features_en_20191011-1》

最后修改时间:2025-02-27 12:31:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论