既然a2是a1的备份,数据要求完全一致,那你可以把a2的数据全部删除,然后把a1的所有数据全部插入a2.
如果以后要进行同步,可以建立触发器来保持数据一致.

解决方案 »

  1.   

    oracle中使用触发器同步两个数据表的例子,插入/删除/修改a1中的纪录,同时修改a2的纪录这样只需要开始同步a1和a2表,以后就不用操心了create table a1 (
        id number(8),
        compname varchar2(20),
        compcode varchar2(50),
        chapter  varchar2(50),
        compnumber number(8),
        dealdate  date
    );create table a2 (
        id number(8),
        compname varchar2(20),
        compcode varchar2(50),
        chapter  varchar2(50),
        compnumber number(8),
        dealdate  date
    );
    CREATE OR REPLACE TRIGGER tr_bf_test
    BEFORE INSERT OR UPDATE OR DELETE ON a1 
    FOR EACH ROW
    BEGIN
      IF INSERTING THEN
        INSERT INTO a2
        VALUES(:new.id,:new.compname,:new.compcode,:new.chapter,:new.compnumber,:new.dealdate);
      ELSIF UPDATING THEN
        UPDATE a2 SET id=:new.ID,
                         compname=:new.compname,
                         compcode=:new.compcode,
                         chapter=:new.chapter,
                         compnumber=:new.compnumber,
                         dealdate=:new.dealdate
        WHERE ID = :old.ID;
      ELSE 
        DELETE FROM a2
        WHERE ID = :old.ID;
      END IF;
    END tr_bf_TTRIG;
    /
      

  2.   

    既然A2只做数据备份,而且和A1的结构完全一样,建议将A2表DROP掉,然后创建一个名字为A2的快照指向A1,设定为定时刷新即可。如果你要完成增量刷新,必须要在A1表上创建快照日志。
     创建快照:
    CREATE SNAPSHOT snapshot_name
       [PCTFREE integer]
       [PCTUSED integer]
       [INITRANS integer]
       [MAXTRANS integer]
       [TABLESPACE tablespace_name]
       [STORAGE storage_clause]
       [USING INDEX [PCTFREE integer]
       [INITRANS integer]
       [MAXTRANS integer]
       [STORAGE storage_clause]]
       [CLUSTER cluster_name (cluster_columns)]
       [REFRESH [FAST | COMPLETE | FORCE]
       START WITH date_expression NEXT date_expression]
       [AS subquery]
      

  3.   

    快照又叫物理视图,你完全不必考虑数据的刷新工作,当然你也可以定为手工刷新方式。如果需要手工刷新,只需要调用:dbms_refresh包中的有关功能即可。
    比如,刷新所有快照:
     begin
      dbms_refresh.refresh_all();
     end;
      

  4.   

    用触发器很方便,但是会有数据库性能上的损失不过是个不错的选择了good luck 
      

  5.   

    谢谢各位的回答:
        由于我是通过a1表中的数据和a2表中数据的比较,只把变动的记录写到一个文件中或作为结果返回(传送远端服务器),然后在把表a2中的数据更新的和a1表中的数据一样。
        经过一个固定的时间段再重新如上操作,把a1中变化的数据记录写到一个文件中或作为结果返回,把文件或返回的结果传到远端另一台服务器。
        发送程序是java来开发的。
        不知各位有好的方法没有??
         等·!
      

  6.   

    使用utl_file包把变化的记录写进文件中.但要注意init.ora参数设置,utl_file_dir是设置文件根目录下
    DECLARE
      v_FileHandle UTL_FILE.FILE_TYPE;
    BEGIN
      v_FileHandle := UTL_FILE.FOPEN('/tmp/', 'utl_file.txt', 'w');
      
      -- Write some lines to the file.
      UTL_FILE.PUT_LINE(v_FileHandle, 'This is line 1!');
      FOR v_Counter IN 2..11 LOOP
        UTL_FILE.PUTF(v_FileHandle, 'This is line %s!\n', v_Counter);
      END LOOP;
      
      -- And close the file.
      UTL_FILE.FCLOSE(v_FileHandle);
    END;
    /
      

  7.   

    我想你可以不用存储过程,编一个脚本包含特定的“exp”,"imp"不就行了。