Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Go 客户端配置参考

本页列出了 clickhouse-go v2.x 中所有可配置选项。若需查看包含代码示例的指南,请参阅配置

选项的设置方式

选项可在三个作用范围内设置:

作用范围 设置方式 生效时长
连接 clickhouse.Options 结构体或 DSN 字符串 该连接上的所有查询
查询 带有 WithXxx 函数的 clickhouse.Context() 单次查询执行
批次 PrepareBatch() 选项函数 单次批次操作

当多个作用范围重叠时,范围越具体,优先级越高:批次 > 查询 > 连接。对于 Settings,查询级别的键会与连接级别的键合并;如果发生冲突,则以查询级别为准。

通过 Options 结构体:

conn, err := clickhouse.Open(&clickhouse.Options{
    Addr:        []string{"localhost:9000"},
    Auth:        clickhouse.Auth{Database: "default", Username: "default", Password: ""},
    DialTimeout: 10 * time.Second,
    Compression: &clickhouse.Compression{Method: clickhouse.CompressionLZ4},
})

通过 DSN 连接字符串:

db, err := sql.Open("clickhouse", "clickhouse://user:pass@localhost:9000/default?dial_timeout=10s&compress=lz4")

通过 Connector (使用 Options 结构体的 database/sql) :

db := sql.OpenDB(clickhouse.Connector(&clickhouse.Options{
    Addr:        []string{"localhost:9000"},
    Auth:        clickhouse.Auth{Database: "default", Username: "default"},
    DialTimeout: 10 * time.Second,
}))
// 创建后设置仅适用于 database/sql 的连接池参数
db.SetConnMaxIdleTime(5 * time.Minute)

通过 Context (按查询) :

ctx := clickhouse.Context(context.Background(),
    clickhouse.WithQueryID("my-query-123"),
    clickhouse.WithSettings(clickhouse.Settings{"max_execution_time": 60}),
)
rows, err := conn.Query(ctx, "SELECT ...")

连接选项

协议和连接

选项 类型 默认值 DSN 参数 描述 最佳实践 配置错误时
Protocol Protocol (int) Native 协议方案:clickhouse://=Native,http://=HTTP 通信协议:Native (0) 用于 TCP,HTTP (1) 用于 HTTP Native 的性能通常高约 30%,应优先使用。若需要支持 proxy、穿过 firewall (80/443 端口) ,或使用仅 HTTP 支持的压缩 (gzip/br) ,请使用 HTTP。参见 TCP 与 HTTP HTTP 协议方案配 Native 端口 (9000) :connection refused。Native 被 firewall 阻止:发生 timeout。
Addr []string ["localhost:9000"] (Native) ["localhost:8123"] (HTTP) URL 中以逗号分隔的主机 用于连接和故障转移的 "host:port" 地址列表 在 production 环境中指定多个地址以实现高可用。正确端口:9000 (Native)、8123 (HTTP)、9440 (Native+TLS)、8443 (HTTP+TLS)。 单个地址:无故障转移。端口错误:"connection refused"。空值/nil:默认使用 localhost,在分布式部署中会失败。
ConnOpenStrategy ConnOpenStrategy (uint8) ConnOpenInOrder (0) connection_open_strategy (in_order, round_robin, random) Addr 中选择 server 的策略。InOrder (0)=故障转移,RoundRobin (1)=负载均衡,Random (2)=随机。 主备场景使用 InOrder。双活/K8s 场景使用 RoundRobin。为避免惊群效应,可使用 Random 在双活场景中使用 InOrder:第一台 server 会承受全部负载,其他 server 处于 idle。所有策略在失败时都会尝试所有 server——只影响优先尝试哪个。

身份验证

