是否有可能检测到数据库连接是指向副本而不是原始数据库?

是否有可能检测到数据库连接是指向副本而不是原始数据库?

我有一个应用程序,需要知道它是否连接到安装时的原始数据库,或者是否连接到该数据库的副本。是否有任何已知方法可以知道数据库是否已被克隆并且应用程序不再连接到原始数据库?我对 MS SQL Server 和 Oracle 特别感兴趣。

我正在考虑一个存储过程,但很可能无法访问硬件来确认唯一的硬件信息,这可以在某种程度上保证数据库是安装期间最初连接的数据库。

我正在尝试防止/检测数据库的克隆,以便只有 1 个“真实的位置”。

答案1

我的看法是:如果它是由位组成的,那么它可以被克隆,你永远无法分辨出原始数据和克隆数据之间的区别。你唯一的机会是每个数据库实例都返回某种计算值,所以 -

  1. 每个数据库实例返回不同的值。
  2. 每个数据库实例返回的值是调用之间保持一致

条件 (2) 是这里的罪魁祸首。如果每个实例返回的值在调用之间是一致的,那么值必须依赖于某个地方的某种存储值。该存储值也可以被克隆……

量子电动力学

答案2

我克隆了 Oracle 数据库用于两个目的。据我所知,其中只有一个可以满足您的要求。

  • 我已克隆数据库,以便为其他环境或用途提供额外的实例(有时是只读的)。在这种情况下,我更改了数据库名称。可以通过检查数据库名称来检测这些克隆。
  • 我已克隆数据库以用于恢复或回滚。通常,它们会替换原始数据库。我不知道如何将其识别为克隆数据库。

有数据可能表明数据库已被克隆或移动。表空间的文件名等内容在数据库克隆时可能会发生变化,但即使数据库未克隆,它们也可能发生变化。我相信您可以检索数据库运行所在的主机名或 IP 地址。同样,这可能表明数据库已被克隆,但不能用来验证它是否是克隆的。

虽然最终可能会连接到错误的克隆,但这种情况通常比较困难。花些时间了解与数据库的连接是如何路由的。

答案3

“show slave status;”您知道您连接到哪个服务器...show slave status 将告诉您哪个服务器是主服务器...如果它们在不同的服务器上。您可能能够使用全局变量 server_id 找出同一台服务器上的差异...我还没有尝试过。

相关内容