在SqlServer2000上面的一张表里面大约有9000w数据量。想导入到Oracle同名的一张表里面。尝试了以下方法:
1. SqlServer DTS。 导入了几百万条数据,DTS崩溃。
2. 写代码导入。效率不高,或者没有找对方法。准备建立透明网关,用 insert into a select * from a的方法去导入,不知道能不能成功
忘各位有经验的朋友能指点一二。

解决方案 »

  1.   

    这么大的表,如果都是ORACLe的话,可以用exp/imp 来完成。 
    Oracle下配置透明网关访问MS SQL SERVER配置环境:
    Oracle服务器:192.168.1.218 Oracle9.2.0.1 for Windows SID:lrdb
    MS SQL服务器:192.168.1.244 SQL SERVER 2000  要访问的库:lfkf1、安装 TRANSPARENT GATEWAY 选件(FOR MSSQL)
       安装完成了以后有这样一个目录 $ORACLE_HOME\ora90\tg4msql2、 配置 LISTENER.ORA, 在SID_LIST_LISTENER下添加:
       (SID_DESC =
         (GLOBAL_DBNAME = sql2000)         # 可自己命名
         (PROGRAM = tg4msql)
         (SID_NAME = sql2000)              # SID 自己命名
         (ORACLE_HOME = D:\oracle\ora92)
       )3、 在 oracle_home\ora90\tg4msql\admin
        建文件 init<SID>.ora 由于LISTENER里定义SID为 sql2000
        因此文件名为:initsql2000.ora
        其中内容为:
           HS_FDS_CONNECT_INFO="SERVER=192.168.1.244;DATABASE=lfkf"
           HS_FDS_TRACE_LEVEL=OFF
           HS_FDS_RECOVERY_ACCOUNT=RECOVER
           HS_FDS_RECOVERY_PWD=RECOVER4、重启LISTENER5、配置 tnsnames.ora
       sql2000 = 
         (DESCRIPTION = 
           (ADDRESS_LIST = 
             (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.218)(PORT = 1521)) 
           ) 
           (CONNECT_DATA = 
              (SID = sql2000) 
           ) 
           (HS=OK) 
       ) 6、建立数据库链:
       CREATE DATABASE LINK DB_SQL CONNECT TO sms IDENTIFIED BY linkrich USING 'sql2000';7、完成,测试
       select * from demo@db_sql
    使用oracle  提供的TRANSPARENT GATEWAY 选件,可以实现oracle 数据库和ms sql server ,sybase 数据库的互联
    以上是从网上搜的,如果能互连的话,能否通过
    create table tb as select * from tb_target的方式来复制表的?仅仅是建议啊..  也希望楼主实施之后分享下经验呀..
      

  2.   

    对,就是想通过透明网关来导入呢,耗时可能比较多,不知道会不会出现崩溃。DTS有内存泄露问题,导入快1000w数据时,程序占用内存大小超过4个G,崩溃了o(>﹏<)o
      

  3.   

    如果没有特殊字符,如回车、换行符什么的话可以考虑用bcp 导出sqlserver的数据,用sqlldr将导出的数据导入到oracle中
      

  4.   

    要不就自己写代码,同时连上sqlserver和oracle,从sqlserver中select出数据,用bulk insert的方式将数据写入oracle中
      

  5.   

    用Oracle SQL Developer Migration Workbench
      

  6.   

    可以考虑把sql的表分成n个表,然后导入到oracle对应的多个表,然后再在oracle里合并起来。这样的好处是,当某个表没导入成功时,只需要重新导入该表即可,而不需要重新导入所有的数据。
      

  7.   

    我是菜鸟,我会这么做:
    写代码,连接2000之后进行查询,按某一标志进行 ORDER BY,每次取500W条,需要20次(每次1000W,需要10次),每次记录标志的符号,这样的话需要的时间也是比较多了。优点:一次导入不完,可以分很多次导入,不会需要整块的时间来进行操作。
    缺点:效率方面可能没有专业的工具高。我是菜鸟,欢迎拍砖!
      

  8.   

    我没试过14楼的,但一看order by 已经就知道速度有多慢,肯定不行
      

  9.   

    呵呵,谢谢大家的关心。
    今天在项目实施过程中是按照yhuib童鞋的方法做的,先用bcp将SQLServer数据导出,然后用sqlldr工具导入。
    哇咔咔,数据呼啦呼啦的贼快。透明网关的方式,我本来想做的,但后来想想,花费的时间一定很多。
    于是抱着试试看的心理,用bcp和sqlldr先导出导入一个月的数据,看看要多长时间。
    结果,嘿嘿,蛮快的。10几分钟吧,总共600多w条数据。于是,打算用这种方法做导出导入。我是个勤快的人。( ⊙o⊙ ),数据一个月一个月的导,貌似有更加方便的做法(比如写个bat,循环,放在那里,去睡个觉,醒来就ok了。)大约9000w数据,花费了大约3.5小时。(还有提高效率的空间)死訷灬騎士,你的方法肯定不行的,读数据的速度估计还没有写数据的速度快呢,人家数据库一天就要有30多w的数据量。大量数据,看来用此种方法是没什么问题的。要注意一点,就是如果有varchar类型的数据,一定要注意特殊字符。
    有空的时候,我会把项目实施过程的具体资料弄上来给各位参考。再次感谢大家的帮忙,谢谢,O(∩_∩)O谢谢。
      

  10.   

    囧,惨了,眼看花掉了,没有给yubin88分,对不起了
      

  11.   

    我也遇到同样的问题,不过我用的是ORACLE 需要在WEB页面上通过上传TXT文件,编码来实现;请问LZ采用的方法效率如何,能不能将实施过程的具体资料,整上来学习学习。
      

  12.   

    比较好的方法是用数据划块的方法,将数据分成可导入的数据量进行DTS导入.
    我一般都用DTS,不过没碰到过你这么大的量.