如何跟踪服务 firebird

How to trace service firebird

如何使用 delphi xe10 跟踪服务 firebird 服务器的所有事件? 这是我的代码:

my := TIBControlService.Create(Self);

my.ServerName := '127.0.0.1/3050';
my.Protocol := TProtocol.TCP;

my.LoginPrompt := false;
my.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect, tfTransact, tfBlob, tfService, tfMisc];

my.Params.Add( 'user_name=SYSDBA' );
my.Params.Add( 'password=masterkey' );

// -----
mh := MonitorHook;
mh.TraceFlags := my.TraceFlags;

Self.IBSQLMonitor1.TraceFlags := my.TraceFlags;
mh.RegisterMonitor(Self.IBSQLMonitor1);

Self.IBSQLMonitor1.Enabled := true;
Memo1.Lines.Add( Format('GetMonitorCount: %d',[mh.GetMonitorCount]) );


my.Attach;

Memo1.Lines.Add( Format('Active: %s',[System.StrUtils.IfThen(my.Active,'yes','no')]) );

procedure TForm1.IBSQLMonitor1SQL(EventText: string; EventTime: TDateTime);
begin
    Memo1.Lines.Add(EventText);
end;

结果:

GetMonitorCount: 1
Active: yes

[Application:]
:[Attach]

[Application:]
:[Query]

但这个结果仅来自我的申请。当我从另一个进程 (ex.isql) 连接时,我的应用程序不显示此事件。

  1. 当谈到 Interbase/Firebird 时,术语 EVENT 具有非常具体的含义,特定的 SQL 命令将文本常量发送到订阅了这些的客户。

    http://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-postevent

    但是,客户端应该订阅与 posted by PSQL 块完全相同的文本字符串。有关于启用基于掩码的订阅的讨论,这可能使订阅所有 SQL 事件成为可能,例如 *.* 匹配 Windows 中的所有文件,但据我所知他们从未实现。

    这就是 "event" 在 Firebird 中的意思,但它似乎不是你的意思,相反看起来你想要监视 [=143] 之间流动的所有类型的 activity =] 服务器和所有应用程序,从 SQL 命令等开始。

    如果是这样,那一般情况下是没有办法的。你必须决定你到底想要什么以及为什么想要,也许会有一些部分解决方案。

  2. Firebird 2.5 引入了所谓的 Trace API,它允许您订阅某些操作并收到通知。不过,这往往会给引擎带来很大的负载,具体取决于您的订阅过滤器的模糊程度以及服务器收到的请求数量 - 它可能会增加 RAM 和 CPU 使用率,直至完全无法使用。

    • 可订阅的activity种类有限。例如,读取 BLOB 的过程不受监控。当我问起 - 我正在与 Delphi dbExpress 库怪癖触发的臭名昭着的 "Invalid BLOB id" 作斗争 - 我被告知 "no one ever needed this, and you have little reasons to need it too. You made a demo project, sent it to us - and we explained the behavior for you"。那个时候拥有 BLOB 访问跟踪对我有很大帮助,但要成为 objective,那是我真正需要它的唯一情况。

    • 您可能会看看使用 Firebird Trace Manager 可以获得什么 - 一个 CLI 实用程序,它是 FB 分发的一部分,从 2.5 开始.

    • 您可以看看 Firebird Profiler,这是一个来自 http://fbprofiler.sf.net

    • 的免费简单 GUI 工具
    • 用于 Firebird 的商业数据库 IDE,如 IBExpert 或 UpScene TraceManager 以及其他可能的,通常都支持 Trace API。

    • 您可以使用 Trace API 进行自己的实现,从 Program Files\Firebird\Firebird_2_5\doc\README.trace_services.txtProgram Files\Firebird\Firebird_2_5\include\ibase.h 开始。也可能发生像 Unified InterbaseIBObjects 这样的第 3 方库已经将 API 翻译成 Delphi。我想我在 UIB 中看到了一些关于跟踪的东西,但我不确定。我不希望这样的库成为 Delphi 发行版的一部分:从 Delphi 的角度来看 Firebird 是他们的 Interbase 的直接竞争对手,而 IBX 图书馆几乎没有兴趣与他们自己的 分道扬镳Interbase 通过支持 Firebird-only 函数。

  3. 如果您只关心像 Delphi 这样的本机应用程序,您可能会决定制作自己的插入器 fbclient.dll 并将其安装在所有客户端计算机而不是库存 DLL。如果您的应用使用了传统模拟 GDS32.DLL,则相同。

    • 此 DLL 应完全提供所有 API 调用,包括 http://firebirdsql.org/en/reference-manuals/ IB6 文档中描述的经典调用以及所有 post-IB6 更新,以及新的 Firebird 3 "object oriented API".
    • 它应该以您选择的方式记录调用,然后应该将调用代理到您将使用不同文件名为其隐藏的原始客户端 DLL 的副本。它应该代替标准客户端 DLL 安装在您要拦截和监视的每台计算机上。
    • 经典的应该不难API,有人在做这个,虽然没有发表。但新的 ooAPI 可能具有挑战性。
    • 它只会拦截应用程序,通过fbclient.DLL接口工作。 Java 使用 Jaybird 的应用程序和使用 .Net Provider 库的 C# 应用程序可能会使用底层 wire 协议 跳过 fbclient.dll,因此也跳过你的插入器。