使用DBMS_LOGMNR分析归档日志应用一例

来源:互联网 发布:狸窝视频转换器mac版 编辑:程序博客网 时间:2024/04/29 21:50

  有个项目提出的需求是这样的:部署两个相同的数据库应用A、B,两个库之间没有网络连接,要定期把A库里的数据复制到B库。
要求:

  1. 应用程序不做修改
  2. 实现增量数据更新(不能重复导入)

  我提出了使用DBMS_LOGMNR分析归档日志并redo变化的方案:

  1. A库上线前数据库需要启用归档日志
  2. 每次同步数据时对A库先执行一次日志切换,然后拷贝归档日志文件,拷贝后删除(最新生成的归档日志文件不要拷贝和删除)
  3. 在B库上使用DBMS_LOGMNR分析归档日志文件并redo变化

  因为网不通,手工拷贝文件的工作不可避免,所以可以认为第1、2步为手工操作。第1步为上线前的数据库准备,是一次性工作;第2、3步为周期性工作。对于第3步,做了个简单的实现:在B库机器上上规划好目录,这里D:\logmine为主目录,D:\logmine\redo_log存放从A库拷贝来的归档日志文件。在B库上执行一次初始化对象脚本:

[sql] view plain copy
  1. create or replace directory logfilename_dir as 'D:\logmine\';  
  2. grant read, write on directory logfilename_dir to wxy;  
  3.   
  4. conn user1/password1  
  5.   
  6. begin  
  7.    excute immediate 'create table logname_ext (logfile_name varchar2(300)) organization external (type oracle_loader default directory data_dir logfilename_dir location (''log_file_name.txt''))';  
  8. exception when others then  
  9.    if sqlcode = -955 then -- 名称已由现有对象使用  
  10.       null;  
  11.    else  
  12.       raise;  
  13.    end if;   
  14. end;  
  15. /  

要做的工作:

  1. 拷贝A库归档日志文件到D:\logmine\redo_log
  2. 执行D:\logmine\create_ext_table.bat
  3. 删除1步拷贝的归档日志文件

create_ext_table.bat

[plain] view plain copy
  1. echo off  
  2. dir /a-d /b /s D:\logmine\redo_log\*.log > D:\logmine\log_file_name.txt  
  3. sqlplus user1/password1 @D:\logmine\create_ext_table.sql  

create_ext_table.sql

[sql] view plain copy
  1. begin  
  2.    for x in (select logfile_name from logname_ext) loop  
  3.        dbms_logmnr.add_logfile(x.logfile_name);  
  4.    end loop;  
  5. end;  
  6. /  
  7.   
  8. execute dbms_logmnr.start_logmnr(options => dbms_logmnr.committed_data_only);  
  9.   
  10. begin  
  11.    for x in (select sql_redo   
  12.                from v$logmnr_contents   
  13.               where table_space != 'SYSTEM' and instr(sql_redo,'"WXY".') > 0  
  14.            order by commit_scn)  
  15.    loop  
  16.       execute immediate x.sql_redo;  
  17.    end loop;  
  18. end;  
  19. /  
  20.   
  21. exit;  

  这只是个实验,没有经过严格的测试,考虑到异常捕获和处理、数据量、系统负载、性能优化等等因素,能否应用于生产环境有待验证。

0 0