FirebirdSQL:内部文件、临时文件与环境变量
_by Vasily Sidorov, 2022年9月2日,IBSurgeon
经验丰富的Firebird DBA都知道,Firebird可能需要相当大的磁盘空间来存储内部文件和临时文件。生产系统临时文件的推荐磁盘空间大小为30-40 GB,但对于高负载系统,可能需要更多。
在本文中,我们将介绍Firebird内部文件和临时文件的类型,并探讨它们如何通过配置参数和操作系统环境变量进行存储和管理。本文是致力于掌握Firebird安装和配置的系列文章和材料的一部分。
来自Firebird核心开发人员的重要提示:
永远、永远、永远不要设置/更改FIREBIRD_LOCK环境变量–除非你非常清楚自己在做什么。
来自IBSurgeon团队的明确建议:
不要更改FIREBIRD_LOCK。
关于其他临时文件–请参阅此处。
Firebird中的内部文件
内部文件是Firebird用于执行其内部操作的文件。这些文件不应由用户或第三方软件更改或触碰。以下信息仅供参考。
内部文件的常见命名模式
Firebird内部使用前缀fbNN_,其中NN可以是
- 主要的ODS(磁盘上结构)编号(Firebird 3.0为ODS 12,Firebird 4.0为ODS 13),即文件以fb13开头。
- NN可以是缩短的版本号–例如,文件可以以fb50开头。
此外,也可能有前缀fb_,它也用于临时文件。
Firebird中内部文件的类型
Firebird中有以下主要类型的内部文件:
- fb_lock_ 锁文件–Firebird锁管理器使用的文件
- fbNN_monitor_ 监控表数据的文件
- fbNN_trace_ 跟踪会话数据的文件
- fb_event_ 存储事件缓冲区的文件
- fb_user_mapping 用户映射数据的文件
- 跟踪会话内部数据的文件
- 标志文件(零大小)
- fb_repl_ 复制文件
让我们详细了解一下Firebird的内部文件。
锁文件
锁文件具有前缀fb_lock_。它们由Firebird的锁管理器使用,用于同步对Firebird数据库内对象以及Firebird实例之间的访问。
锁文件在打开数据库文件时创建,在关闭时删除。
默认情况下,当最后一个连接断开时,数据库文件会被关闭。从Firebird 3.0开始,可以使用LINGER选项在最后一个连接断开后保持数据库文件在Firebird中打开。
锁文件的初始大小由firebird.conf中的LockMemSize参数设置。工作大小因架构而异:SuperServer使用锁文件的强度低于Classic和SuperClassic。典型的锁表大小约为30-50MB,但对于Classic/SuperClassic中具有数千个连接的服务器,锁文件的大小可以增长到2GB。2GB是vanilla Firebird中锁文件的实现限制。
监控表数据的文件
从2.1版本开始,Firebird具有监控表。这些表不存储在数据库内部,监控数据按请求收集并保存在命名模式为fbNN_monitor_的内部文件中。
监控表数据文件的大小取决于连接数量及其活动(事务、语句、存储过程等)。此外,fb_NN_monitor_文件的数量和大小取决于来自不同连接对监控表的请求数量(这是不应将MON$表用于非监控任务的原因之一)。
跟踪会话数据的文件
文件命名模式为fbNN_trace_,保存活动跟踪会话文件的链接。命名模式为fb_trace_的文件包含有关跟踪会话的信息。它是跟踪数据的缓冲区。fb_trace文件的最大大小受firebird.conf中MaxUserTraceLogSize参数的限制。如果此缓冲区被填满,跟踪将自动暂停。
事件缓冲区文件
命名模式为fb_event_的文件是Firebird存储未传递给客户端应用程序的事件的缓冲区。
用户映射数据文件
fb_user_mapping文件用于在Firebird实例中缓存用户映射。
标志文件
在POSIX中,Firebird使用零大小的标志文件–fb_guard、fb_init、fb_port_NUMBER。这些文件在Firebird启动时使用。
复制文件
在Firebird 4和HQbird中,fb_repl_文件包含复制过程的内部数据。
内部文件的位置
默认情况下,所有Firebird内部文件都存储在同一个文件夹中:在Windows上为C:\ProgramData\firebird,在Linux上为/tmp/firebird。请注意,该文件夹应具有足够的权限,以便Firebird实例可以在其中创建文件并正常工作!
可以通过定义环境变量FIREBIRD_LOCK来更改Firebird内部文件文件夹的位置,但我们不建议这样做。
请注意:为避免数据库损坏,所有打开同一数据库文件的Firebird进程应使用相同的FIREBIRD_LOCK。请不要创建此变量,并使用默认位置。
内部文件的大小
实际上,Firebird内部文件的总大小约为100-200MB,已知最大可达2GB。
Firebird中的临时文件
临时文件由Firebird引擎创建,用于存储用户操作产生的临时数据–例如,使用DISTINCT的查询。在高负载生产系统中,临时文件可能非常大,因此经验丰富的DBA必须能够识别临时文件的类型,并在必要时调整Firebird配置或分配磁盘空间来存储临时文件。
Firebird中临时文件的位置
Firebird在由环境变量FIREBIRD_TMP、TEMP、TMP(按此顺序)指定的文件夹中创建临时文件。如果没有此类变量,临时文件将在Windows上创建于C:\Temp,在Linux上创建于/tmp。
实际上,在Windows上,我们可以在C:\Windows\Temp(对应于环境变量TEMP)中看到Firebird临时文件,在Linux上则位于/tmp。
Firebird中临时文件的类型
有以下临时文件(全部使用前缀fb_):
- fb_table_ 表对象,包括但不限于临时表
- fb_blob_ BLOB和自治事务
- fb_undo_ 撤销数据
- fb_recbuf_ 用于在活动查询、虚拟表等中保存中间数据
- fb_merge_ 哈希连接的数据
- fb_sort_ 排序(用于带DISTINCT/ORDER BY/GROUP BY的查询以及创建/重建索引)
- fb_tpc_ fb_tpc_数据–从v4开始,所有已知事务及其关联提交编号的列表
- fb_snap_ 数据–从v4开始,所有活动数据库快照的列表
如何更改临时文件的位置?
对于4之前的Firebird版本,可以通过Firebird配置参数TempDirectories为类型4-8的临时文件定义特定文件夹。
对于Firebird 4及更高版本,新的配置参数TempTableDirectory允许指定文件夹来存储类型1-3的临时表。它可以在firebird.conf和databases.conf中设置。
Firebird的环境变量
Firebird可以使用以下操作系统环境变量(如果已定义):
- FIREBIRD 包含Firebird配置文件的文件夹
- FIREBIRD_LOCK 包含内部文件的文件夹
- FIREBIRD_MSG 包含消息文件(firebird.msg)的文件夹
- FIREBIRD_TMP 临时文件的文件夹
实际上,FIREBIRD_TMP是唯一有意义的变量,如果你有充分理由将临时文件存储在特定的非默认位置。
请注意,如果FIREBIRD_TMP中的路径无效(不存在或权限不足),将导致阻止Firebird工作的严重错误。
来自 Firebird 核心开发者的重要通知:
永远、永远、永远不要设置或更改 FIREBIRD_LOCK 环境变量–除非你非常清楚自己在做什么。
来自 IBSurgeon 团队的明确建议:
永远不要更改 FIREBIRD_LOCK。此信息仅供参考。
关于其他临时文件–请参阅此文档。
代替总结:常见问题的解答
许多 DBA 会问–是否应该使用 RAM 磁盘或 tmpfs 来存储 Firebird 内部文件和/或临时文件?
简短的回答是:不,最好调整 Firebird 配置。如果你有大量内存,可以增加 DefaultDBCachePages 的值(仅适用于 SuperServer),并增加 TempCacheLimit(在 3+ 版本中,Firebird 允许 TempCacheLimit 超过 2Gb)。
如果你不确定应该使用什么值,请使用 Firebird 配置计算器,它会为特定的硬件/虚拟机参数创建最优且安全的配置。
更详细的回答:Firebird 的设计目标是将大部分临时文件和内部文件保存在内存中,但由于实际中确实存在临时对象变得非常大的情况,它也有将它们存储到磁盘上的机制。Firebird 有效地利用操作系统机制(mmap、文件系统缓存、临时文件等)在可能且合理的情况下将临时文件和内部文件缓存到内存中。Firebird 的调优应首先通过 Firebird 配置进行,然后再调整操作系统(设置临时文件的位置、各种文件缓存调优选项等)。
相关链接
视频:
关于内存使用调优的演示文稿
请随时提出任何问题或将反馈发送至 [email protected]