跳转到主要内容

于 2025年04月22日 摘录自 Postfix CDB Howto

简介

CDB(常量数据库)是由丹尼尔·伯恩斯坦设计的一种索引文件格式。CDB 专为读取操作优化,并保证每个记录最多只需两次磁盘访问即可读取。这一性能通过放弃增量更新支持实现:不支持单记录插入或删除操作。CDB 数据库只能通过从头重建来修改,因此名称中带有"常量"修饰符。

Postfix CDB 数据库指定为 "cdb:name",其中 name 指定 CDB 文件名,不包含 ".cdb" 后缀(在 CDB 文件构建过程中会临时使用 ".tmp" 后缀)。CDB 数据库通过 postmap(1)postalias(1) 命令进行维护。DATABASE_README 文档包含关于 Postfix 数据库的通用信息。

您可以在任何可以使用只读 "hash"、"btree" 或 "lmdb" 表的地方使用 "cdb:" 表,但需遵守以下限制:

  • CDB 数据库在 LP64 和 ILP32 系统上不能大于 4GB,因为 CDB 库 API 使用无符号整数作为文件偏移量。
  • 命令行选项 "postmap -i"(增量记录插入)和 "postmap -d"(增量记录删除)不可用。出于相同原因,无法使用 "cdb:" 映射类型用于持久缓存,例如用于 verify(8) 服务、tlsmgr(8) 服务的 TLS 会话缓存,或 postscreen(8) 的动态允许列表。
  • "序列"操作("postmap -s"或"postalias -s")仅在 Postfix 通过 Michael Tokarev 的 tinycdb 构建时可用,而非通过 Daniel Bernstein 的原始 cdb 库构建时可用。

CDB 支持在 Postfix 2.2 及后续版本中可用。本文档的其余部分描述了如何构建带 CDB 支持的 Postfix。

构建带 CDB 支持的 Postfix

这些说明假设您已按照 INSTALL 文档从源代码构建 Postfix。如果您从供应商特定的源代码包构建 Postfix,可能需要进行一些修改。

Postfix 兼容两种 CDB 实现:

Tinycdb 更受推荐,因为它速度稍快,具有额外实用功能且使用起来简单得多。

在安装 tinycdb 后,要构建 Postfix,请使用类似以下命令:

% make tidy
% CDB=../../../tinycdb-0.5
% make -f Makefile.init makefiles "CCARGS=-DHAS_CDB -I$CDB" \
"AUXLIBS_CDB=$CDB/libcdb.a"
% make

或者,对于 D.J.B. 版本的 CDB:

 

% make tidy
% CDB=../../../cdb-0.75
% make -f Makefile.init makefiles "CCARGS=-DHAS_CDB -I$CDB" \
"AUXLIBS_CDB=$CDB/cdb.a $CDB/alloc.a $CDB/buffer.a $CDB/unix.a $CDB/byte.a"
% make

Postfix 3.0 之前的版本使用 AUXLIBS 而不是 AUXLIBS_CDB。在 Postfix 3.0 及更高版本中,旧的 AUXLIBS 变量仍支持构建静态加载的 CDB 数据库客户端,但只有新的 AUXLIBS_CDB 变量支持构建动态加载或静态加载的 CDB 数据库客户端。

未使用 AUXLIBS_CDB 变量将导致动态数据库客户端加载失效。每个 Postfix 可执行文件都将包含 CDB 数据库库依赖项。而这正是动态数据库客户端加载旨在避免的情况。