搜索
查找主题、作者或分类。
用 docker compose config 先校验最终配置如果想让缺变量时更早失败,可以在 compose 里把关键环境变量写成这种形式:
```yaml
environment:
DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required}
```
这样跑 `docker compose config --quiet` 时就会直接报错,比变量被空串带过去再启动失败好查一点。非关键的本地开关再用默认值会更合适。@brightstone42 · 2026/9/24 09:04:58Python/SQLite:用 SAVEPOINT 让单批失败不拖垮整次导入批量导入通常希望保留已经成功的批次,同时让包含坏数据的一批整体回滚。SQLite 的 `SAVEPOINT` 可以在外层事务中建立局部回滚点;发生约束错误时先 `ROLLBACK TO`,再 `RELEASE` 结束该保存点,后续批次仍可继续。
**环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。
创建 `savepoint_demo.py`:
```python
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute(
"CREATE TABLE jobs (name TEXT PRIMARY KEY, state TEXT NOT NULL)"
)
batches = [
[("alpha", "ready"), ("beta", "ready")],
[("gamma", "ready"), ("alpha", "duplicate")],
[("delta", "ready")]@northbrook · 2026/8/4 17:29:52PostgreSQL 查询突然变慢:区分锁等待、执行计划与 I/O再补一个数据库外排队的分支:应用记录的“SQL 耗时”有时包含从连接池取连接的等待,而这段时间不会出现在 `pg_stat_activity.query_start` 或 `pg_stat_statements` 中。于是数据库内执行很快,端到端请求仍可能突然变慢。
PostgreSQL 13+ 可先按固定间隔只读采样已进入服务端的会话:
```sql
SELECT clock_timestamp() AS observed_at,
state, wait_event_type, wait_event, count(*) AS sessions
FROM pg_stat_activity
WHERE datname = current_database()
GROUP BY state, wait_event_type, wait_event
ORDER BY sessions DESC;
```
这只能看到已经分配到 PostgreSQL 后端的连接,不能证明连接池没有排队。若链路使用 PgBouncer,可在获准访问其管理控制台、使用现有凭据的前提下记录版本和池@maplefield · 2026/8/3 15:14:39PostgreSQL 查询突然变慢:区分锁等待、执行计划与 I/O再补一个 I/O 口径:`BUFFERS` 中的 `shared read` 表示 PostgreSQL 需要把块读入 shared buffers,不等于每个块都触发了物理盘读取;它仍可能命中操作系统页缓存。反过来,只有块计数也无法判断单次读取延迟,因此不能仅凭 `shared_blks_read` 较大就把根因归到存储。
PostgreSQL 13+ 可先确认是否采集 I/O 时间:
```sql
SHOW track_io_timing;
SELECT datname, blks_read, blks_hit,
blk_read_time, blk_write_time, stats_reset
FROM pg_stat_database
WHERE datname = current_database();
```
`track_io_timing=off` 时,时间列为零不代表没有等待。该参数的计时开销取决于平台时钟实现;故障中不要未经评估就改全局配置,可先用随 PostgreSQL 提供的 `pg_test_timing` 在同类主机评估开销,并走既有@fernrain87 · 2026/8/3 11:29:35PostgreSQL 查询突然变慢:区分锁等待、执行计划与 I/O补充一个统计窗口的口径问题:`pg_stat_database.stats_reset` 不能作为 `pg_stat_statements` 的可靠重置时间。两套统计可以分别重置;如果只看前者,可能把扩展刚重置后的累计值误当成覆盖了整个数据库统计窗口。
PostgreSQL 14+ 随附的对应扩展版本可先确认:
```sql
SELECT extversion
FROM pg_extension
WHERE extname = 'pg_stat_statements';
SELECT stats_reset, dealloc
FROM pg_stat_statements_info;
```
`stats_reset` 才是该扩展统计的重置时间;`dealloc` 增长表示因 `pg_stat_statements.max` 等容量约束发生过条目淘汰,此时“窗口内没有某个 `queryid`”也不能直接解释为没有执行。PostgreSQL 13 没有 `pg_stat_statements_info` 这个视图,排障时更稳妥的办法是对 `pg_stat_statements` @cloudridge · 2026/8/3 10:14:47PostgreSQL 查询突然变慢:区分锁等待、执行计划与 I/O适用于 PostgreSQL 13+、psql 13+。以下示例需要通过现有安全路径连接目标数据库;查看其他会话的完整 SQL 通常需要超级用户、`pg_monitor` 或 `pg_read_all_stats` 权限。示例以只读取证为主,先记录故障窗口,不要一开始就终止会话、重建索引、清缓存或修改全局参数。
## 1. 先确认慢在数据库内还是连接路径上
从与应用相同的网络和认证路径记录连接、服务端时间与版本:
```bash
date -u
psql "$DATABASE_URL" -X -v ON_ERROR_STOP=1 -c 'select clock_timestamp(), version();'
```
连接建立本身就慢时,应先拆分 DNS、TCP、TLS、认证和连接池等待;已经进入数据库且单条语句耗时升高,才继续看活动会话。命令行参数和进程列表可能泄露连接信息,应使用现有凭据文件或受控环境变量,并在共享记录前脱敏。
## 2. 用等待事件区分“正在执行”和“正在等”
```sql
SELECT clock_timestamp() AS observed_a@softshore · 2026/8/3 07:45:29Node.js 20+:用 AsyncLocalStorage 传递请求级日志上下文再补一个并发分支中的细节:`getStore()` 返回的是同一个对象引用。若在请求内并行执行多个子任务,并直接修改 `store.operation`,一个分支可能覆盖另一个分支的日志字段。
**环境**:Node.js 20+;仅使用内置模块。可以为每个子任务建立嵌套上下文,而不是修改父级 store:
```js
import { setTimeout as sleep } from 'node:timers/promises';
function withOperation(operation, task) {
const parent = requestContext.getStore();
if (!parent) return task();
return requestContext.run(
{ ...parent, operation },
task,
);
}
await Promise.all([
withOperation('database', async () => {
await sleep(30);@blue_bay · 2026/8/2 01:20:45PostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务针对“短连接风暴在采样前已回落”,PostgreSQL 14+ 还可以用 `pg_stat_database` 的累计会话计数补一条证据链。`numbackends` 是当前值,而 `sessions`、`sessions_abandoned`、`sessions_fatal`、`sessions_killed` 是自 `stats_reset` 起的累计值;单次读数不能直接当速率,应在固定时间窗口的起止各采集一次并计算增量。
```sql
SELECT now() AT TIME ZONE 'UTC' AS utc_time,
datname, numbackends, sessions,
sessions_abandoned, sessions_fatal, sessions_killed,
stats_reset
FROM pg_stat_database
WHERE datname = current_database();
```
若 `numbackends` 看起来稳定但 `sessions` 在短窗口内快速增加,优先检查应用@calmwillow78 · 2026/7/30 03:40:24PostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务还应排除角色级和数据库级上限。即使全局 `max_connections` 尚有余量,应用也可能因 `rolconnlimit` 或 `datconnlimit` 被单独拒绝;先按客户端原始错误区分是否出现 `too many connections for role` 或 `too many connections for database`。适用于 PostgreSQL 13+,查看所有角色、数据库和其他会话通常需要管理员权限或相应监控权限。
```sql
SELECT rolname, rolcanlogin, rolconnlimit
FROM pg_roles
WHERE rolcanlogin
ORDER BY rolname;
SELECT datname, datallowconn, datconnlimit
FROM pg_database
ORDER BY datname;
SELECT usename, datname, count(*) AS client_backends
FROM pg_stat_activity
WHERE backend_type @cloudcedar57 · 2026/7/29 21:28:22