选项 类型 默认值 DSN 参数 说明 最佳实践 配置错误时
Auth.Username string "default" username 或 URL 用户部分 用于 ClickHouse 身份验证的用户名 生产环境中绝不要使用 default。请创建权限最小化的专用用户。 用户名错误:"Code: 516. DB::Exception: Authentication failed"。空字符串:会静默使用 "default"
Auth.Password string "" password 或 URL 密码部分 用于 ClickHouse 身份验证的密码 生产环境中请使用环境变量或 secret 管理器。在 DSN 中对特殊字符进行 URL 编码。 密码错误:"Code: 516. DB::Exception: Authentication failed"。特殊字符未进行 URL 编码:会出现解析错误。
Auth.Database string "" (server 默认值) database 或 URL 路径 (/mydb) connection 的默认数据库 始终显式指定。生产环境中请为每个应用使用专用数据库。 不存在:"Code: 81. DB::Exception: Database xyz doesn't exist"。在多租户设置中留空:查询会落到错误的数据库。
GetJWT func(ctx) (string, error) nil (仅可通过程序方式设置) 返回用于 ClickHouse Cloud 身份验证的 JWT 的回调。可通过 WithJWT(token) 为每个查询覆盖。 (自 v2.35.0 起) 实现标记缓存/刷新——它会在每次 connection/request 时调用。 标记过期:会出现身份验证错误。阻塞式回调:会导致超时。JWT 的优先级高于用户名/密码。需要 TLS——否则会静默回退到用户名/密码。
GetJWT: func(ctx context.Context) (string, error) {
    return getTokenFromVault(ctx)
}

超时

选项 类型 默认值 DSN 参数 说明 最佳实践 配置不当时
DialTimeout time.Duration 30s dial_timeout 建立新连接的最长等待时间。达到 MaxOpenConns 时,它也控制从连接池获取连接的等待时间。 LAN 环境下为 5-10 秒,WAN/云环境下为 15-30 秒;如果连接到已休眠的 ClickHouse Cloud 服务,则为 1-2 分钟。切勿低于 1 秒。 过短:拥塞期间出现 "clickhouse: acquire conn timeout",或在已休眠的 Cloud 服务完成唤醒前连接失败。过长 (> 60 秒):故障期间应用会一直挂起。
ReadTimeout time.Duration 5m (300s) read_timeout 单次 read 调用等待服务器响应的最长时间。按每个块生效,而非整个查询。Context deadline 优先生效。 较短的交互式查询设为 10-30 秒;较长的分析型查询设为 5-30 分钟。 过短:查询中途出现 "i/o timeout""read: connection reset by peer";服务器仍会继续执行。过长:无法及时检测失效连接。

连接池

选项 类型 默认值 DSN 参数 API 说明 最佳实践 配置不当时
MaxIdleConns int 5 max_idle_conns 两者 连接池中空闲 (未使用但仍保持存活) 的最大连接数 设为预期并发查询数的 50-80%。低:2-5,中:10-20,高:20-50。 过低:连接频繁创建和销毁,延迟升高。过高:浪费内存。会自动受 MaxOpenConns 限制。
MaxOpenConns int MaxIdleConns + 5 (默认:10) max_open_conns 两者 最大连接总数 (空闲 + 活跃) 低:10-20,中:20-50,高:50-100。公式:并发查询数 + 突发量 + 缓冲。监控:SELECT * FROM system.metrics WHERE metric='TCPConnection' 过低:"clickhouse: acquire conn timeout"。过高:服务器报错 "Too many connections",并可能超出 FD 限制。ClickHouse 默认 max_connections:1024 (共享) 。
ConnMaxLifetime time.Duration 1h conn_max_lifetime 两者 连接可复用的最长时间。在归还到连接池时检查。 稳定环境建议 1-5h。K8s/滚动部署建议 5-15m。切勿设为无限。 过短 (< 1m) :频繁创建和销毁连接,延迟升高。过长/无限:连接陈旧、无法感知 DNS 变更,流量也不会重新均衡。
ConnMaxIdleTime time.Duration 0 (无) database/sql 连接在关闭前允许保持空闲的最长时间。不在 Options struct 中——需通过 db.SetConnMaxIdleTime() 设置。 对于 K8s/突发型 workload,建议设为 5-10m,以便在流量峰值后回收空闲连接。 未设置:空闲连接会一直保留到 ConnMaxLifetime。过短 (< 30s) :即使在正常空档期间也会重建连接。

用法详见 连接池


标准 database/sql 连接池设置

