| 发表于:2007-12-24 15:55:522楼 得分:0 |
如何把ms sql server2000数据库移植到oracle9i 第一章 数据迁移基础 在信息共享日益普遍的情况下,各行各业都在进行着企业信息化建设,为了节约信息建设的费用,大都从现有的系统进行扩充或升级,erp之路任重而道远,一般情况下,企业往往有大量的重要数据要迁移到新系统中去。 数据迁移是一项繁锁而又单调的工作,面对各种各样的基础数据,定制开发数据迁移工具往往费时费力,切不通用,那么到底什么工具能够胜任我们的工作呢?ms dts可以将各种各样的数据源导入到各种各样的数据库,易学易用,在异构数据转换过程中,lob(txtt、image)字段的转换是容易失败的地方。 图1.1 字段合并 ms dts在数据转换方面简单易学,功能强大,不仅可以使用vbscript与jscript脚本进行数据合并、分解、转换、汇总,还可以用package的方式将转换过程存储在服务器上,通过代理服务多次/定时/调度地执行。 图1.2 异构数据 图1.3 脚本编写 msdts承袭了ms的易学易用的优良传统,对使用者的要求很低,经过短时间培训,一般文员都可以使用ms dts导入导出数据啦。 图1.4 调度计划 第二章 异构数据迁移 很多时间,要在异构数据库之间进行数据迁移或抽取,如果在ms sql server中提取oracle的数据,可以通过odbc、oledb等多种方式,要从oracle提取sql中的数据,大都是通过透明网关来实现的。 在异构数据抽取过程中,最好采用sql92标准的语法编写sql代码,同时要注意不同数据库之间数据类型的转换关系,如oracle的日期类型用date、ms sqlserver的日期类型用datetime等。在excel导入到ms sqlserver或oracle时,还要注意数字串的字段往往被目的数据库隐式转换成数字型的字段。 一 关于oracle的透明网关配置(for ms sql server) oracle安装时(9i),将transparent gateway for mssql选中,在oracle主目录\bin中,有个tg4msql.exe程序,它就是透明网关程序,同时在主目录中还有tgrmsql的这个目录,oracle_home$\tg4msql\admin目录中的inittg4msql.ora文件,必须手工进行配置才能在oracle中连接ms sql server。 图2.1 tg4msql 1 如何配置透明网关呢?打开inittg4msql.ora: # # hs init parameters # xzh代表ms sqlserver服务名,pubs代表要访问的ms sqlserver数据库 # hs_fds_connect_info="server=xzh;database=pubs" hs_fds_trace_level=off hs_fds_recovery_account=recover hs_fds_recovery_pwd=recover 2 监听的配置oracle_home\network\admin\listiner.ora listener = (description_list = (description = (address_list = (address = (protocol = tcp)(host = xzh)(port = 1521)) ) (address_list = (address = (protocol = tcp)(host = xzh)(port = 1527)) ) ) ) sid_list_listener = (sid_list = (sid_desc = (global_dbname = xzh.world) (oracle_home = d:\oracle\ora92) (sid_name = xzh) ) (sid_desc = (global_dbname =mysql) (program = tg4msql) (sid_name = mysql) (oracle_home = d:\oracle\ora92) ) ) 加亮部分代码是要在监听文件中手工添加,global_dbname、sid_name可以任意指定,progrm必须指向tg4msql 如图2.1所示。 3 本地服务文件的配置oracle_home\network\admin\tnsnames.ora xzh = (description = (address_list = (address = (protocol = tcp)(host = xzh)(port = 1521)) ) (connect_data = (server = dedicated) (service_name = xzh.world) ) ) tg4msql = (description = (address_list = (address = (protocol = tcp)(host = xzh)(port = 1527)) ) (connect_data = (sid =mysql) ) (hs = ok) ) 上例中ms sql server的本地服务名指定为tg4msql,可以任意写,sid必须是listiner.ora中指定的那个sid_name,port也必须是监听中指定的port,主机等都要符合一致。到此为止,我们把透明网关大致已经配置好啦,如果要访问ms sql server数据库,还要在oracle中创建数据库链才行。 4 在ms sqlserver中创建登录帐号xzh口令xzh,授权使之可以访问pubs数据库。 sql> create database link from_sql connect to xzh identified by xzh using ‘tg4msql' using ‘tg4msql'中的 ‘tg4msql'是tnsnames.ora中配置好的指定ms sql server服务器的可以被oracle访问的本地服务名,from_sql是我们以后要引用的数据库链名,切记ms sql server中的登录帐号(xzh/xzh)必须符合oracle的帐号规范,如果用(xzh/0000)就会在创建数据库链路时失败。 sql> select * from sales@from_sql 如果有数据返回,表示我们访问sql数据库的通道已经建成,请大胆使用吧,但对远程异构数据库不充许进行ddl操作。 sql> create table all_users@tg4msql from all_users; error 位于第 1 行: ora-02021: 不允许对远程数据库进行 ddl 操作 二 ms sql server访问oracle的方法 1 通过行集函数opendatasource select * from opendatasource( 'msdaora', 'data source=xzh.oracle;user id=pos;password=pos')..pos.a0325 msdaora是oledb for oracle的驱动,初始化字符串中必须提供要访问的oracle本地服务名、用户名、口令。然后引用表中数据时要以服务器..用户名.表名的格式。注意一定是四部分组成,用户名与表名一定要大写,服务器与用户名之间是两个点号。 select * into pubs.dbo.a0325 from opendatasource( 'msdaora', 'data source=uite;user id=pos;password=pos' )..pos.a0325 说明:将oracle服务器uite中pos模式的a0325导入到ms sqlserver的pubs数据库,注意a0325在这条语气执行时被创建,如果a0325已经存在pubs数据库中,可以使用insert into的语法导入数据 insert into pubs.dbo.a0325 from opendatasource( 'msdaora', 'data source=uite;user id=pos;password=pos' )..pos.a0325 2 通过ms sqlserver的链接服务器访问oracle的数据 --在查询分析器中查看已经存在的链接服务器 select*from sysservers --添加链接服务器orcl到ms sql server,也可以在企业管理器中创建 EXEC sp_addlinkedserver @server = 'orcl', --orcl是sql中链接服务器名称 @srvproduct = 'oracle', --oracle 固定的 @provider = 'msdaora', --msdaora 固定的 @datasrc = 'uite' --datasrc 本地服务名 EXEC sp_dropserver ‘orcl' --删除链接服务器 在这里声明一下,如果现在就访问oracle肯定不能,因为没有提供登录oracle的用户名/口令 EXEC sp_addlinkedsrvlogin 'orcl', false, 'sa', 'pos', 'pos' sa是ms sqlserver的登录帐号,pos/pos是oracle的登录帐号。 select * from orcl..pos.a0325 from后面必须是四部分组成。为什么执行后报错呢,本人一直在寻找解决办法,最后发现通过t-sql语句没法解决,只有打开ms sqlserver的企业管理器。 图2.2 配置oracle的远程帐号 图2.3设置远程登录帐号 select * from orcl..pos.a0325 通过图2.2、2.3以后,在查询分析器执行时,立即从oracle的orcl服务器上pos模式的a0325表中查到数据,注意在图2.3步操作过程中,必须在安全性页面选中“用此安全上下文进行”的复选项,然后在“远程登录/使用密码”所对应的文本中输入orcl服务器上有登录权限的帐号。 select * from openquery(orcl, 'select * from pos.a0325') 3 使用ms sql server的openrowset函数 select a.* from openrowset('msdaora', 'uite';'pos';'pos', pos.a0325) as a order by a.id 说明:有些地方使用行集函数要用别名才能引用,请大家注意。 4使用odbc的方式 select a.* from openrowset('msdasql','orcl_odbc';'pos';'pos', pos.a0325) as a order by a.id 说明:orcl_odbc是访问oracle 服务器uite的odbc数据源,以上所有代码在sql query analyze 中通过。关于ms sql server访问oracle有四种方式,其中通过odbc与链接服务器的方式做起来难度较大,对于初学者会复杂一些,使用ole db for oracle的驱动时,有opendatasource与openrowset函数可以使用,都很方便,笔记喜欢使用后者,交待一下,在数据存取方面,ole db效率较odbc为佳。 | | |
|