SqlServer如何跨实例访问数据库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer如何跨实例访问数据库相关的知识,希望对你有一定的参考价值。
在我们日常使用SQL Server数据库时,经常遇到需要在实例Instance01中跨实例访问Instance02中的数据。例如在做数据迁移时,如下语句:insert into Instance01.DB01.dbo.Table01
select * from Instance02.DB01.dbo.Table01
普通情况下,这样做是不允许的,因为SQL Server默认不可以跨实例访问数据。解决方案是使用存储过程sp_addlinkedserver进行实例注册。
sp_addlinkedserver在MSDN中的定义为:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
例如:在Instance01实例中,执行如下SQL语句
EXEC sp_addlinkedserver ‘Instance02’ //只写第一个参数即可,默认情况下,注册的是SQL Server数据库,其他参数用法详见MSDN。
如果你的两个实例在同一个域中,且Instance01与Instance02有共同的域登陆帐号,那么经过上面的注册后,前面的insert语句就可以执行了。否则,还需要对注册的远程实例进行登陆帐号注册,在Instance01实例中,执行如下SQL语句
EXEC sp_addlinkedsrvlogin 'InstanceName','true' //使用集成认证访问远程实例
或者 EXEC sp_addlinkedsrvlogin 'InstanceName','false','TJVictor,'sa','Password1' //使用Windows认证访问远程实例,当用户以TJVictor用户登陆Instance01实例访问Instance02时,默认把TJVictor映射成sa,且密码为Password1
经过 sp_addlinkedserver实例注册和sp_addlinkedsrvlogin登陆帐户注册后,就可以在Instance01中直接访问Instance02中的数据库数据了。
如果还无法访问,请检查本机DNS是否可以解析远程数据库的实例名。如果无法解析,可以在EXEC sp_addlinkedserver ‘Instance02’中把Instance02换为IP,或者在hosts文件中,自己建立相应DNS映射。 参考技术A 用链接服务器跨实例访问
SpringCloudMySQL跨实例访问
有时候,利用数据库本身的一些特性,可以解决相当多的问题,Java里常常说分布式、集群,实际上针对这些问题,数据库本身也有一套完整的解决方案,并不一定非要通过代码解决。
在我们开发过程中,难免会产生这样一个需求:需要同时连接A、B、C三个数据库。
这时候,可是视情况,看看是否使用FEDERATED存储引擎。
数据表映射,如同Oracle中的DBlink一般,使用FEDERATED进行跨实例来进行数据查询。效果如同Gateway,通过一个数据库连接,即可获取其它数据库的数据。
输入show engines;可以查看MySQL是否支持FEDERATED,默认是不支持的
show engines;
在windows下只需要在mysql的配置文件 my.ini 最末尾加上一句 federated ,然后重启mysql即可。
如果找不到my.ini,文件夹地址输入框输入%ProgramData%,找到MySQL文件夹。
建表的语句
CREATE TABLE xxx(...) ENGINE=FEDERATED CONNECTION=‘mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]‘
例:
CREATE TABLE `t_work_task` ( `id` varchar(36) NOT NULL, `work_date_end` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT=‘作业任务‘ CONNECTION=‘mysql://rgyx_hlj:rgyx_hlj@127.0.0.1/rgyx_hlj/t_work_task‘;
注意:本质上,只是通过一个数据库,连接上了另一个,只是方便编程,并没有减轻数据存储的压力
以上是关于SqlServer如何跨实例访问数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux 上跨可用性组副本同步 SQL Server 代理作业?