使用 clickhouse.OpenDB()sql.Open("clickhouse", dsn) 时,返回的 *sql.DB 支持 Go 的标准连接池方法。OpenDB() 会自动应用 Options 中的前三项:

方法 对应的 Options 配置 说明
db.SetMaxIdleConns(n) MaxIdleConns OpenDB() 自动应用
db.SetMaxOpenConns(n) MaxOpenConns OpenDB() 自动应用
db.SetConnMaxLifetime(d) ConnMaxLifetime OpenDB() 自动应用
db.SetConnMaxIdleTime(d) None 必须在创建后手动设置

压缩

选项 类型 默认值 DSN 参数 描述 最佳实践 配置不当时
Compression.Method CompressionMethod (byte) None compress (lz4, zstd, lz4hc, gzip, deflate, br,或使用 true 表示 LZ4) 用于数据传输的压缩算法。请参见下方的协议支持矩阵。 LAN:None 或 LZ4。WAN:ZSTD 或 LZ4。CPU 资源受限:LZ4。追求最高压缩率:ZSTD (Native) 或 Brotli (HTTP) 。对于小于 1 MB 的插入可跳过压缩。 在 Native 上使用 GZIP/Brotli:握手失败。在 HTTP 上使用 LZ4HC:报错或静默回退。慢速网络上不使用压缩:插入速度会慢 10-100 倍。
Compression.Level int 3 compress_level 算法对应的压缩强度。GZIP/Deflate:-2 到 9。Brotli:0 到 11。LZ4/ZSTD:会被忽略。 GZIP 的平衡设置:3-6。Brotli 的平衡设置:4-6。 级别过高:CPU 开销极大、收益很小。对 LZ4/ZSTD 设为非零:会被静默忽略。未启用压缩时设置 Level:无效果。
MaxCompressionBuffer int (bytes) 10485760 (10 MiB) max_compression_buffer 刷写前允许使用的最大压缩缓冲区大小。每个连接都有自己的缓冲区。 默认 10 MiB 通常就足够。对于宽行可设为 20-50 MiB。总内存 = buffer x MaxOpenConns 过小 (< 1 MiB) :频繁刷写,效率较低。过大 (> 100 MiB):连接较多时可能导致 OOM。

按协议划分的压缩方法支持情况:

方法 Native HTTP
CompressionLZ4
CompressionLZ4HC
CompressionZSTD
CompressionGZIP
CompressionDeflate
CompressionBrotli

TLS

选项 类型 默认值 DSN 参数 描述 最佳实践 配置错误时
TLS *tls.Config nil (明文) secure=true, skip_verify=true TLS/SSL 配置。非 nil 时启用 TLS。端口:Native 9000/9440,HTTP 8123/8443。 在生产环境和 ClickHouse Cloud 中务必启用 (必需) 。在生产环境中将 InsecureSkipVerify 设为 false。可通过 RootCAs 添加自定义 CA。 端口错误:"connection reset by peer"。在生产环境中使用 skip_verify=true:存在遭受 MITM 攻击的风险。证书已过期:"x509: certificate has expired"。主机名错误:"x509: certificate is valid for X, not Y"。CA 不受信任:"x509: certificate signed by unknown authority"。如果 HTTP DSN 使用了 secure=true:请改用 https:// 协议。

代码示例请参见 TLS


日志

选项 类型 默认值 DSN 参数 描述 最佳实践 配置错误时
Logger *slog.Logger nil (不记录日志) 通过 Go 的 log/slog 提供结构化日志记录器。优先级:Debug+Debugf > Logger > 空操作。 (自 v2.43.0 起) 在生产环境中使用配备 JSON 处理器的 slog。使用 logger.With(...) 添加应用上下文。
Debug (deprecated) bool false debug 旧版调试开关。请改用 Logger。如果未设置 Debugf,日志将输出到 stdout 在生产环境中启用:会带来性能开销、产生冗长日志,并可能在输出中包含敏感数据。
Debugf (deprecated) func(string, ...any) nil 自定义调试日志函数。请改用 Logger。要求设置 Debug: true
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
conn, err := clickhouse.Open(&clickhouse.Options{
    Logger: logger,
    // ...
})

完整示例请参见日志


