Пакет 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:
Переопределим нашу директорию LOG_DIR, чтобы она указывала на новый каталог
rac1-> mkdir /ocfs/log_dir
rac1->
И теперь снова попытаемся записать в этот каталог с второго узла:
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->
Но как быть, если в моем кластере нет разделяемого тома с кластерной файловой системой ?
Эту ситуацию мы рассмотрим в следующей серии (т.е. посте). :-)
Выход есть, и он не требует покупки и установки дополнительного софта !
Дополнительный софт? зачем? не проще ли использовать NFS?
ОтветитьУдалить"Выход есть, и он НЕ требует покупки и установки дополнительного софта"
ОтветитьУдалитьNFS - ? Ну..это частное решение.
Вы понимаете, иногда люди используют платформу MS Windows....
я тоже жду с нетерпением следующего поста Игоря Мельникова :)
Если оставить в стороне
ОтветитьУдалить1) NFS, ocfs, etc.
2) чётко прописывать нужный узел в конфигурации через например instance_name
3) Полноценную замену функциональности utl_file, когда файлы, вместо хранения на файловой системе, хранятся в самой базе данных в blob
...
то всё о чём "так долго говорили большевики" не случится. Игорь похоже это понял и решил не работать над статьёй :-) Хотя реализация 3) как решения это не будет полноценной заменой utl_file.