我知道这个问题类似于之前回答的问题,例如
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 的表转储到<首先是em> SNAPSHOT 的数据库,并在 SNAPSHOT 服务器上运行比较查询?
PS:我想要PHP / PDO和SQL解决方案,只是为了比较哪种方法非常适合大规模流程,如果可能的话。
人们可能会问的问题:
问:为什么不在 MONITOR 上创建两个数据库?
答:因为我们不希望 MONITOR 发生故障,所以使用 SNAPSHOT 的比较的平台会随之下降。此外,由于 MONITOR 是由第三方软件生成和维护的,我们希望尽可能少地与它进行交互。
问:当 MONITOR 的数据更新并将其转发到 SNAPSHOT 时,是否无法编写触发器?
答:如上所述,我们不希望触及第三方生成的数据库,以防止可能的错误/损坏。
答案 0 :(得分:0)
安装&#34; MySQL ODBC 5.2 ANSI驱动程序&#34;。
添加以下程序(更容易添加其他服务器)
--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
现在运行&#34; uspCreateLinkToMySQLDB&#39; HLP_BB&#39;,&#39; 172.19.49.181&#39;,&#39; bitnami_redmine&#39;,&#39; {Your Mysql User}& #39;,&#39; {密码管理员}&#39;&#34;
成功!
来自MySQL的查询:
从HLP_BB中选择* ... {Whatever table}
注意:请记住,mysql用户权限通常与IP地址相关联,因此请务必根据您从中访问它的位置进行更改/检查。
然后你可以链接和测试。使用某些临时表或内存表可能有助于缓解延迟或限制来自其他服务器/数据库的数据。