缓冲区与内存

选项 Type 默认值 DSN 参数 按查询 说明 最佳实践 配置不当时
BlockBufferSize uint8 2 block_buffer_size 是 (WithBlockBufferSize) 读取结果时要缓冲的已解码块数。支持并发读取与解码。 默认值 2 即可。对于大型流式结果,可设为 5-10。内存 = 缓冲区 × 块大小 × 并发查询数。 过小 (1) :会阻塞块读取器,延迟更高。过大 (> 50) :内存占用高,收益递减。
FreeBufOnConnRelease bool false 每次查询后释放连接的内存缓冲区,而不是复用。 查询频率高时使用 false。在内存受限的容器中,或不频繁处理大批次时,使用 true false + 内存受限:缓冲区会累积 (内存 = 缓冲区 × 空闲连接数) 。true + 高速率:GC 压力增大,CPU 开销增加。

HTTP 专用

选项 类型 默认值 DSN 参数 说明 最佳实践 配置错误时
HttpHeaders map[string]string nil 为每个请求附加额外的 HTTP 请求头 用于 tracing (X-Request-ID) 或认证代理请求头。尽量保持最少。 覆盖内部请求头 (Content-TypeAuthorization) :行为不可预测。
HttpUrlPath string "" http_path 追加到请求上的 URL 路径。会自动添加前导 / 在使用基于路径路由的 reverse proxy 时使用。 路径错误:代理/LB 返回 HTTP 404。
HttpMaxConnsPerHost int 0 (unlimited) 传输层每个主机的 TCP 连接数 (http.Transport.MaxConnsPerHost) 。 对大多数应用保留为 0。仅当 server 有严格的连接数限制时再设置。 值过低 (例如 MaxOpenConns=50 时设为 10) :会造成传输层瓶颈,即使 server 负载较低,queries 仍会变慢。
HTTPProxyURL *url.URL nil (uses env vars) http_proxy (URL-encoded) 用于转发请求的 HTTP proxy 如果需要 proxy,请显式设置。它会覆盖 HTTP_PROXY/HTTPS_PROXY 环境变量。 地址错误:"dial tcp: lookup proxy: no such host"。proxy 需要认证:HTTP 407。
TransportFunc func(*http.Transport) (http.RoundTripper, error) nil 自定义 HTTP transport 工厂。接收默认 transport 以便进行包装。(自 v2.41.0 起) 用于可观测性中间件。不要覆盖 ProxyDialContextTLSClientConfig 返回 nil:panic。覆盖客户端字段:TLS/proxy 会被静默忽略。阻塞式 RoundTripper:deadlocks。
TransportFunc: func(t *http.Transport) (http.RoundTripper, error) {
    return &loggingRoundTripper{transport: t}, nil
}

高级连接

选项 类型 默认值 DSN 参数 描述 最佳实践 配置不当时
DialContext func(ctx, addr) (net.Conn, error) nil (标准拨号器) 用于 TCP 连接的自定义拨号函数。兼容 Native 和 HTTP。 在 99% 的情况下保持为 nil。可用于 Unix 套接字、SOCKS 代理和自定义 DNS。 不遵循上下文:会导致挂起和资源泄漏。设置了 TLS 时:自定义拨号器必须自行处理 TLS。net.Conn 无效:会导致崩溃。
DialStrategy func(ctx, connID, options, dial) (DialResult, error) DefaultDialStrategy 自定义服务器选择和连接策略。会覆盖 ConnOpenStrategy 在 99.9% 的情况下使用默认值。仅在需要地理感知路由、加权选择或健康检查时自定义。 未尝试所有服务器:即使有健康服务器可用也会失败。内部执行高开销操作:会在每次建立连接时阻塞连接池获取。

客户端信息

