将幽灵数据行添加到火鸟数据库表中?



我今天在接收客户数据库进行调查时遇到了奇怪的情况。

系统设置:

  • 火鸟服务器 v 2.5.9.26074
  • 火鸟客户端 v 2.6.5
  • 数据库文件由应用程序直接访问,即它不是通过 aliases.conf 注册的。

当我第一次查看数据库时,一切似乎都非常一致。但是,在第一次启动期间,在某些表中添加了两行,而没有检测到任何SQL执行。我已经通过调试器确认应用程序没有添加这些行。我还使用了审计和跟踪推理(fbtracemgr(,并在日志文件中看到没有向数据库添加此类行。

有一个提示表明原始数据库中有问题。包含问题的表正在使用 INSERT 触发器从生成器设置表行的 ID 列值。现在,生成器值在原始数据库中似乎太高了。这让我认为"幽灵数据"已经在某种缓存中输入到文件中,因为生成器已经递增了 1。

结果是,在添加了这两个虚影行之后,表的下一个实际添加会导致异常:

FirebirdSql.Data.FirebirdClient.FbException (0x80004005): violation of 
PRIMARY or UNIQUE KEY constraint "INTEG_275" on table "DATALOG" ---> 
violation of PRIMARY or UNIQUE KEY constraint "INTEG_275" on table 
"DATALOG"

因为已经存在生成器建议的具有相同 ID 的行。

是否存在永久性的"未保存的数据缓存",其中可能包含在以前的应用程序运行期间输入的行数据?什么可能导致这种情况?数据库写入或备份期间断电?

有什么想法吗?

火鸟服务器 v 2.5.9.26074

没有发布这样的版本。

火鸟-2.5.8.27089 http://www.firebirdsql.org/en/firebird-2-5/

基本上你似乎使用了一些不稳定的FB开发人员内部构建,这可能会产生任何奇怪的厌恶效果。

因此,我建议使用标准发布的版本,或者出于某种不明原因需要使用快照构建 - 询问Firebird支持邮件列表中的开发人员 - http://www.firebirdsql.org/en/support/

虽然不要屏住呼吸,以获得对异国情调的火鸟构建的支持。

上。感谢马克,这里是:https://www.firebirdsql.org/en/firebird-2-5-0/

2.5.0 - 是引擎经过重大返工后的第一个版本。显然不是最稳定的。例如,下一个 2.5.1 版本中的索引存在问题。


如果在标准 2.5.8 Firebird 上重复该行为,那么我建议将所有数据库(至少是所有元数据,但也可能是数据(导出到一个长文本文件,SQL 脚本中,然后在其中搜索所述表名。例如,可能存在数据库连接触发器添加一些数据。或存储过程。或在触发器上发表的视图。或者别的什么。例如 - 虽然是弊端 - 甚至UDF函数也可以建立自己的数据库连接并做一些事情,尽管这应该在FBTrace中显示。


但是,在第一次启动期间,某些表中添加了两行

启动什么?

如果您使用iSQL/FlameRobin/IBExpert/etc等标准工具只是为了连接然后断开与数据库的连接,是否仍会添加这些行?


因为已经存在生成器建议的具有相同 ID 的行

生成器不能建议这样的事情。它只能建议,一旦保留了这样一个数字,以便可能被添加到一个或另一个表中。这并不意味着该行实际上已插入,已插入到该表中,以后未删除。

您可以尝试使用禁止的索引进行搜索,以防可能发生索引损坏,例如

select id+0, count(*) from tableName group by 1

还 http://www.firebirdfaq.org/faq324/


接收客户数据库进行调查时

顺便说一句,他们究竟是如何创建数据库副本来为您提供的? 他们是否做了备份(FBK(?如果没有,他们在制作副本之前是否停止了Firebird服务器?

最新更新