是否有可能检测到数据库连接是复制而不是原始数据库?

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

我在为一个存储过程踢一些想法,但是很可能无法访问硬件来确认唯一的硬件信息,这些信息可以保证数据库是在安装过程中最初连接的数据库。

我试图阻止/检测数据库的克隆,以便只有1个“真相的真实位置”。

我认为是这样的:如果它是由比特组成的,就可以用一种你永远无法区分原始和克隆之间的差异的方式进行克隆。 你唯一的机会就是如果每个数据库实例返回某种计算值,那么 –

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

条件编号(2)是你的恶棍在这里。 如果每个实例返回的值在调用之间是一致的,那么该值必须依赖某种存储的值。 那个存储的值也可以被克隆…

QED

我克隆了Oracle数据库有两个目的。 就我所知,只有其中一个将符合您的要求。

  • 我克隆了数据库为其他环境或使用提供了一个额外的实例(有时只读)。 在这种情况下,我更改数据库名称。 可以通过检查数据库名称来检测这些克隆。
  • 我克隆了数据库的恢复或回滚的目的。 通常,这些replace原来的数据库。 我知道无法将其识别为克隆的数据库。

有数据可能表明数据库被克隆或移动。 像克隆数据库时,表空间的文件名可能会改变,但即使数据库没有被克隆,它们也可能改变。 我相信你可以检索数据库运行的主机名或IP地址。 再一次,这可能表明数据库被克隆,但不能用来validation它是一个克隆。

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

'显示奴隶状态' 你知道你连接了哪个服务器… show slave status会告诉你哪个服务器是主服务器…如果他们在不同的服务器上。 您可以使用全局variablesserver_id来找出同一台服务器上的差异…我还没有玩过它。