数据库迁移技术记录(四)--DbLink进行数据迁移

SQLServer安装DBLink 迁移数据

DBLINK(数据库链接),顾名思义就是数据库的链接,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。

选用DBLink缘由:

在数据库迁移中对于大数据文件使用kettle时其中包含mysql批量添加时由于封闭符问题,或者是字符集编码问题,导致数据库代码乱码。采用navicat进行跨主机跨库数据传输也是可以的但是会导致一些其他的问题比如不可以直观看到传输的过程,即使错误了不能很好的定位到错误,采用dblink是可以直接把数据进行查询出来,然后再插入到mysql数据库中。dblink可以进行跨主机,跨库进行数据传输。采用查出后在本地然后又插入到其他库中的表中。总之在使用kettle和navicat踩了许多的坑所以尝试选用dblink

navicat中:数据量较大会导致session失效,所以可以更改数据库中的参数来设置。

kettle中的:主要的难题是数据库编码问题,字符编码,以及mysql批量导致乱码问题,无论使用批量还是表输出都不能解决json类型的数据的存储。

由于踩坑无数,在迁移过程中一部分采用kettle一部分采用dblink方式。

下面来看下如何使用dblink吧。

如何创建DBLink

CREATE [SHARED] [PUBLIC] database link link_name
  [CONNECT TO [user] [current_user] IDENTIFIED BY [password] 
  [AUTHENTICATED BY user IDENTIFIED BY password] 
  [USING 'connect_string']
   
   create database link linkfwq 
   connect to fzept identified by neu 
   using '(DESCRIPTION = 
   (ADDRESS_LIST = 
   (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
   (SERVICE_NAME = fjept) 
   ) 
   )';

1)权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。

2)link : 当source端的参数(parameter)GLOBAL_NAMES=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。

3)current_user使用该选项是为了创建global类型的dblink。在分布式体系中存在多个数据库的话。如果想要在每一个数据库中都可以使用同样的名字来访问数据库a,那在每个数据库中都要创建一个到数据库a的db_link,太麻烦了。所以有这个选项的话你只要创建一次。所有的数据库都可以使用这个db_link来访问了。要使用这个特性,必须有oracle nameserver或者ORACLE目录服务器。并且数据库a的参数global_names=true.具体我也没有创建过,没有这个环境。

4)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。

5)username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库,当创建connected user类型的dblink时,需要如果采用数据字典验证,则需要两边数据库的用户名密码一致

例如:

create public database link NC65DBLINK    
 connect to nc56 identified by nc56  
 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.17.254)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
 // 查看是否创建成功
select * from dba_db_links;
select owner,object_name from dba_objects where object_type='DATABASE LINK';--查询时间久

dblink连接Mysql

1.下载mysqlodbc数据源并安装:

https://downloads.mysql.com/archives/c-odbc/ 建议不要选择最新版,最新版视乎有点问题

数据库迁移技术记录(四)--DbLink进行数据迁移_第1张图片

2.配置信息

在控制面板中进行配置Mysql数据源直接搜索选择64位的要:

数据库迁移技术记录(四)--DbLink进行数据迁移_第2张图片
配置数据源

数据库迁移技术记录(四)--DbLink进行数据迁移_第3张图片

配置系统DNS选择MYSQL ODBC

数据库迁移技术记录(四)--DbLink进行数据迁移_第4张图片

然后进行填写信息

数据库迁移技术记录(四)--DbLink进行数据迁移_第5张图片

3.在SQLserver创建DBLINK

数据库迁移技术记录(四)--DbLink进行数据迁移_第6张图片

填写登录密码

数据库迁移技术记录(四)--DbLink进行数据迁移_第7张图片

DBLink链接SQLServer

1.建立DBlinkServer

直接输入链接服务器的地址,和登录密码即和上述步骤一致。

DBLink 连接的语法

OPENQUERY用法
对给定的链接服务器执行指定的传递查询。该服务器是 OLE DB 数据源。OPENQUERY 可以在查询的 FROM 子句中引用,就好象它是一个表名。OPENQUERY 也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表进行引用。但这要取决于 OLE DB 访问接口的功能。尽管查询可能返回多个结果集,但是 OPENQUERY 只返回第一个。

Transact-SQL 语法约定

语法

OPENQUERY ( linked_server ,’query’ )
参数

linked_server
表示链接服务器名称的标识符。

’ query ’
在链接服务器中执行的查询字符串。该字符串的最大长度为 8 KB。

备注

OPENQUERY 不接受其参数的变量。

在 SQL Server 2000 和更高版本中,OPENQUERY 不能用于对链接服务器执行扩展存储过程。但是,通过使用四部分名称,可以在链接服务器上执行扩展存储过程。例如:

EXEC SeattleSales.master.dbo.xp_msver

权限

任何用户都可以执行 OPENQUERY。用于连接到远程服务器的权限是从为链接服务器定义的设置中获取的。

如何使用DBLink进行迁移呢

思路:

​ 1.从源数据库中查出表数据,然后直接通过insert插入到新表中

从源到操作系统下的sql server
truncate 库名.表名;
insert into 表名
(columnlist)
select columnist from [STAGE.RDS.LEARNING-GENIE.COM].库名.表名;
--如果数据量特别大,先抽取最近的数据,使用索引字段做区间过滤

\--
其他区间



从sql server到mysql
(插入语句)Insert openquery(MYSQL, 'select * from note') (.......) select ....... from notes_note
--也可以分区间执行

主要语句是:

Insert into Table2(field1,field2,...) select value1,value2,... from Table1

Insert into Table2(a, c, d) select a,c,**5** from Table1

insert OPENQUERY([MYSQL-STAGE-STAGE],'select FileType,MediumImgPath,FileName,CreateAtUtc,Width,Height from 。库名.表名') (FileType,MediumImgPath,FileName,CreateAtUtc,Width,Height)
 SELECT FileType,MediumImgPath,FileName,CreateAtUtc,Width,Height from [dblink名称].表名;
GO
insert OPENQUERY([MYSQL-STAGE-STAGE],'select table_name,endtime from 库名.表名') values('mediasa',GETUTCDATE());
GO

你可能感兴趣的:(数据库,工具的使用)