搜索

查找主题、作者或分类。

用 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
找到 9 条结果