【问题标题】:Compare two identical table structure on different database for different data比较不同数据库上两个相同表结构的不同数据
【发布时间】:2017-06-14 04:05:38
【问题描述】:

我知道这个问题类似于之前回答的问题,例如

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

Compare two identical tables MySQL

但我担心的是,如果这两个数据库位于不同的位置怎么办? SQL 查询会是什么样子?

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

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

另外,另一个问题是,如果两个表都有大量数据(比如超过一百万个条目),是否建议我将 MONITOR 的表转储到 SNAPSHOT 的数据库,然后在 SNAPSHOT 服务器上运行比较查询?

PS:如果可能的话,我想要一个 PHP/PDO 和一个 SQL 解决方案,只是为了比较哪种方法更适合大规模流程。

人们可能会问的问题:

问:为什么不在MONITOR上创建两个数据库?

答: 因为我们不希望 MONITOR 宕机,所以使用 SNAPSHOT 比较的平台也会随之宕机。此外,由于 MONITOR 是由第三方软件生成和维护的,因此我们希望尽可能少地与它进行交互。

问:你能不能在 MONITOR 的数据更新后编写一个触发器并将其转发给 SNAPSHOT

答:如上所述,我们不希望接触第三方生成的数据库,以防止可能出现的错误/损坏。

【问题讨论】:

  • 您可以创建链接服务器并作为单独的第三方服务进行监控。
  • @AnthonyHorne 我该怎么做?
  • 在 MS SQL 之类的东西上,为每个 MySQL 创建一个链接服务器(我使用 redmine 执行此操作 - 用于 SSRS 报告)。有关链接服务器的创建,请参见下面的答案。

标签: mysql sql database pdo date-comparison


【解决方案1】:

安装“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
    --@linkedservername = the name you want your linked server to have
    --@mysqlip = the ip address of your mysql database
    --@dbname = the name of the mysql database you want to operate against. Without this, some of the features of openquery fail
    --@username = the username you will use to connect to the mysql database
    --@password = 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 @server=@linkedservername, @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 
    @server=@linkedservername, 
    @srvproduct='MySQL',
    @provider='MSDASQL', 
    @provstr=@ProviderString

    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'collation compatible', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'data access', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'dist', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'pub', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'rpc', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'rpc out', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'sub', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'connect timeout', @optvalue=N'0'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'collation name', @optvalue=null
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'lazy schema validation', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @optname=N'query timeout', @optvalue=N'0'
    EXEC master.dbo.sp_serveroption @server=@linkedservername, @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', '{Your Mysql User}', '{Password of Admin}'”

成功了!

来自 MySQL 的查询:

从 HLP_BB 中选择 *...{无论什么表}

注意:请记住,mysql 用户权限通常与 IP 地址相关联,因此请务必根据您从何处访问它来更改/检查。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多