• Oracle Directory文件夹的知识


    在上一章介绍expdp/impdp时曾使用过DIRECTORY这个概念,以下再简单说明下DIRECTORY的点点滴滴。

    MOS上对DIRECTORY的解释(266875.1):

    (1)、基于服务端 vs 基于client

    DIRECTORY变量指出了expdp导出数据泵或impdp导入数据泵将dump文件、log文件以及SQL文件(仅适用于impdp)写到什么路径。

    由于导出数据泵和导入数据泵都是基于服务端的,不是基于client的,因此输出文件的路径都是相对于服务端文件夹的路径。数据泵要求将文件夹路径作为一个文件夹对象。一个文件夹对象将文件系统的一个文件夹路径映射为一个名称。

    (2)、怎样创建一个文件夹对象?

    为了创建文件夹,必须具有DBA角色或者赋予了CREATE ANY DIRECTORY权限。

    演示样例:

    Window平台

    CONNECT system/manager  
    CREATE OR REPLACE DIRECTORY my_dir as 'D:DataPump';  
    CREATE OR REPLACE DIRECTORY my_logdir as 'E:logs';  
    GRANT read, write ON DIRECTORY my_dir TO scott;  
    GRANT read, write ON DIRECTORY my_logdir TO scott;

    Unix平台

    CONNECT system/manager  
    GRANT CREATE ANY DIRECTORY TO scott;  
    CONNECT scott/tiger  
    CREATE OR REPLACE DIRECTORY my_dir as '/usr/DataPump';  
    CREATE OR REPLACE DIRECTORY my_logdir as '/usr/logs'; 

    假设普通用户被赋予了CREATE ANY DIRECTORY权限,那么用户就自己主动具备文件夹的READ和WRITE权限

    注意:CREATE DIRECTORY语句不会创建磁盘的真实文件夹。假设文件夹是无效的,数据泵作业会报错:

    ORA-39002: invalid operation 
    ORA-39070: Unable to open the log file. 
    ORA-29283: invalid file operation 
    ORA-06512: at "SYS.UTL_FILE", line 475 
    ORA-29283: invalid file operation

    (3)、怎样查询可用的文件夹?

    能够使用例如以下SQL查询具有READ和WRITE权限的文件夹:

    SET lines 80 
    COL grantee FORMAT a20 
    COL privilege FORMAT a10 
    SELECT directory_name, grantee, privilege 
      FROM user_tab_privs t, all_directories d   
     WHERE t.table_name(+)=d.directory_name   
     ORDER BY 1,2,3;

    DIRECTORY_NAME                 GRANTEE              PRIVILEGE 
    ------------------------------ -------------------- ---------- 
    DATA_PUMP_DIR                  EXP_FULL_DATABASE    READ 
    DATA_PUMP_DIR                  EXP_FULL_DATABASE    WRITE 
    DATA_PUMP_DIR                  IMP_FULL_DATABASE    READ 
    DATA_PUMP_DIR                  IMP_FULL_DATABASE    WRITE 
    MY_DIR                         SCOTT                READ 
    MY_DIR                         SCOTT                WRITE 
    MY_DIR                         SYSTEM               READ 
    MY_DIR                         SYSTEM               WRITE 
    MY_LOGDIR                      SCOTT                READ  
    MY_LOGDIR                      SCOTT                WRITE  
    MY_LOGDIR                      SYSTEM               READ  
    MY_LOGDIR                      SYSTEM               WRITE  
    ...

    (4)、须要的操作系统权限。

    对文件夹对象的READ或WRITE权限只表示Oracle将会替你读或写这个文件。你并没有訪问Oracle以外文件的权限,除非你具备合适的操作系统权限。

    (5)、数据泵怎样决定文件的路径

    5.1 假设文件夹对象是文件标示符的一部分,那么文件夹对象指定的路径就须要使用。在文件夹MY_DIR创建dump文件的演示样例:

    > expdp scott/tiger DUMPFILE=my_dir:expdp_s.dmp NOLOGFILE=Y

    5.2 假设文件夹对象不代表一个文件,那么就须要使用DIRECTORY变量命名的文件夹对象。文件夹MY_DIR中创建dump文件。文件夹MY_DIR_LOG中创建日志文件的演示样例:

    > expdp scott/tiger DIRECTORY=my_dir DUMPFILE=expdp_s.dmp  
    LOGFILE=my_logdir:expdp_s.log

    5.3 假设没有明白文件夹对象,也没有以DIRECTORY变量命名的文件夹对象。那么环境变量DATA_PUMP_DIR将会使用。环境变量是在在执行导出和导入数据泵应用的client系统中使用操作系统命令定义的,分配给基于client环境变量的取值必须和基于服务端的文件夹对象一致,且必须首先在server端建立

    文件夹MY_DIR中创建dump文件和MY_DIR_LOG中创建日志文件的演示样例:

    在使用expdp的client机器上,设定环境变量:

    -- On windows, place all expdp parameters on one single line:

    C:> set DATA_PUMP_DIR=MY_DIR  
    C:> expdp scott/tiger@my_db_alias DUMPFILE=expdp_s.dmp 
    LOGFILE=my_logdir:expdp_s.log

    注意环境变量DATA_DUMP_DIR相应的文件夹名称是大写和小写敏感的。

    设定错误的DATA_PUMP_DIR环境变量会报错。比如:DATA_PUMP_DIR=My_Dir:

    ORA-39002: invalid operation 
    ORA-39070: Unable to open the log file. 
    ORA-39087: directory name My_Dir is invalid

    5.4 假设之前三种情况都没有创建文件夹对象,作为一个具有权限的用户(比如具有EXP_FULL_DATABASE或IMP_FULL_DATABASE角色),那么数据泵试图使用默认的基于server端的文件夹对象,DATA_PUMP_DIR。理解数据泵不会创建DATA_PUMP_DIR文件夹对象是很重要的。仅当授权用户未使用不论什么之前提到的机制创建的文件夹对象时。才会尝试使用DATA_PUMP_DIR。

    这个默认的文件夹对象必须首先由DBA创建。不要将这个和同名的基于client的环境变量相混淆。

    首先,清空DATA_PUMP_DIR环境变量:

    C:> set DATA_PUMP_DIR=

    创建DATA_PUMP_DIR的文件夹:

    CONNECT SYSTEM/MANAGER   
    CREATE OR REPLACE DIRECTORY data_pump_dir AS 'D:DataPump';   
    GRANT read, write ON DIRECTORY data_pump_dir TO scott;

    -- On windows, place all expdp parameters on one single line: 

    C:> expdp system/manager@my_db_alias DUMPFILE=expdp_s.dmp  
    LOGFILE=expdp_s.log SCHEMAS=scott

    假设SCOTT用户不是授权用户,不能使用默认的DATA_PUMP_DIR。

    ORA-39002: invalid operation 
    ORA-39070: Unable to open the log file. 
    ORA-39145: directory object parameter must be specified and non-null

    用户SCOTT的解决方法:如上面5.3。SCOTT能够环境变量设置DATA_PUMP_DIR为MY_DIR:

    -- On windows, place all expdp parameters on one single line:

    C:> set DATA_PUMP_DIR=MY_DIR
    C:> expdp scott/tiger@my_db_alias DUMPFILE=expdp_s.dmp 
    LOGFILE=expdp_s.log SCHEMAS=scott

    或者这样的特定场景下。用户SCOTT也能够有文件夹DATA_PUMP_DIR的读和写权限:

    -- On windows, place all expdp parameters on one single line: 

    C:> set DATA_PUMP_DIR=DATA_PUMP_DIR
    C:> expdp scott/tiger@my_db_alias DUMPFILE=expdp_s.dmp 
    LOGFILE=expdp_s.log SCHEMAS=scott



    实验:

    创建文件夹:CREATE DIRECTORY UTL_FILE_DIR AS '/oracle/backup';

    向用文件夹对象标识的文件写内容:

    SQL> declare
      2  fhandle utl_file.file_type;
      3  begin
      4  fhandle := utl_file.fopen('UTL_FILE_DIR', 'example.txt', 'w');
      5  utl_file.put_line(fhandle, 'test write one');
      6  utl_file.put_line(fhandle, 'test write two');
      7  utl_file.fclose(fhandle);
      8  end;
      9  /
    PL/SQL procedure successfully completed.

    SQL> !
    ora10g@vm-vmw4131-t$ more /oracle/backup/example.txt
    test write one
    test write two

    读取使用文件夹对象DIRECTORY标识的文件内容:
    SQL> declare
      2  fhandle utl_file.file_type;
      3  fp_buffer varchar2(4000);
      4  begin
      5  fhandle := utl_file.fopen('UTL_FILE_DIR', 'example.txt', 'R');
      6  utl_file.get_line(fhandle, fp_buffer);
      7  dbms_output.put_line(fp_buffer);
      8  utl_file.get_line(fhandle, fp_buffer);
      9  dbms_output.put_line(fp_buffer);
    10  utl_file.fclose(fhandle);
    11  end;
    12  /
    PL/SQL procedure successfully completed.

    SQL> /
    PL/SQL procedure successfully completed.

    此时没有不论什么输出。设置serveroutput:
    SQL> set serveroutput on
    SQL> /
    test write one
    test write two
    PL/SQL procedure successfully completed.
    打印文件内容。


    DIRECTORY的目就在于能够让我们在Oracle中灵活地对文件系统中的文件进行操作。

  • 相关阅读:
    linux 硬件信息
    docker note
    Shell cmd set note
    mysql management note
    scp noneed passwd
    update kernel
    数据包处理过程
    tcp/ip分片
    sockopt note
    Python note
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5326698.html
Copyright © 2020-2023  润新知