Oracle Directory目录的知识

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

MOS上对DIRECTORY的解释(266875.1):

(1)、基于服务端 vs 基于客户端

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

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

(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将会使用。环境变量是在在运行导出和导入数据泵应用的客户端系统中使用操作系统命令定义的,分配给基于客户端环境变量的取值必须和基于服务端的目录对象一致,且必须首先在服务器端建立。

目录MY_DIR中创建dump文件和MY_DIR_LOG中创建日志文件的示例:

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

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

C:\> set DATA_PUMP_DIR=MY_DIR

C:\> expdp scott/[email protected]_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角色),那么数据泵试图使用默认的基于服务器端的目录对象,DATA_PUMP_DIR。理解数据泵不会创建DATA_PUMP_DIR目录对象是非常重要的。仅当授权用户未使用任何之前提到的机制创建的目录对象时,才会尝试使用DATA_PUMP_DIR。这个默认的目录对象必须首先由DBA创建。不要将这个和同名的基于客户端的环境变量相混淆。

首先,清空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/[email protected]_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/[email protected]_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/[email protected]_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> !

[email protected]$ 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中灵活地对文件系统中的文件进行操作。

时间: 2024-08-02 20:53:44

Oracle Directory目录的知识的相关文章

ORACLE directory 目录--转载

Create directory让我们可以在Oracle数据库中灵活的对文件进行读写操作,极大的提高了Oracle的易用性和可扩展性.其语法为:CREATE [OR REPLACE] DIRECTORY directory AS 'pathname'; 本案例具体创建如下: create or replace directory exp_dir as '/tmp'; 目录创建以后,就可以把读写权限授予特定用户,具体语法如下:GRANT READ[,WRITE] ON DIRECTORY dire

ORACLE DIRECTORY目录管理步骤

ORACLE的 DIRECTORY在数据库中是个目录的路径,需要在操作系统中有相应的目录与之对应:ORACLE目录的作用就是让ORACLE数据库和操作系统之前进行文件的交互,最常见的就是数据泵的导入和导出: DIRECTORY的管理步骤: 1.创建:CREATE [OR REPLACE] DIRECTORY directory AS 'pathname' ; 例如:CREATE OR REPLACE DIRECTORY DIR AS 'F:\expbak'; 2.赋权:GRANT READ[,W

【Linux】将Oracle安装目录从根目录下迁移到逻辑卷

[Linux]将Oracle安装目录从根目录下迁移到逻辑卷 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Linux逻辑卷的创建和管理(重点) 1.2.2  相关文章链接 linux逻辑卷管理:http://blog.itpub.net/26736162/viewspace-2124620/,这篇文章非常不错. 1.2.3  本文简介 由于Oracle

Linux基础系列(三)Linux系统文件和目录重要知识

详细解释图: 第一列 Inode详解 第二列 文件类型及权限 第三列 硬链接数 第四五列 属主及所归属得组 第六列 文件或目录的大小 第七八九列 最近修改时间 第十列 文件或目录名字 inode详解 block是用来存储实际数据 inode用来存储文件属性 inode不包含文件名 文件在上一级目录的block里 block小结 磁盘读取数据是按Block为单位读取的. 一个文件可能占用多个Block.每读取一个Block就会消耗一次磁盘I/O. 如果要提升磁盘I/O性能,那么就要尽可能一次性读取

Oracle Fusion Middleware 基础知识总结

1, Oracle Fusion Middleware 产品 1.1 集成开发环境 (IDE): Oracle JDeveloper, Oracle Enterprise Pack for Eclipse 1.2 应用开发框架: Application Development Framework (ADF) 1.3 应用网格: WebLogic Server 1.4 身份管理: 目录服务,访问管理,身份联合,欺诈检测, 权利服务,身份管理,身份分析 1.5 面向服务的构架 (SOA): Orac

复习Oracle中的一点知识

Oracle 10g Oracle是为网格计算而设计的 10g中的g就是指grid computing Oracle将数据存储在文件中,保存不同信息的文件(数据文件,控制文件,日志文件)就组成了数据库的物理结构 逻辑结构:schema, extent, data block, segment Schema 数据库对象的集合,创建用户时会生成一个与用户同名的Schema,Schema 直接处理data的逻辑结构(table, view, index, clusters) View -- 虚拟的,可

apache配置Directory目录权限的一些配置

可以使用<Directory 目录路径>和</Directory>这对语句为主目录或虚拟目录设置权限,它们是一对容器语句,必须成对出现,它们之间封装的是具体 的设置目录权限语句,这些语句仅对被设置目录及其子目录起作用.下面是主配置文件中设置目录权限的例子. <Directory "/var/www/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow

清理Oracle安装目录里的一些日志信息

最近测试环境服务器上磁盘空间紧张,表空间里面的数据也不知道开发哪些需要哪些不需要,而且因为此测试库运行时间比较久远,起码有三年了.于是就从清理Oracle安装目录下的日志下手. 发现在一般这几个日志,如果没有做定期清理的话,就比较占空间. 1.<user_dump_dest>/alert_<sid>.log 2.$ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<hostname>_<SID>/log/http-web-access

oracle有关游标的知识

一:前言 今天我自己第二次写游标,我擦,觉得自己在数据库方面需要很大的提高啊.今天遇到三个问题,第一个是oracle数据库中的数据拆分的问题,这个我用regexp_substr来进行解决,第二个问题就是regexp_substr里面的参数,我没有成功的用select语句进行代替(我现在还不知道).第三个是我写完游标竟然不知道怎么讲获取的值返回.苍天啊,大地啊. 下面进行详细说明: 二: 1.regexp_substr函数 REGEXP_SUBSTR(String, pattern, positi