此页面为机器翻译。请阅读英文原文。 English

IBSurgeon 文库

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中有以下主要类型的内部文件:

  1. fb_lock_ 锁文件–Firebird锁管理器使用的文件
  2. fbNN_monitor_ 监控表数据的文件
  3. fbNN_trace_ 跟踪会话数据的文件
  4. fb_event_ 存储事件缓冲区的文件
  5. fb_user_mapping 用户映射数据的文件
  6. 跟踪会话内部数据的文件
  7. 标志文件(零大小)
  8. 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_):

  1. fb_table_ 表对象,包括但不限于临时表
  2. fb_blob_ BLOB和自治事务
  3. fb_undo_ 撤销数据
  4. fb_recbuf_ 用于在活动查询、虚拟表等中保存中间数据
  5. fb_merge_ 哈希连接的数据
  6. fb_sort_ 排序(用于带DISTINCT/ORDER BY/GROUP BY的查询以及创建/重建索引)
  7. fb_tpc_ fb_tpc_数据–从v4开始,所有已知事务及其关联提交编号的列表
  8. 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]