最近天天从SQLSERVER倒数据,妈的手工一天才导出几个表, 并且还十分郁闷。
那么我就带给大家一个好的方法; 使用透明网关来实现数据异构数据库的导出。
环境 WIN7 ORACLE 11G R2 SQLSERVER2008
;因为我的WIN7 是64位 ODBC与其他数据库连接稍有点问题,但是话费了一个晚上加1白天的时间还是把问题解决;
步骤
一、 ORACEL 11G R2 和SQLSERVER已经安装好了;
安装11G GATEWAY 这个需要去官方下载。
安装后11G 有时候会安装在$ORACLE_HOME中的 有时候会在HOME上新建一个tg_1的文件夹存放这些东西, 其实无所谓了。
二 、安装后,需配置3个文件。
1 dg4msql目录下的 \admin\inittest.ora 这个文件是拷贝他D:\oracle\product\11.2.0\dbhome_2\dg4msql\admin\initdg4msql.ora
2 修改你新建的inittest.ora
HS_FDS_CONNECT_INFO="192.168.175.238;database=test"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER.
注意:若是SQLSERVER中有命名的实例 那么11G的写法如下:
HS_FDS_CONNECT_INFO="[192.168.175.115]\\sql2008;database=BStyle_Business_0413"
HS_FDS_TRACE_LEVEL=OFF
_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
在LISTENER中增加
(SID_DESC=
(SID_NAME=test)
(ORACLE_HOME=D:\oracle\product\11.2.0\dbhome_2)
(PROGRAM=dg4msql)
配置TNSNAME.ORA1
test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.175.238)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =test)
)
三 连接数据库创建DBLINK ----KENAN 和IDENTIFIED BY 为MSSQL的账号和密码
CREATE PUBLIC DATABASE LINK MSLINK
CONNECT TO "KENAN" IDENTIFIED BY “***”
USING 'TEST'
OK
就开始测试了
其他事项
1、即使SQL SERVER是设置为大小写不敏感的,但oracle通过TG4MSQL访问SQL SERVER时,还是会按SQL SERVER系统表中登记的对象名来判断对象是否存在,因此,如果在SQL SERVER中按create table t_test(c1 int, ...)来创建的表,那么在oracle中想查找c1为10的记录就必须写为 select * from t_test@DBLINKNAME where "c1"=10;
2、按oracle配置手册上说可以在oracle中直接执行SQL SERVER的存储过程,但如果存储过程的拥有者不是DBLINK所设置的用户,那么直接执行存储过程会报“表或视图不存在”。解决的办法是通过 dbms_hs_passthrough.execute_immediate来执行存储过程。
3、在oracle中通过网关访问SQL SERVER后,一定要提交事务。包括执行select。
4、如果是通过网关同步数据,最好是先将要同步的数据全插入SQL SERVER的中间表,然后在SQL SERVER中执行存储过程来判断哪些是要修改哪些是要新插入。这样做效率很高。否则通过网关来比较两边的数据会很慢。而且要控制不要频繁提交。
5、如果MS SQL SERVER数据库设置自增值列的话,用insert into test@dblinkname() values()时会出错,无法成功。应尽量避免这种方式操作。解决的办法是通过 dbms_hs_passthrough.execute_immediate来执行存储过程。
6、如果ORACLE与MS SQL SERVER 要启用分布式事务更新数据,必须在MS SQL SERVER中要访问的数据库中创建一张创建表的脚本:
DROP TABLE HS_TRANSACTION_LOG
go
CREATE TABLE HS_TRANSACTION_LOG(
GLOBAL_TRAN_ID char (64) NOT NULL,
TRAN_COMMENT char (255) NULL
)
go
grant all on HS_TRANSACTION_LOG to public
在$(oraclehome)\ora92\tg4msql\admin\tg4msql_tx.sql。
2 O* }& s0 D8 u9 {* d- a/ s3 o" X而且连接SQL SERVER的用户要读写权限。
还有 若是使用透明网关进行导数据 那么最好
alter database flashback on/off
然后再alter system set db_recovery_file_dest='';
今天我在导出数据的时候遇到了闪回去慢 造成脚本无法继续进行