首页
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云PolarDB一体化解决方案
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源

在数据库管理和维护的世界中,效率和可靠性始终是DBA(数据库管理员)追求的核心目标。随着技术的不断进步,数据库系统也在持续地演化,以满足日益增长的业务需求和挑战。PostgreSQL 16 版本引入了一系列的新特性,旨在简化日常管理任务,增强系统的自动化能力,以及提供更为深入的性能分析工具,从而帮助DBA们更加高效地处理数据库的维护和优化工作。本篇文章,旨在让大家快速了解PostgreSQL 16 中一些有助于提升DBA工作效率的新特性。

pg_dump增强

  1. 新增支持lz4算法和zstd算法,压缩效率得到了提升,下面是一个示例:
    创建一个users

    1. CREATE TABLE IF NOT EXISTS users (
    2. id serial PRIMARY KEY,
    3. account_name VARCHAR(60),
    4. name VARCHAR(60),
    5. password VARCHAR(60),
    6. email VARCHAR(60),
    7. created_at TIMESTAMP,
    8. phone CHAR(11),
    9. address VARCHAR(100),
    10. ssn VARCHAR(18)
    11. );

    通过copy写入100万行数据

    1. -- users表写入了100万行数据
    2. postgres=# select count(*) from users;
    3. count
    4. ---------
    5. 1000000
    6. (1 row)

    查看表大小

    1. postgres=# select pg_size_pretty(pg_total_relation_size(oid)) from pg_class where relname='users';
    2. pg_size_pretty
    3. ----------------
    4. 208 MB
    5. (1 row)

    接下来我们使用pg_dump将其导出

    1. # 不使用任何压缩算法
    2. pg_dump --table=users --dbname=postgres -f users.sql
    3. [pg16@Rocky8_PG01:/home/pg16]$du -sh users.sql
    4. 165M users.sql
    5. # 使用lz4压缩算法
    6. pg_dump --table=users --dbname=postgres -f users_lz4.sql --compress=lz4
    7. [pg16@Rocky8_PG01:/home/pg16]$du -sh users_lz4.sql
    8. 127M users_lz4.sql
    9. # 使用zstd压缩算法
    10. pg_dump --table=users --dbname=postgres -f users_zstd.sql --compress=zstd
    11. [pg16@Rocky8_PG01:/home/pg16]$du -sh users_zstd.sql
    12. 75M users_zstd.sql
  2. 新增导出子表和分区表的功能,PostgreSQL 16之前,需要使用-t 显式指定分区表或者使用通配符匹配,但这都不完美,要么就是需要指定很多的分区表,要么就是模糊匹配有可能与其他表名重叠。而PostgreSQL 16的pg_dump新增的几个选项完美地解决了这个问题。

VACUUM和VACUUMDB增强

VACUUM新增BUFFER_USAGE_LIMIT参数

设置vacuum时可以使用shadred buffer的大小,以下是几点注意事项:

使用示例:

  1. postgres=# VACUUM (ANALYZE, BUFFER_USAGE_LIMIT '128kB') users;
  2. VACUUM

单独指定FULL时会报错

  1. postgres=# VACUUM (FULL, BUFFER_USAGE_LIMIT '128kB') users;
  2. ERROR: BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL

使用FULL加ANALYZE时则可以正常执行

  1. postgres=# VACUUM (FULL, ANALYZE, BUFFER_USAGE_LIMIT '128kB') users;
  2. VACUUM

PostgreSQL 16 还贴心地新增了一个数据库参数vacuum_buffer_usage_limit,默认值为256kB

  1. postgres=# show vacuum_buffer_usage_limit ;
  2. vacuum_buffer_usage_limit
  3. ---------------------------
  4. 256kB
  1. -- 携带SKIP_DATABASE_STATS选项先不刷新FrozenXID
  2. postgres=# VACUUM (ANALYZE, BUFFER_USAGE_LIMIT '128kB', SKIP_DATABASE_STATS) users warehouse;
  3. -- 使用ONLY_DATABASE_STATS选项刷新FrozenXID
  4. postgres=# VACUUM (BUFFER_USAGE_LIMIT '128kB', ONLY_DATABASE_STATS);

注意:ONLY_DATABASE_STATS除了VERBOSE和BUFFER_USAGE_LIMIT不能跟其他选项一起使用,也不能指定table_and_columns

清理TOAST表

VACUUUM可以使用下面的选项:

VACUUMDB则可以使用:

VACUUMDB 排除指定模式

死元组清理性能提升