比较两个相同的表结构,为不同的数据

问题描述:

我知道这个问题类似于前面回答的问题,如比较两个相同的表结构,为不同的数据

How to compare data between two table in different databases using Sql Server 2008?

Compare two identical tables MySQL

但我的关心这里是什么,如果两个数据库位于不同的位置? SQL查询将如何?

为了澄清,我有两个MySQL服务器,让我们命名的第一台服务器MONITOR,第二服务器快照。服务器MONITOR由第三方库存管理软件使用和维护。服务器SNAPSHOT是我的自定义MySQL服务器,它存储MONITOR的关键表并进行比较。两台服务器都有相同的名为INVENTORY的数据库和一个名为HARDWARE的表。

上述两个链接中的SQL命令正是我所追求的,但是,由于数据库位于两台不同的服务器上,都需要不同的用户名/登录名,这使得SQL命令无法执行,寻求是否有解决方案。

此外,另一个问题的存在,在具有大量数据的两个表的情况下(比如超过百万条目),将它推荐给我转储MONITOR的表到快照的数据库第一,并在SNAPSHOT服务器上运行比较查询? PS:我想要一个PHP/PDO和一个SQL解决方案,只是为了比较哪种方法非常适合大规模流程,如果可能的话。

问题,人们可能会问:

问:你为什么不上MONITOR使这两个数据库?

答:因为我们不希望如果MONITOR下降,其采用快照的比较下降与它的平台。此外,由于MONITOR由第三方软件生成和维护,因此我们希望尽可能少地与其交互。

问:你不能写一个触发器时MONITOR的数据得到了更新,并转发至快照

A:如上所述,我们宁愿不触摸由第三方生成的数据库以防止可能的错误/损坏。

+0

您可以创建链接服务器,并将监视作为单独的第三方服务来执行。 –

+0

@AnthonyHorne我该怎么做? –

+0

在MS SQL之类的东西上,为每个MySQL创建一个链接服务器(我使用redmine为SSRS报告创建链接服务器)。有关链接服务器创建,请参阅下面的答案 –

安装“MySQL ODBC 5.2 ANSI驱动程序”后。

添加以下程序(使其更容易添加额外的服务器)

--http://www.sqlservercentral.com/Forums/Topic340912-146-1.aspx 
    ALTER PROC uspCreateLinkToMySQLDB @linkedservername varchar(50), @mysqlip varchar(50), @dbname varchar(100), @username varchar(50), @password varchar(50) AS 
    [email protected] = the name you want your linked server to have 
    [email protected] = the ip address of your mysql database 
    [email protected] = the name of the mysql database you want to operate against. Without this, some of the features of openquery fail 
    [email protected] = the username you will use to connect to the mysql database 
    [email protected] = the password used by your username to connect to the mysql database 

    BEGIN 
    --DROP THE LINKED SERVER IF IT EXISTS 
    IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = @linkedservername) 
    EXEC master.dbo.sp_dropserver @[email protected], @droplogins='droplogins' 

    --ADD THE LINKED SERVER 
    DECLARE @ProviderString varchar(1000) 

    Select @ProviderString = 'DRIVER={MySQL ODBC 5.2 ANSI Driver};SERVER=' + @mysqlip + ';Port=3306;OPTION=3;DATABASE=' + @dbname + ';' 

    EXEC master.dbo.sp_addlinkedserver 
    @[email protected], 
    @srvproduct='MySQL', 
    @provider='MSDASQL', 
    @[email protected] 

    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'collation compatible', @optvalue=N'false' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'data access', @optvalue=N'true' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'dist', @optvalue=N'false' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'pub', @optvalue=N'false' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'rpc', @optvalue=N'true' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'rpc out', @optvalue=N'true' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'sub', @optvalue=N'false' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'connect timeout', @optvalue=N'0' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'collation name', @optvalue=null 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'lazy schema validation', @optvalue=N'false' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'query timeout', @optvalue=N'0' 
    EXEC master.dbo.sp_serveroption @[email protected], @optname=N'use remote collation', @optvalue=N'true' 
    EXEC sp_addlinkedsrvlogin @linkedservername, 'false', NULL, @username, @password 
    END 

现在运行“uspCreateLinkToMySQLDB 'HLP_BB', '172.19.49.181', 'bitnami_redmine', '{您的MySQL用户}', '{管理员密码}'“

成功!从MySQL

查询:

SELECT * FROM HLP_BB ... {无论表}

注:请记住,MySQL的用户权限往往与IP地址,所以一定要改变/检查基于你从哪里访问它。

然后你可以链接和测试。使用临时表或内存表可能有助于减轻延迟或限制来自其他服务器/数据库的数据。