在上一章介绍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中灵活地对文件系统中的文件进行操作。

Oracle Directory文件夹的知识的更多相关文章

  1. 本地 oracle 安装文件夹满触发 ORA-7445 [_memmove()+64] 导致Instance Crashed 的事故

    近期处理了一个问题,原因是因为命中ORA-600 [kole_t2u], [34] - description, bugs 导致 在udump 文件夹下大量转储 出cdmp 文件, 然后这些 cdmp ...

  2. Android res资源文件夹的知识积累

    Android的开发框架耦合性还是比较低的,逻辑和布局被原生分开了.在Eclipse一般代码写在src文件夹下,资源等写在res文件夹下. drawable文件夹:该文件夹有很多变种,主要是为了适配A ...

  3. File类、文件过滤器、递归、文件及文件夹的操作方法

    一.File Io概述: 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作. 因此我们把这种输入和 ...

  4. 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

    当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成.不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”. 那 ...

  5. Android Studio:layout-sw600dp文件夹中创建activity_main.xml

    1.右键res文件夹,新建Android resource directory文件夹 2.在resource type中选择layout  3.将Directory name命名为layout-sw6 ...

  6. oracle 库文件解决的方法 bad ELF interpreter: No such file or directory

    今天是2014-05-27,今天遇到一个lib问题,再次记录一下.这是一个案例,更是一种解决该问题的方法过程. 当我们在使用sqlplus 登陆unix数据库的时候,有可能出现类似:xxxxxx ba ...

  7. oracle 10g/11g 命令对照,日志文件夹对照

     oracle 10g/11g  命令对照,日志文件夹对照 oracle 11g 中不再建议使用的命令 Deprecated Command Replacement Commands crs_st ...

  8. Linux cp一个文件夹时提示cp: omitting directory `test/'

    将一个文件夹test 复制到地址/opt/tmp下,提示出错: cp: omitting directory `test/' 原因: test 目录下还有目录,不能直接进行拷贝. 我们先找下cp 的命 ...

  9. Winform 基础知识 之文件夹操作

    using System.IO; /// <summary> /// 删除文件夹下所有文件 /// </summary> /// <param name="di ...

随机推荐

  1. MaraDNS与DeadWood一起配置为本地机器提供小型化DNS服务

    因为工作测试需要,要在本机装一个环境,可以解析自己命名的域名,即域名->IP的映射服务.在网上找了下,都说是MaraDNS不错.也试了下,在本地配置是没有问题的.从官网上下载的是2-0-11.w ...

  2. spring-data-mongodb一个系统xml文件里面配置两个数据源

    spring-data-mongodb一个系统xml文件里面配置两个数据源 参考文档如下: http://www.iteye.com/problems/92789 http://stackoverfl ...

  3. 表被占用住,提示资源正忙的处理方式。kill掉表的操作。

     1)查找死锁的进程:  SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l ...

  4. C#中数据源绑定DataSource以及相关控件(DataGridView)的使用总结

    我们在编程过程中,会涉及到表格数据的显示,存储等,就可能涉及到DataGridView,DataSource, DataTable等概念. 下面我就我自己模糊的一些知识点串讲以下: 1)首先我要讲的是 ...

  5. SQL IN BETWEEN操作符

    IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...

  6. 武汉科技大学ACM:1007: 不高兴的津津

    Problem Description 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她 报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一 ...

  7. IO流(文件字节输入输出

    输入输出流可能有不允许操作,可能有出现错误,必须在try语句中进行 FileOutputStream out1=new FileOutputStream("test1.txt") ...

  8. 【基础教程】推荐10+必备的 WordPress 常用插件

    1.Akismet Akismet 是 WordPress 官方推荐的一款 WordPress 防垃圾评论插件,也是默认已安装的插件. 2.WP-Postviews 最好的最流行的WordPress浏 ...

  9. VS2010 IE10 调试时报“未能将脚本调试器附加到计算机”,已经附加了一个进程

    解决办法:以管理员身份打开CMD,运行:regsvr32.exe "%ProgramFiles(x86)%\Common Files\Microsoft Shared\VS7Debug\ms ...

  10. php的setcookie()函数详解

    一.浏览器COOKIE原理: 浏览器在访问某个域名时会先读取本地的COOKIE文件(CHROME浏览器在C:\Users\Administrator\AppData\Local\Google\Chro ...