Option Type Default DSN param Per-query Description Best practice When misconfigured
ClientInfo ClientInfo struct 自动:clickhouse-go 版本 + Go 运行时环境 client_info_product=myapp/1.0 是 (WithClientInfo,追加) 发送给 ClickHouse 的应用标识信息。包含 Products ([]struct{Name,Version}) 和 Comment ([]string) 。可在 system.query_log 中看到。 始终设置应用名称和版本。查询归属示例:SELECT client_name FROM system.query_log WHERE client_name LIKE '%myapp%' 未设置:在多服务环境中,无法识别是哪个服务发起了查询。
ClientInfo: clickhouse.ClientInfo{
    Products: []struct{ Name, Version string }{
        {Name: "my-service", Version: "1.0.0"},
    },
}
// 显示为:clickhouse-go/2.x my-service/1.0.0 (lv:go/1.23; os:linux)

ClickHouse 服务器设置

选项 类型 默认值 DSN 参数 是否支持按查询设置 说明 最佳实践 配置错误时
Settings map[string]any nil 任何未识别的参数 (例如 ?max_execution_time=60) 是 (WithSettings,冲突时以 context 为准) 应用于每个查询的 ClickHouse server settings。DSN 转换:"true"1"false"0,数值→int 在连接级别设置通用限制,再通过 context 按查询覆盖。 拼写错误:可能被静默忽略,也可能因版本不同而报错。类型错误:"Cannot parse string 'abc' as Int64"max_execution_time=0 且未设置 deadline:查询会一直运行。
CustomSetting CustomSetting{Value string} 是 (通过 WithSettings) 将某项设置标记为 "自定义" (非重要) 以用于 native protocol。即使服务器无法识别,也不会报错。HTTP 默认将所有设置都视为自定义。 用于 Experimental 或特定版本的设置。 将重要设置标记为自定义:如果不受支持,会被静默忽略。

常见设置:

设置 类型 说明
max_execution_time int 查询超时时间 (秒)
max_memory_usage int 每个查询的内存限制 (字节)
max_block_size int 处理用块大小
readonly int 1 = 只读,2 = 只读 + 可改设置
Settings: clickhouse.Settings{
    "max_execution_time":  60,                                        // 重要 -- 未知时报错
    "my_custom_setting":   clickhouse.CustomSetting{Value: "value"},  // 自定义 -- 未知时忽略
}

Context 级别查询选项

使用 clickhouse.Context() 为每个查询单独设置:

