比较两个相同的表结构,为不同的数据
我知道这个问题类似于前面回答的问题,如比较两个相同的表结构,为不同的数据
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:如上所述,我们宁愿不触摸由第三方生成的数据库以防止可能的错误/损坏。
安装“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地址,所以一定要改变/检查基于你从哪里访问它。
然后你可以链接和测试。使用临时表或内存表可能有助于减轻延迟或限制来自其他服务器/数据库的数据。
您可以创建链接服务器,并将监视作为单独的第三方服务来执行。 –
@AnthonyHorne我该怎么做? –
在MS SQL之类的东西上,为每个MySQL创建一个链接服务器(我使用redmine为SSRS报告创建链接服务器)。有关链接服务器创建,请参阅下面的答案 –