【参赛作品7】PostgreSQL/openGauss数据库易犯的十大错误

本文总结了在 PostgreSQL 和 openGauss 数据库使用过程中常见的十个误区,包括日志配置不当、序列管理不善、权限理解错误等方面的问题,并提供了相应的解决方案。

总结十点PostgreSQL/openGauss数据库中容易犯的错误。

1.同时设置日志行前缀和csvlog格式

比较常见大家同时配置下面这两个参数

log_line_prefix = '%m %u %d %p'
log_destination='csvlog'
  • %m是带毫秒的时间戳
  • %u是用户名
  • %d是数据库名
  • %p是进程ID

然后当我们配置为csvlog日志时,日志行的内容项是固定的,所以当我们需要配置日志前缀,精简日志行的内容项时,log_destination不能配置为csvlog。下面是正确的配置:

log_destination='stderr'
log_line_prefix = '%m %u %d %p'

2.不符合预期的日志轮换策略

日志轮换策略可以通过log_rotation_size参数按日志文件大小控制或者通过log_rotation_age参数按时间控制,但下面这四个参数需要合理组合使用。

log_filename
log_truncate_on_rotation
log_rotation_age
log_rotation_size
  • 方案一:每天生成一个新的日志文件

    log_filename='postgresql-%Y-%m-%d.log'
    log_truncate_on_rotation=off
    log_rotation_age=1d
    log_rotation_size=0
    
  • 方案二:写满固定大小(如10MB),则进行切换

    log_filename='postgresql-%Y-%m-%d_%H%M%S.log'
    log_truncate_on_rotation=off
    log_rotation_age=0
    log_rotation_size=10MB
    

    这种方案我们一般是为了根据时间去查看日志,文件名根据日志量可以设置到时分秒,但这里设置log_rotation_size并不能严格控制固定大小。

  • 方案三:保留固定天数的日志并循环覆盖,例如固定一周或者固定一个月

    log_filename='postgresql-%u.log'
    log_truncate_on_rotation=on
    log_rotation_age=1d
    log_rotation_size=0
    

log_filename常见的通配符变量

  • %u是星期的数字表示,范围是[1,7],1代表星期一
  • %w也是星期的数字表示,范围是[0,6],0代表星期天
  • %d是月份中的天数表示,范围是[01,31]

生产环境第三种方案更合适一些。

3.同步复制表的序列

看看下面这个例子,我们创建test表使用serial自增序列类型,系统帮我们生成了test_id_seq序列。

postgres=# create table test(id serial primary key,name varchar unique);
CREATE TABLE
postgres=# \d test
                                 Table "public.test"
 Column |       Type        | Collation | Nullable |             Default              
--------+-------------------+-----------+----------+----------------------------------
 id     | integer           |           | not null | nextval('test_id_seq'::regclass)
 name   | character varying |           |          | 
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)
    "test_name_key" UNIQUE CONSTRAINT, btree (name)

当我们复制t_test表时,test表的序列引用也同时复制过来了,可以使用虚拟生成列来解决这个问题。

postgres=# create table t_test(like test including all);
CREATE TABLE
postgres=# \d t_test
                                Table "public.t_test"
 Column |       Type        | Collation | Nullable |             Default              
--------+-------------------+-----------+----------+----------------------------------
 id     | integer           |           | not null | nextval('test_id_seq'::regclass)
 name   | character varying |           |          | 
Indexes:
    "t_test_pkey" PRIMARY KEY, btree (id)
    "t_test_name_key" UNIQUE CONSTRAINT, btree (name)

openGauss对PG的这个问题做了修复,下面是openGauss复制t_test时,序列按表名做了区分。

omm=# \d t_test
                              Table "public.t_test"
 Column |       Type        |                      Modifiers                      
--------+-------------------+-----------------------------------------------------
 id     | integer           | not null default nextval('t_test_id_seq'::regclass)
 name   | character varying | 
Indexes:
    "t_test_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
    "t_test_name_key" UNIQUE CONSTRAINT, btree (name) TABLESPACE pg_default

4.跳变的序列值

创建序列seq1,设置cache为10,session A获取下一个值为1.

postgres=# create sequence seq1 cache 10;
CREATE SEQUENCE
postgres=# select nextval('seq1');
 nextval 
---------
       1
(1 row)

session B查询获取下一个值为11

postgres=# select nextval('seq1');
 nextval 
---------
      11
(1 row)

序列值插入为了保证连续性,要设置cache为1。

5.从任意库查询pg_stat_statements模块统计信息

pg_stat_statements模块用来跟踪SQL语句的执行统计信息,我们如果把该模块安装到postgres数据库,就只能连到postgres数据库进行查询,除非其它数据库也安装了该模块,否则会提示报错找不到。

无论任何操作,都需要连接到一个数据库,即使我们只想创建一个全局的数据库用户,所以选对数据库特别重要。

6.truncate操作理解为DML语句

log_statement参数控制日志记录级别,有4个选项:none、ddl、mod、all。开启ddl,它会记录 create、alter和drop相关的语句,但不记录truncate。

truncate在Oracle中属于DDL语句,在PostgreSQL中属于DML语句。因此,当我们使用DDL日志记录语句时,无法记录到Truncate。

7.认为数据库的owner可以管理其下所有对象