ctx := clickhouse.Context(context.Background(),
    clickhouse.WithQueryID("my-query"),
    clickhouse.WithSettings(clickhouse.Settings{"max_execution_time": 60}),
)
选项 类型 默认值 协议 描述 最佳实践 配置不当时
WithQueryID string 自动生成 两者均支持 自定义查询 ID。可在 system.query_logsystem.processes 中看到。 使用 UUID。便于执行 KILL QUERY WHERE query_id='...' 重复的 ID:会导致 system.query_log 中出现混淆。
WithQuotaKey string "" 两者均支持 用于多租户资源限制的 QUOTA 键。需要服务器端 QUOTA 配置。 用于按客户或按用户设置限制。 未配置 Quota:会被静默忽略。
WithJWT string "" 仅支持 HTTPS ClickHouse Cloud 的单次查询 JWT 覆盖设置。(自 v2.35.0 起) 适用于多租户代理中的单请求认证。 未启用 TLS:将被忽略,并回退到连接认证。已过期:"Token has expired"
WithSettings Settings 继承连接设置 两者皆可 按查询设置的服务器级配置。会与 connection 级 Settings 合并;发生冲突时,以上下文为准。 按查询类型覆盖 max_execution_timemax_rows_to_read 与连接级 Settings 相同。
WithParameters 参数 (map[string]string) nil 两者皆可 服务器端参数化查询的参数值。查询语法:{param_name:Type} 为防止 SQL 注入,请使用此方式,而不要进行字符串拼接。 参数缺失:"Substitution {param_name:Type} isn't set"。类型不匹配:"Cannot parse string 'abc' as UInt64"
WithAsync bool (wait) 同步 两者 异步 insert 模式。设置 async_insert=1wait=true 时还会设置 wait_for_async_insert=1。需要 ClickHouse 21.11+。(自 v2.41.0 起;取代旧版 WithStdAsync。) 用于高吞吐量插入。 wait=false:错误可能会异步出现——请检查 system.asynchronous_insert_log。与 SELECT 一起使用时:会被忽略。旧 server:"Unknown setting async_insert"
WithLogs func(*Log) nil 仅支持 Native 查询执行期间的服务器日志条目回调。 保持轻量快速——否则会阻塞执行。耗时较重的处理请使用 goroutine。 在 HTTP 上:不会被调用,且不会有任何提示。
WithProgress func(*Progress) nil 仅限原生协议 查询进度更新 (已处理的行数/字节数) 。 务必保持处理快速——否则会阻塞执行。 在 HTTP 上:不会被调用,且不会有任何提示。
WithProfileInfo func(*ProfileInfo) nil 仅适用于 Native 查询执行统计信息回调。 务必保持轻量——否则会阻塞执行。 在 HTTP 上:不会被调用,且不会有任何提示。
WithProfileEvents func([]ProfileEvent) nil 仅适用于 Native 性能计数器的回调函数。 务必尽快返回——否则会阻塞执行。 在 HTTP 下:永远不会被调用,且不会有任何提示。
WithoutProfileEvents 发送事件 仅原生协议 禁用 profile events。适用于 ≥ 25.11 服务器的性能优化。(自 v2.44.0 起) 在不需要 profile events 时使用。 在较旧的 server 上:会因设置未知而报错。
WithExternalTable ...*ext.Table nil 两者都支持 将临时查找表附加到查询中。数据按每次查询传输。 将表控制在 < 10 MB 以内。原生协议比 HTTP (multipart) 更高效。 大表:每次查询的网络开销都较高。
WithUserLocation *time.Location 服务器时区 两者均可 覆盖 DateTime 解析所用的时区。 当客户端与服务端时区不一致时,应显式设置。 时区错误:DateTime 值会在无提示的情况下偏差数小时,并可能导致数据损坏。
WithColumnNamesAndTypes []ColumnNameAndType nil (执行 DESCRIBE) 仅限 HTTP 在 HTTP 插入时,通过预先提供列信息,跳过 DESCRIBE TABLE 往返请求。 (自 v2.37.0 起) 在 schema 已知且稳定时使用。 类型不匹配:"Cannot convert String to UInt64"。迁移后发生 schema drift:列信息已过时。
WithBlockBufferSize uint8 connection 级别 (2) 两者皆可 为单个查询覆盖连接级别的 BlockBufferSize 对于特定查询返回的大型结果集,可增大该值。
WithClientInfo ClientInfo 连接级别 两者均支持 为单次查询附加额外的客户端信息。不会替换,只会追加。(自 v2.42.0 起) 为每个请求添加上下文 (例如端点名称) 。
WithSpan trace.SpanContext 为空 仅限 Native 协议 用于分布式链路追踪的 OpenTelemetry span 上下文。 参阅 OpenTelemetry
ctx := clickhouse.Context(ctx,
    clickhouse.WithQueryID("query-123"),
    clickhouse.WithParameters(clickhouse.Parameters{
        "user_id": "12345",
    }),
    clickhouse.WithProgress(func(p *clickhouse.Progress) {
        log.Printf("Progress: %d rows, %d bytes", p.Rows, p.Bytes)
    }),
)
rows, err := conn.Query(ctx, "SELECT * FROM users WHERE id = {user_id:String}")

批次选项

传递给 PrepareBatch()。导入:github.com/ClickHouse/clickhouse-go/v2/lib/driver

Option Default Description Best practice When misconfigured
WithReleaseConnection 连接会一直持有到 Send() PrepareBatch() 后立即将连接释放回连接池。在 Send()/Flush() 时重新获取。 对于长时间存在的批次 (数分钟/数小时) ,建议使用此选项以防止连接池耗尽。 长批次未使用此选项:如果活跃连接很多,可能会出现 "acquire conn timeout"
WithCloseOnFlush 批次保持打开状态 调用 Flush() 时自动关闭批次。 适用于一次性批次。可省去显式调用 Close() 与多次 Flush() 调用一起使用时:第一次 flush 会关闭批次,后续操作会失败。
batch, err := conn.PrepareBatch(ctx, "INSERT INTO table",
    driver.WithReleaseConnection(),
    driver.WithCloseOnFlush(),
)

速查表

连接池大小建议

