Пакет UTL_FILE в RAC

Недавно один из партнеров-разработчиков задал мне вопрос относительно работы с пакетом UTL_FILE в среде RAC.
Действительно: вопрос интересный. Давайте разберемся.



В качестве тестового стенда я буду использовать наш RAC 11g VMWare Image.
Итак, для начала, мы создаем каталог на локальном диске первого узла:

   rac1-> mkdir /u01/app/oracle/admin/racdb/log_dir
rac1->


Затем создаем объект-директорию (directory) в СУБД:
  rac1-> sqlplus / as sysdba

SQL*Plus: Release 11.1.0.7.0 - Production on Sun Oct 12 12:18:06 2008

Copyright (c) 1982, 2008, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, Real Application Clusters and Real Application Testing options

SQL> create directory log_dir as '/u01/app/oracle/admin/racdb/log_dir';

Directory created.

SQL> grant read, write on directory log_dir to rscott;

Grant succeeded.

SQL> exit;


Теперь, подключившись к первому узлу, попробуем записать файл в наш каталог log_dir:
  C:\>sqlplus rscott/rtiger@rac1

SQL*Plus: Release 11.1.0.7.0 - Production on Sun Oct 12 12:22:33 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, Real Application Clusters and Real Application Testing options

SQL>
SQL> declare
2 v_xFile utl_file.file_type;
3 v_xLine varchar2(32) := 'Hello World!';
4 begin
5 v_xFile := utl_file.fopen('LOG_DIR', 'test.log' , 'a');
6
7 utl_file.put_line(v_xFile,v_xLine);
8
9 utl_file.fflush(v_xFile);
10 utl_file.fclose(v_xFile);
11 end;
12 /

PL/SQL procedure successfully completed.

SQL> exit


Проверим наш файл на файловой системе первого узла:

rac1-> more /u01/app/oracle/admin/racdb/log_dir/test.log
Hello World!
rac1->
как видите: пока никаких проблем!

Давайте попробуем записать в этот каталог файл с второго узла (здесь и далее вывод утилиты SQL+ сокращен для удобства восприятия):

C:\>sqlplus rscott/rtiger@rac2

SQL>
SQL> declare
2 v_xFile utl_file.file_type;
3 v_xLine varchar2(32) := 'Hello World!';
4 begin
5 v_xFile := utl_file.fopen('LOG_DIR', 'test.log' , 'a');
6
7 utl_file.put_line(v_xFile,v_xLine);
8
9 utl_file.fflush(v_xFile);
10 utl_file.fclose(v_xFile);
11 end;
12 /
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 512
ORA-29283: invalid file operation
ORA-06512: at line 5
Мы получаем ошибку: на втором узле нет такого каталога в операционной системе.

Вывод: в RAC необходимо создавать каталоги на разделе файловой системе который виден сразу всем узлам кластера!
Вы можете возразить: "но ведь я могу создать одинаковые каталоги на всех узлах". Да, - можете, но для того, чтобы найти ваш файл, нужно будет обойти все узлы кластера, и поэтому работа с файлами сильно усложниться.

В нашем случае: создадим каталог в разделе который примонтирован к всем узлам; в качестве файловой системе используется OCFS:

rac1-> mkdir /ocfs/log_dir
rac1->

Переопределим нашу директорию LOG_DIR, чтобы она указывала на новый каталог

rac1-> sqlplus / as sysdba

SQL> create or replace directory log_dir as '/ocfs/log_dir';

Directory created.

И теперь снова попытаемся записать в этот каталог с второго узла:

C:\>sqlplus rscott/rtiger@rac2

SQL>
SQL> declare
2 v_xFile utl_file.file_type;
3 v_xLine varchar2(32) := 'Hello World!';
4 begin
5 v_xFile := utl_file.fopen('LOG_DIR', 'test.log' , 'a');
6
7 utl_file.put_line(v_xFile,v_xLine);
8
9 utl_file.fflush(v_xFile);
10 utl_file.fclose(v_xFile);
11 end;
12 /

PL/SQL procedure successfully completed.



Проверим наличие нашего файла с первого узла:

rac1-> more /ocfs/log_dir/test.log
Hello World!
rac1->
Все замечательно работает!

Но как быть, если в моем кластере нет разделяемого тома с кластерной файловой системой ?

Эту ситуацию мы рассмотрим в следующей серии (т.е. посте). :-)
Выход есть, и он не требует покупки и установки дополнительного софта !


3 комментария:

  1. Анонимный15/10/08 3:27 PM

    Дополнительный софт? зачем? не проще ли использовать NFS?

    ОтветитьУдалить
  2. "Выход есть, и он НЕ требует покупки и установки дополнительного софта"

    NFS - ? Ну..это частное решение.

    Вы понимаете, иногда люди используют платформу MS Windows....

    я тоже жду с нетерпением следующего поста Игоря Мельникова :)

    ОтветитьУдалить
  3. Анонимный15/3/09 7:34 AM

    Если оставить в стороне
    1) NFS, ocfs, etc.
    2) чётко прописывать нужный узел в конфигурации через например instance_name
    3) Полноценную замену функциональности utl_file, когда файлы, вместо хранения на файловой системе, хранятся в самой базе данных в blob
    ...

    то всё о чём "так долго говорили большевики" не случится. Игорь похоже это понял и решил не работать над статьёй :-) Хотя реализация 3) как решения это не будет полноценной заменой utl_file.

    ОтветитьУдалить