数据库、模式、表的都有自己的owner,他们都属于实例中的对象,数据库owner只是具有数据库这个对象的CTc权限。数据库的默认权限为:

  • 允许public角色连接,即允许任何人连接。
  • 不允许除了超级用户和owner之外的任何人在数据库中创建schema。
  • 会自动创建名为public的schema,这个schema的所有权限已经赋予给public角色,即允许任何人在里面创建对象。

schema使用注意事项:

schema的owner默认是该schema下的所有对象的owner,但是允许用户在别人的schema下创建对象,所以一个对象的owner和schema的owner可能不同,都有drop对象的权限。

8.认为public模式下的对象可以互相访问

public模式只是允许任何人在里面创建对象并管理自己的对象,并不能查看别人创建的对象。

9.创建索引时起名为表名称

单个数据库里,索引和表的名称不能重复,因为他们都属于relation。

postgres=# create index a on a(id);
ERROR:  relation "a" already exists

10.把walsender当作主库

通常我们从操作系统层查看主库有walsender,备库有walreceiver,并且walsender信息中可以看到备库的IP地址,可以初步判断主备状态正常。

但请注意有walsender或者数据库中能查到pg_stat_replication视图并不能断定是主库,仅在一主一备环境可以这样简单判断,下面的图可以看出,虽然有walsender,但它也是个备库。
在这里插入图片描述

在这里插入图片描述

Gauss松鼠会是汇集数据库爱好者和关注者的大本营,
大家共同学习、探索、分享数据库前沿知识和技术,
互助解决问题,共建数据库技术交流圈。
openGauss官网
<think>嗯,用户询问的是openGauss的配置文件位置和参数说明,很明显的运维操作需求。从ta直接引用五个相关技术文档来看,应该是数据库管理员或开发人员,正在处理具体的配置问题。用户提供的引用内容有些混乱,同时包含PostgreSQLopenGauss的混用描述(引用5明确提到openGauss)。需要特别注意区分:虽然openGauss源自PostgreSQL,但部分机制已经不同,比如配置路径和参数名称。核心需求点其实有两个:物理文件路径查找方法(包括默认位置和查询方式)、参数修改的注意事项。特别注意到用户引用了安全性参数(如密码复杂度),可能正在配置安全策略。上次对话历史里用户还提到“尽可能参考上次问题”,但当前是新会话,所以重点还是当前的配置路径查询。不过可以预判ta下一步可能需要参数修改指导,所以在回答里提前加入了参数修改的操作警告。技术细节需要特别注意:1路径差异:openGauss的$GAUSSHOME路径需要区别于传统PostgreSQL的$PGDATA(引用2)2参数覆盖层级:运行时的SET命令优先级高于配置文件(引用3的描述需要修正给用户)3关键参数组:安全类参数(引用5)、日志类参数(引用4)要单独说明准备在相关问题里埋入运维动线:从路径查询→修改操作→安全检查→性能调优的自然过渡。这样如果用户接着问某个具体参数,就能形成知识链。</think> 在 openGauss 中查找或修改 `postgresql.conf` 配置文件的操作路径和方法如下(综合上述引用和 openGauss 特性): --- ### **一、配置文件路径** 1. **默认路径** `postgresql.conf` 通常位于数据库实例的**数据目录**(`$GAUSSDATA`)下: ```bash /opt/huawei/install/data/dn/ # 默认安装路径示例 ``` > 注:实际路径取决于安装时的配置,可通过命令 `gsql -d postgres -c "SHOW data_directory;"` 查询[^2][^3]。 2. **通过 SQL 查询路径** 登录数据库后执行: ```sql SELECT name, setting FROM pg_settings WHERE name = 'config_file'; ``` 此命令会返回配置文件的**绝对路径**[^2]。 --- ### **二、配置文件说明** `postgresql.conf` 是 openGauss 的核心配置文件,主要管理: 1. **基础配置** - 连接数 (`max_connections`) - 内存分配 (`shared_buffers`, `work_mem`) - 日志输出路径 (`log_directory`) 2. **安全与认证** - 密码复杂度策略 (`password_policy`) - 启用后强制校验密码强度(需配合 `gs_guc` 工具修改)[^5] - SSL 加密 (`ssl = on`) 3. **日志与调试** - 记录检查点 (`log_checkpoints = on`)[^4] - 记录连接/断开 (`log_connections/log_disconnections = on`)[^4] - 日志前缀格式 (`log_line_prefix = '%m %p %u@%d'`)[^4] 4. **性能参数** - 检查点间隔 (`checkpoint_timeout`) - 并行查询 (`max_parallel_workers`) --- ### **三、修改配置文件步骤** 1. **手动编辑** ```bash vi $GAUSSDATA/postgresql.conf # 需数据库实例停止运行 ``` 2. **使用 `gs_guc` 工具(推荐)** 动态修改(部分参数无需重启): ```bash gs_guc reload -N all -I all -c "log_connections=on" ``` > 强制校验语法:`gs_guc reload -N all -I all -c "password_policy=1"`[^5]。 3. **参数生效方式**: - `reload`:动态加载(如日志类参数) - `restart`:需重启实例(如内存分配参数)[^3][^4]。 --- ### **四、注意事项** 1. **参数作用域** - 部分参数需超级用户权限(如 `log_duration`)[^4]。 - 使用 `SET` 命令可临时覆盖会话级参数。 2. **密码安全策略** 若启用 `password_policy`,需满足: - 最小长度(默认8字符) - 包含数字、大小写字母、特殊字符[^5]。 --- **
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值