应用类型 MaxIdleConns MaxOpenConns ConnMaxLifetime
低流量 Web 应用 5 10 1h
中等流量 API 20 50 30m
高流量服务 50 100 15m
后台批次作业 10 20 2h
Kubernetes 部署 10 20 10m
无服务器 (Lambda) 1 5 5m

超时建议

环境 DialTimeout ReadTimeout
本地 / 局域网 5s 30s
Cloud,同一区域 10s 2m
Cloud,跨区域 30s 5m
OLAP 工作负载 10s 30m
实时 / OLTP 5s 10s

DSN 参数速查

DSN 参数 Options 字段 示例
username Auth.Username ?username=admin
password Auth.Password ?password=secret
database Auth.Database ?database=mydb 或路径中的 /mydb
dial_timeout DialTimeout ?dial_timeout=10s
read_timeout ReadTimeout ?read_timeout=5m
max_open_conns MaxOpenConns ?max_open_conns=50
max_idle_conns MaxIdleConns ?max_idle_conns=20
conn_max_lifetime ConnMaxLifetime ?conn_max_lifetime=30m
connection_open_strategy ConnOpenStrategy ?connection_open_strategy=round_robin
block_buffer_size BlockBufferSize ?block_buffer_size=10
compress Compression.Method ?compress=lz4
compress_level Compression.Level ?compress_level=6
max_compression_buffer MaxCompressionBuffer ?max_compression_buffer=20971520
secure TLS ?secure=true
skip_verify TLS.InsecureSkipVerify ?skip_verify=true
debug Debug ?debug=true
client_info_product ClientInfo.Products ?client_info_product=myapp/1.0
http_proxy HTTPProxyURL ?http_proxy=http%3A%2F%2Fproxy%3A8080
http_path HttpUrlPath ?http_path=/clickhouse
(其他任意参数) Settings[key] ?max_execution_time=60

故障排查

连接池耗尽:"acquire conn timeout"

**原因:**连接池已耗尽——所有 MaxOpenConns 连接都在使用中,且在 DialTimeout 期限内没有连接可用。

解决方法

请按顺序尝试以下步骤,并在调整参数前先排查根本原因:

  1. 检查是否有长时间运行并占用连接的查询:SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC。如果有,先处理这些慢查询。
  2. 如果你运行的是长生命周期的批次 (从 PrepareBatch()Send() 之间相隔数分钟或数小时) ,请使用 WithReleaseConnection(),以便在批次保持打开期间将连接归还到连接池。
  3. 增加 MaxOpenConns,使其与实际观测到的并发度相匹配。
  4. 仅当预期会出现突发流量,且等待获取连接确实是瓶颈时,才增加 DialTimeout

读取超时和连接重置错误

原因: 等待服务器响应时超过了 ReadTimeout,或者连接被服务器/网络关闭。

解决方法:

  • 对长时间运行的查询增大 ReadTimeout
  • 使用 Context deadline 控制每个查询的超时时间
  • 检查 ClickHouse 服务端的 max_execution_time 限制

"Code: 516. 身份验证失败"

原因: 用户名或密码错误,或者用户不存在。

解决方法:

  • 对照 system.users 表核实凭据
  • 检查 DSN 密码中的特殊字符是否存在 URL 编码问题
  • 确认该用户有权访问指定数据库

TLS 证书错误

错误 原因 解决方法
x509: certificate has expired 服务器证书已过期 更新服务器证书
x509: certificate is valid for X, not Y 主机名不匹配 使用正确的主机名,或将其添加到 SANs
x509: certificate signed by unknown authority CA 不受信任 将 CA 添加到 tls.Config.RootCAs
connection reset by peer TLS/端口不匹配 TLS 请使用 9440 (Native) 或 8443 (HTTP) 端口

内存逐渐增长

原因: 空闲连接的缓冲区大量积累。

解决方法:

  • 在内存受限的环境中设置 FreeBufOnConnRelease: true
  • 减少 MaxIdleConns 以限制空闲连接数
  • 如果使用压缩,减小 MaxCompressionBuffer
  • 调低 ConnMaxLifetime,让连接更频繁地轮换
Navigation