开始 关于PostgreSQL 的内容

本文分享了作者初步接触PostgreSQL数据库的经历,包括阅读源代码的感受、使用explain和analyze命令的经验,以及本周项目中关于PostgreSQL扩展性的研究方向。

PostgreSQL的代码看了一点,真正看懂的大概100行吧。看代码确实很累。

昨天又回头看了PostgreSQL的一些ppt.

/timing  显示用时
explain [SQL statement]  能看出用了什么索引,cost是多少
analyze verbose [table name]  能看见table用了几页

现在做项目,本周的任务是关于PostgreSQL的扩充方式,其实PostgreSQL manual 上Chapter 31. 扩展 SQL上已经蛮详细了。

 

 

<think> 我们正在讨论PostgreSQL日志记录的具体内容。根据引用[2]和引用[3],我们可以总结出PostgreSQL日志可以记录多种信息,包括连接信息、SQL语句执行情况、错误信息等。以下是详细的分类: 1. **连接和断开信息**:当客户端连接到数据库或断开连接时,日志会记录这些事件,包括时间戳、用户名、数据库名、客户端地址等。 2. **执行的SQL语句**:通过配置`log_statement`和`log_min_duration_statement`可以记录执行的SQL语句。引用[2]说明: - `log_statement`:可以设置为`none`(不记录)、`ddl`(记录数据定义语句,如CREATE, ALTER, DROP)、`mod`(记录DDL和数据修改语句,如INSERT, UPDATE, DELETE)或`all`(记录所有语句,包括SELECT)。 - 如果同时设置`log_min_duration_statement=0`,则所有执行时间超过0毫秒的语句都会被记录,这样就会记录包括SELECT在内的所有语句(因为每条语句至少需要一点时间执行)。但是注意,这可能会对性能产生影响,生产环境中需谨慎。 3. **语句执行时间**:通过`log_min_duration_statement`设置,可以记录执行时间超过指定阈值的语句。例如,设置为0则记录所有语句,设置为1000则记录执行时间超过1秒的语句。引用[3]中展示了一个例子:执行`SELECT pg_sleep(1)`后,日志记录了该语句的执行时间(1001.435 ms)。 4. **错误和警告信息**:数据库运行过程中发生的错误(如语法错误、约束违反、权限问题等)和警告都会被记录。 5. **检查点信息**:检查点的发生和持续时间。 6. **自动清理(autovacuum)信息**:记录autovacuum进程的活动。 7. **锁信息**:可以记录锁等待和死锁信息,帮助诊断并发问题。 8. **事务提交和回滚**:可以记录事务的提交和回滚事件。 9. **复制状态**:在流复制环境中,会记录复制相关的信息,如同步状态、延迟等。 引用[3]中的日志示例: ``` 2024-07-05 11:58:26.172 CST,"postgres","air_cloud_test",411257,"192.168.20.93:34160",6687680f.64679,82,"SELECT",2024-07-05 11:27:11 CST,6/0,0,LOG,00000,"duration: 1001.435 ms",,,,,,,,,"Navicat","client backend",,440101247839410938 ``` 这条日志包含: - 时间戳:2024-07-05 11:58:26.172 CST - 用户名:postgres - 数据库名:air_cloud_test - 进程ID:411257 - 客户端地址和端口:192.168.20.93:34160 - 会话ID:6687680f.64679(启动进程的时间戳和进程ID的十六进制表示) - 事务ID:82 - 命令类型:SELECT - 日志级别:LOG(注意,这里记录的是持续时间的日志) - 消息:duration: 1001.435 ms 另外,引用[2]提到,通过设置`logging_collector=on`,可以将日志重定向到文件,并配置日志文件的路径和命名方式(如`postgresql-%a.log`)。 综上所述,PostgreSQL日志记录的内容非常丰富,可以根据配置记录不同级别的信息,帮助数据库管理员进行监控、故障排查和性能分析。 现在,我们按照要求生成相关问题: </think> ### PostgreSQL 日志记录内容详解 PostgreSQL 日志记录的内容可通过配置灵活调整,主要包含以下核心信息: #### 一、基础连接与会话信息 1. **连接/断开事件** - 客户端IP地址与端口号(如 `192.168.20.93:34160`)[^3] - 连接时间戳(精确到毫秒) - 用户名和数据库名(如 `"postgres","air_cloud_test"`)[^3] - 会话ID(如 `6687680f.64679`) 2. **进程标识** - 后台进程ID(如 `411257`)[^3] - 事务ID(如 `82`)[^3] #### 二、SQL 执行记录 通过 `log_statement` 配置控制: | 配置值 | 记录内容 | 性能影响 | |-------------|-----------------------------------|----------| | `none` | 不记录SQL | 无 | | `ddl` | 所有DDL语句(CREATE/ALTER/DROP) | 低 | | `mod` | DDL + DML(INSERT/UPDATE/DELETE) | 中 | | `all` | 所有SQL(含SELECT) | 高 | ```ini # 配置示例(记录DDL和DML) log_statement = mod [^2] ``` #### 三、性能监控数据 1. **执行耗时分析** - 通过 `log_min_duration_statement` 记录慢查询: ```ini # 记录所有超过1秒的SQL log_min_duration_statement = 1000 ``` - 日志输出示例: `LOG: duration: 1001.435 ms statement: SELECT pg_sleep(1)` [^3] 2. **锁等待与死锁** - 锁超时事件(`LOCK_TIMEOUT`) - 死锁检测信息(`deadlock detected`) #### 四、系统操作与错误 1. **关键操作记录** - 检查点(CHECKPOINT) - 自动清理(AUTOVACUUM) - 备份/恢复操作 2. **错误与警告** - 错误代码(如 `00000` 表示正常)[^3] - 详细错误描述 - 堆栈跟踪(高错误级别时) #### 五、客户端信息 1. **应用程序标识** - 客户端工具名称(如 `"Navicat"`)[^3] - 驱动类型(如 `"client backend"`)[^3] 2. **事务状态** - 事务开始/提交/回滚 - 保存点操作(SAVEPOINT) #### 六、高级诊断信息(需特别配置) ```ini # 记录锁等待 log_lock_waits = on # 记录临时文件使用 log_temp_files = 0 # 记录所有临时文件 # 记录执行计划 auto_explain.log_analyze = on ``` > ⚠️ **注意**:记录过多内容(尤其是 `log_statement=all`)会显著影响性能。生产环境建议采用分层日志策略: > 1. 基础日志记录连接和错误 > 2. 单独会话开启全SQL记录 > 3. 使用 `log_min_duration_statement` 捕获慢查询 --- ### 日志示例解析 ```log 2024-07-05 11:58:26.172 CST, # 时间戳 "postgres","air_cloud_test", # 用户名/数据库名 411257,"192.168.20.93:34160", # 进程ID/客户端地址 6687680f.64679,82,"SELECT", # 会话ID/事务ID/操作类型 2024-07-05 11:27:11 CST,6/0,0,LOG,00000, # 其他事务信息/日志级别/错误码 "duration: 1001.435 ms", # 执行耗时 "Navicat","client backend" # 客户端信息[^3] ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值