背景介绍
异构数据库之间的数据复制和迁移,对于所有IT人员来说都是一个挑战,大多数方案中麻烦,也是复杂的部分在于数据类型的转换,以及目标数据库的初始化。针对这个问题,本公众号将推出系列文章,向大家介绍从Microsoft SQL Server数据库迁移到Oracle数据库的几种方法,希望对大家有所帮助。
篇:我们将使用Microsoft的导入/导出工具,先将SQL Server数据库的数据导出,然后将这些数据导入目标的Oracle数据库,实现数据的初始化,后使用Oracle GoldenGate实现异构数据复制。
第二篇:我们将使用Oracle的SQL Developer工具将数据从SQL Server数据库中导入到Oracle数据库中,然后使用Oracle GoldenGate使用异构数据复制。
SQL Server的导入/导出工具可以实现将SQL Server的数据导入到其他目标数据库的功能,同时,这个工具还有另外一个用途:我们可以利用它来连接Oracle数据库。首先,我们必须安装在SQL Server服务器上,安装一个Oracle Data Access Client软件,然后进行网络配置(设置好Oracle*Net)。
我们的目标数据库是Oracle 12c,从Oracle的官方网站上下载相应版本的ODAC:
http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html
安装Oracle Data Access Client
下载软件压缩包后,解压,点击setup.exe,启动Oracle Universal Installer,进入图形化安装界面:
在OUI中选择产品语言
在“指定Oracle主目录用户”界面,选择缺省的“Use WindowsBuilt-in Account”
指定软件安装目录
在选择产品组件界面,直接接受缺省选择即可
在ODP.NET设置界面,勾选多选框,在系统层面设置ODP.NET:
在数据库连接配置界面,设置目标Oracle数据库的连接方式,设置数据库连接别名oggpdb,端口1521,数据库服务器名slc08ggk,数据库服务名是oggpdb,目标库是一个PDB,数据库名就叫oggpdb,对外都是通过服务名连接。
安装前先决条件检查,是否满足小安装需求。
先决条件检查没有问题,安装前确认
开始安装
安装成功!
使用Microsoft Data Link进行Oracle数据库连接测试,在Windows桌面上创建一个文本文件,名字叫“TestOraLink.udl”
双击刚刚创建的文件,进入Data Link Properties界面,选择“Oracle Provider for OLE DB”
在“Data Link Properties Connection”设置界面填写:Data Source填入在ODAC安装过程设置的目标数据库别名oggpdb,在数据库登录信息部分填写目标数据库的用户名和口令。
点击“Test Connection”按钮测试数据库连接,在弹出窗口中会显示连接成功或失败的信息。
连接测试成功后,在“Data Link Propertie”窗口点击OK,关闭窗口。
在继续后面步骤前,先确保SQL Server数据库已经按照Oracle GoldenGate复制要求配置好,另外GoldenGate软件按照复制SQL Server的要求安装并配置好。
设置数据捕获和应用
在开始导入/导出前,需要将源库(SQL Server 2008)离线,确保在数据导出过程中,源库的数据处于静止状态。等数据导出结束后,在源库上线前(业务应用访问源SQL Server前),应先启动源端GG的数据抽取(Extract)和数据传递(Data Pump),开始捕获数据变化,并把产生的GoldenGate日志存放到目标端的GoldenGate实例中。后在目标端,采用Integrated Replicat模式将源端捕获的变化数据应用到目标Oracle数据库中。
GoldenGate配置文件示例如下:
源端设置:
//Classic Extract(抽取进程)
extract eljp
sourcedb mss08ljp, userid ggadmin, password Oracle1
tranlogoptions managesecondarytruncationpoint
exttrail ./dirdat/ep
reportcount every 10 minutes, rate
table dbo.*;
//Extract Data Pump(传递进程)
extract pljp
rmthost slc08ggk.us.oracle.com, mgrport 7898, compress
rmttrail ./dirdat/rp
reportcount every 10 minutes, rate
table dbo.*;
在源库的GoldenGate实例中执行以下命令,添加抽取进程和传递进程,以及相应的trail日志
GGSCI (den01eln) 4> add extract eljp, tranlog, begin now
EXTRACT added.
GGSCI (den01eln) 5> add exttrail ./dirdat/ep, extract eljp, megabytes 500
EXTTRAIL added.
GGSCI (den01eln) 6> add extract pljp, exttrailsource ./dirdat/ep
EXTRACT added.
GGSCI (den01eln) 7> add rmttrail ./dirdat/rp, extract pljp
RMTTRAIL added.
在目标端,修改GoldenGate manager进程的参数:
//Manager(管理进程)
port 7898
purgeoldextracts ./dirdat/*, usecheckpoints
ACCESSRULE, PROG *, IPADDR *, PRI 1, ALLOW
dynamicportlist 15000-15100
autorestart er *, retries 3, waitseconds 60, resetminutes 60
注意:在manager进程的参数中,设置了autorestart参数,这个参数的作用是,当抽取或复制进程失败时,manager进程会自动尝试重启这些失败的进程。
在目标端,创建Replicat进程
//Replicat(复制进程)
replicat rmssljp
userid lpenton@oggpdb, password Oracle1
reportcount every 10 minutes, rate
map dbo.categories, target lpenton.categories;
map dbo.categories_description, target lpenton.categories_description;
map dbo.customers, target lpenton.customers;
map dbo.customers_info, target lpenton.customers_info;
map dbo.customers_lookup, target lpenton.customers_lookup;
map dbo.next_cust, target lpenton.next_cust;
map dbo.next_order, target lpenton.next_order;
map dbo.orders, target lpenton.orders;
map dbo.orders_products, target lpenton.orders_products;
map dbo.orders_status_history, target lpenton.orders_status_history;
map dbo.orders_totals, target lpenton.orders_totals;
map dbo.products, target lpenton.products;
map dbo.products_description, target lpenton.products_description;
map dbo.products_to_categories, target lpenton.products_to_categories;
在GGSCI中执行以下命令,添加复制进程和相应的trail日志
GGSCI (slc08ggk) 3> dblogin userid lpenton@oggpdb, password Oracle1
Successfully logged into database OGGPDB.
GGSCI (slc08ggk as lpenton@a12101s/OGGPDB) 4> add replicat rmssljp, integrated, exttrail ./dirdat/rp
REPLICAT (Integrated) added.
SQL Server导入/导出工具
本例中采取的数据初始化方式需要中断业务,将源SQL Server数据库离线,确保在使用SQL Server导入/导出工具进行数据初始化时,源库的数据是静止数据。
将源SQL Server数据库离线后,就可以使用SQL Server导入/导出工具来实现目标Oracle数据库的初始化。
注意:必须在CMD或者PowerShell命令行窗口中调用SQL Server导入/导出工具。 在本例中,我们在PowerShell中执行DTSWizard.exe命令
进入SQL Server导入/导出工具的启动界面
在选择“SQL Server数据源”界面,选择服务器、SQL Server数据库认证方式和数据库
选择“Oracle Provider for OLE DB”作为目标,然后点开“Properties”按钮,进入目标Oracle数据库的配置界面
在“Data Link Properties Connection ”界面填写目标Oracle数据库的相关连接信息:数据源(前面已经设置好的数据库别名)oggpdb,数据库的用户名和口令,
点击“Test Connection”按钮测试数据库连接
连接测试成功后,点击OK,OK,然后下一步,进入“Specify Table Copy or Query”,选择“Copy data from one or more tables or views”
在源SQL Server数据库中,选择需要复制的表和视图
源表选择后,在目标表名将会出现,保持目标表名称与源表一致
如果不想导出所有表,CTRL加右键点击每一张需要导出的表,选择“Edit Mappings”按钮,选择目标Oracle数据库中的要导入数据的schema。如果这些表已经存在,则勾选“Drop and recreate new destination tables”或“Delete rows in existing destination tables”。本例为数据迁移,目标表不存在,所以不需要勾选这两个选项。
双击每一张目标表,设置映射字段和数据类型转换
在示例中,字段“categories_id”在SQL Server的定义类型是bigint,但是Oracle数据库不能识别bigint类型,所以必须要将数据类型转换成Oracle可以识别的类型。示例中Oracle的数据类型NUMBER(19)等同于SQL Server的BIGINT。点击“Edit SQL”按钮,进入创建表的SQL语句界面,手工编辑字段的数据类型。
对其他表做相同的操作。
注意:在表和字段命名上,Oracle是区分大小写的。虽然在创建表和字段时,Oracle会自动把表和字段的名称转成大写,并以大写的方式保存,但是在创建SQL语句中,如果用双引号(“”)把表和字段名称包含进去,就会强制Oracle存放语句中指定的格式,比如双引号中有小写字符,Oracle就会强行把这些格式存放进去,那么在使用这个表或字段时,必须通过用双引号包含指定字符(小写字符)的方式调用,否则Oracle会自动转换成大写。
转换工具存在一个问题,就是在自动生成目标库表脚本的时候,表名和字段名都是用双引号括起来的小写字母,如果不修改,那么在Oracle数据库中生成的表和字段会强制以小写形式存储,后期在操作Oracle的表和字段时,都需要用小写,而且要用双引号括起来。
因此在用SQL Server导入/导出工具的方式向Oracle数据库,做数据复制初始化时,有几种方式处理:种方法,把系统自动生成的SQL建表脚本拷贝出来,用一些文本处理工具,比如editplus或者ultraedit,把所有字母一块转成大写,然后再拷贝到导入/导出工具中,这样创建的表和字段名都是大写;另一种方法,把所有系统自动生成的SQL脚本都拷贝出来,一次全转成大写,然后把脚本在目标Oracle数据库中执行,那么在前面的步骤中,选择源表和目标表时,就可以手工选择目标库中已经创建好的表。
在本例中,我们采用种方法,在导入/导出工具中,把所有表的SQL脚本都修改一遍,通过导入/导出工具来创建目标库表。
但表定义调整工作完成后,点击Next,继续后面的步骤。
SSIS允许你是用XML文件的方式提供数据类型转换映射,本例中不打算采用这种方式,直接进入下一步。
选择Finish,开始导出数据。
在导出界面可以看到整个数据导出过程,每一张对象的导出进度和状态。
数据导出结束,点击Close按钮,退出SQL Server导入/导出工具界面。
源端OGG操作
在源端启动GoldenGate的抽取和传递进程,开始捕获源库的数据变化,同时使用info等命令查看进程运行状态。
GGSCI (den01eln) 10> start er *
Sending START request to MANAGER …
EXTRACT ELJP starting
Sending START request to MANAGER …
EXTRACT PLJP starting
GGSCI (den01eln) 11> info er *
EXTRACT ELJP Last Started 2017-04-20 09:58 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:02 ago)
Process ID 6300
VAM Read Checkpoint 2017-04-20 09:54:11.730000
LSN: 0x0000005b:000000de:0029, Tran: 0000:00002e80
EXTRACT PLJP Last Started 2017-04-20 09:58 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:00 ago)
Process ID 4676
Log Read Checkpoint File ./dirdat/ep000000000
First Record RBA 1280
开启源端的GG抽取进程后,就可以让源SQL Server上线,业务可以正常运行了,这时源端的数据变化都会被GG捕获,并存入GG的trail日志中。
目标端OGG操作
此时目标端OGG Replicate进程还没启动,源端的数据变化只是在GG的Trail日志中。在开启目标端Replicate进程前,需要对目标端Oracle数据库进行一些调整。
有一点需要重点关注:在使用SQL Server导入/导出工具进行数据初始化时,使用导入导出工具创建的目标库表,是不包含主键和索引的,所以,在数据导入结束后,需要人工在目标库上创建主键和索引。所以在启动目标端OGG时,应先参照源库结构,创建目标库表的主键和索引。
启动目标GG的Replicate进程
GGSCI (slc08ggk as lpenton@a12101s/OGGPDB) 5> start rmssljp
Sending START request to MANAGER …
REPLICAT RMSSLJP starting
在GGSCI接口执行info命令,查看集成式Replicate进程的状态。
GGSCI (slc08ggk) 6> info rmssljp
REPLICAT RMSSLJP Last Started 2017-04-20 13:22 Status RUNNING
INTEGRATED
Checkpoint Lag 00:00:00 (updated 00:00:05 ago)
Process ID 3072
Log Read Checkpoint File ./dirdat/rp000000000
First Record RBA 0
查看Replicate进程状态
GGSCI (slc08ggk) 84> info rmssljp
REPLICAT RMSSLJP Last Started 2017-04-20 13:25 Status RUNNING
INTEGRATED
Checkpoint Lag 00:00:00 (updated 00:00:06 ago)
Process ID 23950
Log Read Checkpoint File ./dirdat/rp000000000
2017-04-20 13:27:17.977679 RBA 1340850
总结
在本文中,我们介绍了使用SQL Server的导入/导出工具来完成SQL Server到Oracle PDB的数据初始化工具,后续,我们还将发布其他文章来介绍GoldenGate的其他功能。
下次,我们还将跟大家分享使用Oracle SQL Developer,来捕获并转换SQL Server的数据到Oracle数据库中,实现异构数据复制的数据初始化。
本文来源https://www.modb.pro/db/70586