今天有朋友在blog中问了这么一个问题,RAC环境中应用外部表(rac1上),如果把外部表设置并行度,在查询该外部表时是否会报错?,一开始就觉得如果是不是在共享存储,由于另一个节点访问不了directory设置的路径,因此会报错。测试结果也是如此:
在rac1的非共享存储上上创建一个用于测试的平面文件
1 2 3 4 5 |
rac1-> pwd /export/home/oracle/test_for_external_table_on_rac1 rac1-> ls -l total 976 -rw-r----- 1 oracle oinstall 988581 Mar 18 23:52 test.log |
在rac1上创建外部表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
SQL> create or replace directory bdump_dir as '/export/home/oracle/test_for_external_table_on_rac1'; Directory created. SQL> CREATE TABLE alert_log 2 ( 3 text_line varchar2(255) 4 ) 5 ORGANIZATION EXTERNAL 6 ( TYPE ORACLE_LOADER DEFAULT DIRECTORY bdump_dir ACCESS PARAMETERS 7 8 9 10 ( 11 records delimited by newline 12 fields 13 REJECT ROWS WITH ALL NULL FIELDS 14 ) 15 LOCATION 16 ( 17 'test.log' 18 ) 19 ) 20 REJECT LIMIT unlimited 21 / Table created. |
在rac1上查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- devdb1 SQL> select count(*) from alert_log; COUNT(*) ---------- 14504 SQL> |
在rac2上查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- devdb2 SQL> select count(*) from alert_log; select count(*) from alert_log * ERROR at line 1: ORA-29913: error in executing ODCIEXTTABLEOPEN callout ORA-29400: data cartridge error KUP-04063: unable to open log file ALERT_LOG_30747.log OS error No such file or directory ORA-06512: at "SYS.ORACLE_LOADER", line 19 SQL> |
3条评论
Hi 小荷:
首先感谢你花时间测试我的问题。
再请教一个问题,在rac环境下,不设置外部表的并行度,查询性能很差,有没有什么好的解决办法呢,让外部表只应用rac1上的CPU?
或者如何共享存储?用NFS?
re leon:我个人觉得可以把外部表放共享存储上,然后手工选择负载较小的节点登录。或者可以sqlldr把外部表load到数据库里面操作吧。