加载中…
个人资料
syzbbw99
syzbbw99
  • 博客等级:
  • 博客积分:0
  • 博客访问:22,123
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
访客
加载中…
好友
加载中…
评论
加载中…
留言
加载中…
分类
博文
标签:

杂谈

13-4 Lob类型 
        13.4.1 基本介绍 
        Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等。Oracle 9i realse2支持存储最大为4g的数据,oracle 10g realse1支持最大8到128万亿字节的数据存储,依赖于你的db的block size。 
        在plsql中可以申明的lob类型的变量如下: 
类型        描述 
BFILE        二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。 
BLOB        二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。 
CLOB        字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。 
NCLOB        字节字符大对象。存储单字节大块,多字节固定宽度,多字节变宽度数据。 
Oracle将lob分类为两种: 
1.存储在数据库里的,参与数据库的事务。BLOB,CLOB,NCCLOB。 
2.存储在数据库外的BFILE,不参与数据库的事务,也就是不能rollback或commit等,它依赖于文件系统的数据完整性。 
LONG和LONG RAW这两种数据类型也是存储字符的,但是有系列的问题,不建议使用,这里也就不讨论了。 
13.4.2 LOB的使用 
本部分不讨论lob的所有细节,只讨论lob的基本原理和在plsql中的基本使用,为plsql开发使用lob提供一个基础性指导。 
本部分使用的表是: 
 
CREATE TABLE waterfalls ( 
       falls_name VARCHAR2(80),--name 
       falls_photo BLOB,--照片 
       falls_directions CLOB,--文字 
       falls_description NCLOB,--文字 
       falls_web_page BFILE);--指向外部的html页面 
/       
        这个表我们并不需要clob和nclob两个,只取一就可以,这里全部定义只是为了演示使用。 
1.        理解LOB的Locator 
表中的Lob类型的列中存储的只是存储指向数据库中实际存储lob数据的一个指针。 
在plsql中申明了一个lob类型的变量,然后从数据库中查询一个lob类型的值分配给变量,也只是将指针复制给了它,那么这个变量也会指向数据库中实际存放lob数据的地方。如: 
--understanding lob locators 
  DECLARE 
       photo BLOB; 
    BEGIN 
       SELECT falls_photo 
         INTO photo 
         FROM waterfalls 
        WHERE falls_name='Dryer Hose'; 
见下图: 
Lob工作原理图解 
        从上面的图可以看出,要处理lob数据,必须先获得lob locators。我们可以通过一个select语句获取,当赋值给lob变量的时候,它也获得同样的lob locators。我们在plsql中处理可以使用dbms_lob包,里面内置了很多过程和函数来读取和修改我们的lob数据。下面给出处理lob数据的一般方法。 
1.        通过select语句获取一个lob locator。 
2.        通过调用dbms_lob.open打开lob。 
3.        调用dbms_lob.getchunksize获得最佳读写lob值。 
4.        调用dbms_lob.getlength获取lob数据的字节值。 
5.        调用dbms_lob.read获取lob数据。 
6.        调用dbms_lob.close关闭lob。        
2.        Empty lob and Null lob 
Empty的意思是我们已经获取了一个lob locator,但是没有指向任何lob数据。Null是定义了一个变量,但是没有获得lob locator。对lob类型的处理和其他类型不一样。如下面的例子: 
 
declare 
       directions clob;--定义了,但是没有分配值,为null 
       begin 
           if directions is null then 
              dbms_output.put_line('directions is null'); 
           else 
              dbms_output.put_line('directions is not null'); 
           end if;       
       end; 
/ 
DECLARE 
       directions CLOB;--定义一个,并且分配值 
    BEGIN 
       --删除一行 
       DELETE 
         FROM waterfalls 
        WHERE falls_name='Munising Falls'; 
       --插入一行通过使用 EMPTY_CLOB(  ) to 建立一个lob locator 
       INSERT INTO waterfalls 
                 (falls_name,falls_directions) 
          VALUES ('Munising Falls',EMPTY_CLOB(  )); 
       --获得lob locator,上面插入的数据,因为我们插入的是一个empty_clob(),那么lob locator不指向任何数据,虽然给变量分配了只 
      SELECT falls_directions 
        INTO directions 
        FROM waterfalls 
       WHERE falls_name='Munising Falls'; 
      IF directions IS NULL THEN 
         DBMS_OUTPUT.PUT_LINE('directions is NULL'); 
      ELSE 
         DBMS_OUTPUT.PUT_LINE('directions is not NULL');--打印此句 
      END IF; 
      DBMS_OUTPUT.PUT_LINE('Length = ' 
                           || DBMS_LOB.GETLENGTH(directions));--结果为o 
   END; 
注意: 
1.        上面例子中的empty_clob()是oracle的内置函数,创建了一个lob locator。但是我们没有让它指向任何数据,所以是empty。而且通过select语句给变量directions分配了lob locator,所以不是null,但是length为0,故为empty。 
2.        在基本类型中,我们判断一个变量是不是有数据,只要is null就可以了。但是在lob类型中我们从以上的例子看出来是不正确的。Lob首先必须判断is null看是否分配lob locator,如果分配了还需要进一步检查length是否为0,看是否是empty,所以完整的是下面这样: 
IF some_clob IS NULL THEN 
      --如果is null为true表示未分配,肯定没有数据 
   ELSEIF DBMS_LOB.GETLENGTH(some_clob) = 0 THEN 
      --分配了length为0,也没有数据 
   ELSE 
      --有数据 
   END IF; 
3.建立LOB 
        在上面我们使用empty_clob()建立了一个空的clob,lob locator只是一个指针,真正的数据是存储在磁盘中或数据库文件中。我们先建立一个空的clob,然后我们可以update来让变量真正指向有数据的lob。Empty_clob()可以用来处理clob和nclob。在oracle 8i中可以使用temporary lob达到同样的效果。 



4.向LOB里写入数据 
        当获得一个有效的lob locator之后,就可以使用dbms_lob包的下列procedure向lob中写入数据。 
        DBMS_LOB.WRITE:允许自动写入数据到lob中。 
        DBMS_LOB.WRITEAPPEND:向lob的末尾写入数据。 
--write lob 
DECLARE 
       directions CLOB; 
       amount BINARY_INTEGER; 
       offset INTEGER; 
       first_direction VARCHAR2(100); 
       more_directions VARCHAR2(500); 
    BEGIN 
       --Delete any existing rows for 'Munising Falls' so that this 
       --example can be executed multiple times 
       DELETE 
         FROM waterfalls 
        WHERE falls_name='Munising Falls'; 
       --Insert a new row using EMPTY_CLOB(  ) to create a LOB locator 
       INSERT INTO waterfalls 
                 (falls_name,falls_directions) 
          VALUES ('Munising Falls',EMPTY_CLOB(  )); 
       --Retrieve the LOB locator created by the previous INSERT statement 
       SELECT falls_directions 
         INTO directions 
         FROM waterfalls 
        WHERE falls_name='Munising Falls'; 
       --Open the LOB; not strictly necessary, but best to open/close LOBs. 
       DBMS_LOB.OPEN(directions, DBMS_LOB.LOB_READWRITE); 
       --Use DBMS_LOB.WRITE to begin 
       first_direction := 'Follow I-75 across the Mackinac Bridge.'; 
       amount := LENGTH(first_direction);  --number of characters to write 
       offset := 1; --begin writing to the first character of the CLOB 
       DBMS_LOB.WRITE(directions, amount, offset, first_direction); 
       --Add some more directions using DBMS_LOB.WRITEAPPEND 
       more_directions := ' Take US-2 west from St. Ignace to Blaney Park.' 
                       || ' Turn north on M-77 and drive to Seney.' 
                       || ' From Seney, take M-28 west to Munising.'; 
       DBMS_LOB.WRITEAPPEND(directions, 
                            LENGTH(more_directions), more_directions); 
       --Add yet more directions 
       more_directions := ' In front of the paper mill, turn right on H-58.' 
                       || ' Follow H-58 to Washington Street. Veer left onto' 
                       || ' Washington Street. You''ll find the Munising' 
                       || ' Falls visitor center across from the hospital at' 
                       || ' the point where Washington Street becomes' 
                       || ' Sand Point Road.'; 
       DBMS_LOB.WRITEAPPEND(directions, 
                            LENGTH(more_directions), more_directions); 
       --Close the LOB, and we are done. 
       DBMS_LOB.CLOSE(directions); 
    END; 
/ 
在这个例子里,我们使用了write 和writeappend这两个过程来插入数据到lob中。因为开始的时候,我们插入了一个空的lob locator。要注意一点,我们最后使用了dbms_lob.close方法关闭lob。这是一个好的方法,特别是在处理oracle text的时候,任何oracle text domain和function-based indexes被update是在wirte和writeappend的时候调用的,而不是在close的时候被update的。        
我们向lob中写入数据的时候,没有必要更新表中的列。因为它保存的只是一个locator,我们的变量也获得同样的locator,当我们写入数据去lob的时候,locator并没有改变。改变的只是locator指向的物理数据。 
在sqlplus中显示上面的例子: 
        SQL> SET LONG 2000            
    SQL> COLUMN falls_directions WORD_WRAPPED FORMAT A70 
    SQL> SELECT falls_directions 
      2  FROM waterfalls 
      3  WHERE falls_name='Munising Falls'; 
其中set long 2000是显示2000个字符。Word_wrappend是自动换行。 
5.从lob中读取数据 
  步骤:a.通过select查询获得lob locator初始化lob变量。2.调用dbms_lob.read过程读取lob数据。 
下面是dbms_lob.read过程的定义,注意参数.   
PROCEDURE read(lob_loc IN            BLOB,  --初始化后的lob变量lob locator 
                amount  IN OUT NOCOPY INTEGER,--读取的数量(clob为字符数,blob,bfile是字节数) 
                offset  IN            INTEGER,--开始读取位置 
                buffer  OUT           RAW);--读到的数据,raw要显示用转换函数,见bfile 
PROCEDURE read(lob_loc IN            CLOB     CHARACTER SET ANY_CS, 
                amount  IN OUT NOCOPY INTEGER, 
                offset  IN            INTEGER, 
                buffer  OUT           VARCHAR2 CHARACTER SET lob_loc%CHARSET); 
  PROCEDURE read(file_loc IN             BFILE, 
                 amount   IN OUT NOCOPY  INTEGER, 
                 offset   IN             INTEGER, 
                 buffer   OUT            RAW); 
下面是一个读取clob的例子: 
--从lob中读取数据 
DECLARE 
       directions CLOB; 
       directions_1 VARCHAR2(300); 
       directions_2 VARCHAR2(300); 
       chars_read_1 BINARY_INTEGER; 
       chars_read_2 BINARY_INTEGER; 
       offset INTEGER; 
    BEGIN 
       --首先获得一个lob locator 
       SELECT falls_directions 
         INTO directions 
         FROM waterfalls 
        WHERE falls_name='Munising Falls'; 
       --记录开始读取位置 
       offset := 1; 
       --尝试读取229个字符,chars_read_1将被实际读取的字符数更新 
       chars_read_1 := 229; 
       DBMS_LOB.READ(directions, chars_read_1, offset, directions_1); 
       --当读取229个字符之后,更新offset,再读取225个字符 
       IF chars_read_1 = 229 THEN 
          offset := offset + chars_read_1;--offset变为offset+chars_read_1,也就是从300开始 
          chars_read_2 := 255; 
          DBMS_LOB.READ(directions, chars_read_2, offset, directions_2); 
       ELSE 
          chars_read_2 := 0;--否则后面不在读取 
          directions_2 := ''; 
       END IF; 
       --显示读取的字符数 
       DBMS_OUTPUT.PUT_LINE('Characters read = ' || 
                           TO_CHAR(chars_read_1+chars_read_2)); 
      --显示结果 
      DBMS_OUTPUT.PUT_LINE(directions_1); 
      dbms_output.put_line(length(directions_1)); 
      DBMS_OUTPUT.PUT_LINE(directions_2); 
      dbms_output.put_line(length(directions_2)); 
   END; 
   / 
Dbms_lob.read的第2个参数是传递要读取的数量。对于clob是字符数,blob和bfile都是字节数。它是随着读取的数目自动更新的,offset不会更新。所以分布读取需要手动更新offset,下个offset是上一个offset+读取的数量。我们可以通过dbms_lob.get_length(lob_locator)获得这个lob的长度,结果clob是字符数,blob和bfile是字节数,然后分布读取。 
13.4.3 使用Bfile 
        Bfile和clob,nclob,blob是不同的。Bfile是外部的lob类型,其他三个是oracle内部的lob类型,它们至少有三点主要不同的地方: 
1.        bfile的值是存在操作系统的文件中,而不是数据库中。 
2.        bfile不参与数据库事务操作。也就是改变bifle不能commit或rollback。但是改变bfile的locator可以commit或rollback。 
3.        bfile在plsql和oracle中是只读的,不允许写。你必须生成一个外部的操作系统文件让bfile locator能够完全指向它。 
在plsql中使用bifle,仍然需要lob locator,只不过是一个目录和文件的别名,你可以使用biflename函数获得一个bfile locator。使用create or replace directory [alias] as ‘file locator directory’,你必须具有CREATE ANY DIRECTORY权限才能使用。如: 
CREATE DIRECTORY bfile_data AS 'c:PLSQL BookCh12_Misc_Datatypes'; 
    GRANT READ ON DIRECTORY bfile_data TO gennick;  --读的权限给这个用户。 
通过all_directory查找目录信息。 

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2011-08-31 00:39)
标签:

杂谈

一、WHY——为什么会出现ASHAWR

1.     10g之前

用户的连接将产生会话,当前会话记录保存在v$session中;处于等待状态的会话会被复制一份放在v$session_wait中。当该连接断开后,其原来的连接信息在v$session和v$session_wait中就会被删除。这是10g之前的状况。

2.     v$session_wait_history与ASH

若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重。但若该会话在活动时大量占用了资源(比如:CPU,内存,I/O等),该会话信息的丢失,将无法评测当时的系统瓶颈究竟是什么。令DBA高兴的是,oracle10g中保留下了v$session_wait中的这些信息。

在10g中新出现了一个视图:v$session_wait_history。这个视图保存了每个活动session在v$session_wait中最近10次的等待事件。但这对于一段时期内的数据库性能状况的监测是远远不够的,为了解决这个问题,在10g中还新添加了一个视图:v$active_session_history。这就是ASH(active session history)。

典型的情况下,为了诊断当前数据库的状态,需要最近的五到十分钟的详细信息。然而,由于记录session的活动信息是很费时间和空间的,ASH采用的策略是:保存处于等待状态的活动session的信息,每秒从v$session_wait中采样一次,并将采样信息保存在内存中。

3.     AWR

注意,ASH的采样数据是保存在内存中。而分配给ASH的内存空间是有限的,当所分配空间占满后,旧的记录就会被覆盖掉;而且数据库重启后,所有的这些ASH信息都会消失。这样,对于长期检测oracle的性能是不可能的。在Oracle10g中,提供了永久保留ASH信息的方法,这就是AWR(auto workload repository)。

由于全部保存ASH中的信息是非常耗费时间和空间的,AWR采用的策略是:每小时对v$active_session_history进行采样一次,并将信息保存到磁盘中,并且保留7天,7天后旧的记录才会被覆盖。这些采样信息被保存在视图wrh$_active_session_history中。而这个采样频率(1小时)和保留时间(7天)是可以根据实际情况进行调整的,这就给DBA们提供了更加有效的系统监测工具。

AWR永久地保存系统的性能诊断信息,由SYS用户拥有。一段时间后,你可能想清除掉这些信息;有时候为了性能诊断,你可能需要自己定义采样频率来获取系统快照信息。Oracle 10g在包dbms_workload_repository中提供了很多过程,通过这些过程,你可以管理快照并设定基线(baselines)。

4.     小结

这样,我们就知道了ASH和AWR产生的原因和功能。ASH保存了系统最新的处于等待的会话记录,可以用来诊断数据库的当前状态;而AWR中的信息最长可能有1小时的延迟,所以其采样信息并不能用于诊断数据库的当前状态,但可以用来作为一段时期内数据库性能调整的参考。

对于这些视图间的继承关系,eygle给出了一个关系图:

 



图1 各个视图的层次

其中视图dba_hist_active_sess_history是wrh$_active_session_history和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。

二、WHAT——什么是AWR

现在我们稍微详细地了解一下刚才所说内容。

1.     ash占用的内存大小

ASH的采集信息保存在内存中,在旧的信息被采样到AWR中后,可被新采集的信息覆盖,重启oracle后该信息被清除。分配给ASH的内存大小可以查询到:

SQL> select pool, name, bytes/1024/1024 From v$sgastat where name like '%ASH %';

POOL          NAME          BYTES/1024/1024
------------- ------------- ---------------
shared pool   ASH buffers                 2


2.     AWR更正

为了便于描述和理解,在第一部分中,我们说AWR就是保存ASH中的信息。

其实,AWR记录的信息不仅是ASH,还可以收集到数据库运行的各方面统计信息和等待信息,用以诊断分析。

AWR的采样方式是,以固定的时间间隔为其所有重要的统计信息和负载信息执行一次采样,并将采样信息保存在AWR中。

可以这样说:ASH中的信息被保存到了AWR中的视图wrh$_active_session_history中。ASH是AWR的真子集。

3.     mmon进程与mmnl进程

快照由一个称为 MMON 的新的后台进程(及其从进程)以及MMNL后台进程自动地每隔固定时间采样一次。我们先来看一下10g的概念指南中对这两个新增加的后台进程的介绍:

        MMON进程负责执行多种和管理相关(manageability-related)的后台任务,例如:

·  当某个测量值(metrics)超过了预设的限定值(threshold value)后提交警告

·  创建新的 MMON 隶属进程(MMON slave process)来进行快照(snapshot)

·  捕获最近修改过的 SQL 对象的统计信息

        MMNL进程负责执行轻量级的且频率较高的和可管理性相关的后台任务,例如捕获会话历史信息,测量值计算等。

AWR的采样工作由MMON进程每个1小时执行一次,ASH信息同样会被采样写出到AWR负载库中。虽然ASH buffer被设计为保留1小时的信息,但很多时候这个内存是不够的,当ASH buffer写满后,另外一个后台进程MMNL将会主动将ASH信息写出。

4.     SYSAUX表空间

这些采样数据都存储在SYSAUX表空间中,并且以WRM$_* 和 WRH$_*的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。

SQL> select table_name from dba_tables where table_name like 'WRM$%';

 

TABLE_NAME

-----------------------

WRM$_WR_CONTROL

WRM$_SNAP_ERROR

WRM$_SNAPSHOT

WRM$_DATABASE_INSTANCE

WRM$_BASELINE

当SYSAUX表空间满后,AWR将自动覆盖掉旧的信息,并在警告日志中记录一条相关信息:

ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_3533490838_1522 by 128 in                 tablespace SYSAUX

5.     采样频率和保留时间

可以通过查询视图dba_hist_wr_control或(wrm$_wr_control)来查询AWR的采样频率和保留时间。默认为每1小时采样一次,采样信息保留时间为7天。

SQL> select * from dba_hist_wr_control;

 

DBID SNAP_INTERVAL RETENTION   TOPNSQL
---- ------------- ----------- ----------
1148 +00000 00:1   +00007 00:0 DEFAULT

 

SQL> select DBID, SNAP_INTERVAL, SNAPINT_NUM, RETENTION from wrm$_wr_control;

      DBID SNAP_INTERVAL      SNAPINT_NUM RETENTION
---------- ------------------ ----------- --------------------
1160732652 +00000 01:00:00.0         3600 +00007 00:00:00.0

 

6.     采样数据量

由于数据量巨大,把所有ASH数据写到磁盘上是不可接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert完成,尽量减少日志生成,从而最小化数据库性能的影响。

7.     初始化参数statistics_level

AWR的行为受到参数STATISTICS_LEVEL的影响。这个参数有三个值:

        BASIC:awr统计的计算和衍生值关闭.只收集少量的数据库统计信息.

        TYPICAL:默认值.只有部分的统计收集.他们代表需要的典型监控oracle数据库的行为.

        ALL : 所有可能的统计都被捕捉. 并且有操作系统的一些信息.这个级别的捕捉应该在很少的情况下,比如你要更多的sql诊断信息的时候才使用.

 

三、HOW——如何使用AWR

AWR由ORACLE自动产生,但是也可以通过DBMS_WORKLOAD_REPOSITORY包来手工创建、删除和修改。可以使用desc命令查看该包中的过程。下面只介绍几个常用的:

1.手工创建一个快照

SQL> select count(*) from wrh$_active_session_history;

  COUNT(*)

----------

317

SQL> begin

  2  dbms_workload_repository.create_snapshot();

  3  end;

  4  /

 

PL/SQL 过程已成功完成。

SQL> select count(*) from wrh$_active_session_history;

  COUNT(*)

----------

       320

 

2.手工删除指定范围的快照

SQL> select * from wrh$_active_session_history where snap_id = 96;

   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME

---------- ---------- --------------- ---------- ----------------------------

        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午

        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午

        96 1160732652               1     236930 06-10月-07 11.26.04.562 上午

 

SQL> begin

  2  dbms_workload_repository.drop_snapshot_range(low_snap_id => 96, high_snap_id => 96, dbid => 1160732652);

  3  end;

  4  /

PL/SQL 过程已成功完成。

SQL> select * from wrh$_active_session_history where snap_id = 96;

未选定行

 

3.修改采集时间和统计信息保留时间

PROCEDURE MODIFY_SNAPSHOT_SETTINGS

参数名称                       类型                    输入/输出默认值?

------------------------------ ----------------------- ------ --------

 RETENTION                      NUMBER                  IN     DEFAULT

 INTERVAL                       NUMBER                  IN     DEFAULT

 TOPNSQL                        NUMBER                  IN     DEFAULT

 DBID                           NUMBER                  IN     DEFAULT

通过修改retention参数可以修改awr信息的保留期限。默认的是七天,最小的值是一天。如果把retention设置为零,自动清除就关闭了.如果awr发现sysaux空间不够,它通过删除那些最老部分的快照来重新使用这些空间.同时,也会给dba发一条警告,告诉sysaux空间不够了(在警告日志中).

通过修改interval参数可以修改awr信息的采样频率。最小的值是10分钟,默认的是60分钟.典型的值是10,20,30,60,120等等。把interval设为0则关闭自动捕捉快照.如将收集间隔时间改为30 分钟一次。并且保留5天时间(注:单位都是为分钟):

SQL> select *from dba_hist_wr_control;

      DBID SNAP_INTERVAL      RETENTION          TOPNSQL

---------- ------------------ -------------------------- -----------

1160732652 +00000 01:00:00.0  +00007 00:00:00.0          DEFAULT

SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);

PL/SQL 过程已成功完成。

 

SQL> SELECT *from dba_hist_wr_control;

      DBID SNAP_INTERVAL       RETENTION         TOPNSQL

---------- ------------------- ------------------------- -----------

1160732652 +00000 00:30:00.0   +00005 00:00:00.0         DEFAULT

 

SQL>

4.设置基线

基线(baseline)是一种机制,这样你可以在重要时间的快照信息集做标记。一个基线定义在一对快照之间,快照通过他们的快照序列号识别.每个基线有且只有一对快照。

一次典型的性能调整实践从采集量度的基准线集合、作出改动、然后采集另一个基准线集合开始。可以比较这两个集合来检查所作的改动的效果。在 AWR 中,对现有的已采集的快照可以执行相同类型的比较。

假定一个名称为 apply_interest 的高度资源密集的进程在下午 1:00 到 3:00 之间运行,对应快照 ID 95 到 98。我们可以为这些快照定义一个名称为 apply_interest_1 的基准线:

SQL> select *From dba_hist_baseline;

 

未选定行

 

SQL> select * from wrm$_baseline;

 

未选定行

 

SQL> exec dbms_workload_repository.create_baseline(95, 98, 'apply_interest_1');

 

PL/SQL 过程已成功完成。

 

这一操作将快照从 95 到 98 编号,作为上面指定的基准线的一部分。查看现有的基准线:

SQL> select *from dba_hist_baseline;

 

      DBID BASELINE_ID BASELINE_NAME     START_SNAP_ID START_SNAP_TIME               END_SNAP_ID END_SNAP_TIME

---------- ----------- ------------------------- ------------- ------------------------------------- ----------- ------------

1160732652           1 apply_interest_1             95 06-10月-07 11.00.05.375 上午           98 06-10月-07 01.44.58.062 下午

 

SQL> select *from wrm$_baseline;

 

      DBID BASELINE_ID BASELINE_NAME        START_SNAP_ID END_SNAP_ID

---------- ----------- ---------------------------- ------------- -----------

1160732652           1 apply_interest_1                95          98

 

SQL>

 

在一些调整步骤之后,我们可以创建另一个基准线 — 假设名称为 apply_interest_2,然后只为那些与这两条基准线相关的快照比较量度。

SQL> exec dbms_workload_repository.create_baseline(92, 94, 'apply_interest_2');

 

PL/SQL 过程已成功完成。

像这样把快照分隔在仅仅几个集合中有助于研究调整对于性能量度的影响。您可以在分析之后使用 drop_baseline() 来删除基准线;快照将保留(也可级联删除)。此外,当清除例程开始删除旧的快照时,与基准线相关的快照不会被清除,从而允许进行进一步的分析。

5.删除基线

如果要删除一个基准线:

SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_1', cascade=>false);

 

PL/SQL 过程已成功完成。

 

SQL> select *from wrh$_active_session_history where snap_id in (95,96,97,98);

 

   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME

---------- ---------- --------------- ---------- -------------------------------

        95 1160732652               1     235360 06-10月-07 10.56.29.872 上午

        95 1160732652               1     235230 06-10月-07 10.54.19.857 上午

        95 1160732652               1     233130 06-10月-07 10.19.19.478 上午

        95 1160732652               1     232830 06-10月-07 10.14.18.859 上午

        95 1160732652               1     232250 06-10月-07 10.04.38.481 上午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

        97 1160732652               1     238600 06-10月-07 12.33.08.420 下午

 

   SNAP_ID       DBID INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME

---------- ---------- --------------- ---------- -------------------------------

        97 1160732652               1     238420 06-10月-07 11.50.55.686 上午

        97 1160732652               1     238230 06-10月-07 11.47.45.687 上午

        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午

        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午

        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午

        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午

        98 1160732652               1     239140 06-10月-07 01.42.00.976 下午

        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午

        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午

        98 1160732652               1     239130 06-10月-07 01.27.04.161 下午

 

已选择21行。

 

SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_2', cascade=>true);

 

PL/SQL 过程已成功完成。

 

SQL> select *from wrh$_active_session_history where snap_id in (92,93,94);

未选定行

 

SQL>

 

6.生成报表

awr有个报表生成机制,可以对存储在workload资料库的统计产生汇总报表。这个分析对一段时间的统计做的。这个报表生成机制很像statspack。

可以使用脚本awrrpt.sql或awrrpti.sql来查看AWR报告(非常类似statspack中的spreport.sql),这两个脚本都在目录$ORACLE_HOME/rdbms/admin中。Awrrpt.sql脚本可以显示指定快照id范围的诊断信息,报告可以保存为文本文件或HTML文件;awrrpti.sql脚本与awrrpt.sql类似,唯一的不同就是在awrrpti.sql脚本中,你可以指定数据库ID和实例ID(作为参数)。报告包括如下诊断信息:

[1] Report summary

[1] Wait events statistics

[1] SQL statistics

[1] Instance activity statistics

[1] I/O statistics

[1] Buffer pool statistics

[1] Advisory statistics

[1] Wait statistics

[1] Undo statistics

[1] Latch statistics

 Segment statistics

[1] Dictionary cache statistics

[1] Library cache statistics

[1] SGA statistics

[1] Resource limit statistics

[1] init.ora parameters

通过运行$ORACLE_HOME/rdbms/admin目录中的awrrpt.sql脚本,AWR的功能可以立即通过它从采集的统计数据和量度中生成的报表得到最好的说明。这个脚本显示所有的现有AWR快照并请求两个特定的快照作为时间间隔边界。它产生两种类型的输出:文本格式(类似于Statspack报表的文本格式但来自于AWR信息库)和默认的HTML格式(拥有到部分和子部分的所有超链接),从而提供了非常用户友好的报表。

运行这个脚本必须要select any dictionary权限.这个脚本提示你输入选项如怎么和在哪里生成这个报表:

*首先,你需要指明你要生成html还是text格式的

*要选择快照的天数:输入天数,和你最近的快照,可选的,你可以使用dba_hist_snapshot表来看你要用哪个snap_id.

*开始snap_id和终止snap_id,这个快照对定义你的报表产生的时间间隔.

*文件名称,报告写的用户指定的文件.

现在运行该脚本以查看报表,从而对AWR的报表功能有一个直观的了解。

SQL> @D:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/awrrpt.sql

 

Current Instance

~~~~~~~~~~~~~~~~

 

   DB Id    DB Name      Inst Num Instance

----------- ------------ -------- ------------

 1160732652 ORCL                1 orcl

 

 

Specify the Report Type

~~~~~~~~~~~~~~~~~~~~~~~

Would you like an HTML report, or a plain text report?

Enter 'html' for an HTML report, or 'text' for plain text

Defaults to 'html'

输入 report_type 的值:

 

Type Specified:                  html

 

 

Instances in this Workload Repository schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

   DB Id     Inst Num DB Name      Instance     Host

------------ -------- ------------ ------------ ------------

* 1160732652        1 ORCL         orcl         YUECHAOTIAN

 

Using 1160732652 for database Id

Using          1 for instance number

 

 

Specify the number of days of snapshots to choose from

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Entering the number of days (n) will result in the most recent

(n) days of snapshots being listed.  Pressing <return> without

specifying a number lists all completed snapshots.

 

 

输入 num_days 的值:  4

 

Listing the last 4 days of Completed Snapshots

 

                                                        Snap

Instance     DB Name        Snap Id    Snap Started    Level

------------ ------------ --------- ------------------ -----

orcl         ORCL                81 04 10月 2007 07:24     1

 

                                 83 05 10月 2007 13:34     1

                                 84 05 10月 2007 16:19     1

                                 85 05 10月 2007 17:00     1

                                 86 05 10月 2007 18:00     1

                                 87 05 10月 2007 19:10     1

                                 88 05 10月 2007 20:00     1

                                 89 05 10月 2007 21:00     1

                                 90 05 10月 2007 22:00     1

                                 91 05 10月 2007 23:00     1

 

                                 95 06 10月 2007 11:00     1

                                 97 06 10月 2007 13:27     1

                                 98 06 10月 2007 13:44     1

                                 99 06 10月 2007 14:00     1

                                100 06 10月 2007 14:30     1

                                101 06 10月 2007 15:00     1

                                102 06 10月 2007 15:30     1

 

 

 

Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

输入 begin_snap 的值:  100

Begin Snapshot Id specified: 100

 

输入 end_snap 的值:  102

End   Snapshot Id specified: 102

 

 

 

Specify the Report Name

~~~~~~~~~~~~~~~~~~~~~~~

The default report file name is awrrpt_1_100_102.html.  To use this name,

press <return> to continue, otherwise enter an alternative.

 

输入 report_name 的值:

 

Using the report name awrrpt_1_100_102.html

 

<HTML><HEAD><TITLE>AWR Report</TITLE>

……(省略结果)

End of Report

</BODY></HTML>

Report written to awrrpt_1_100_102.html

SQL>

将产生的HTML脚本粘贴出来,用IE打开看看:一个指定时间段的完整的数据库性能报告就展现在我们面前了。下面是部分截图:

 

图2 AWR报告截图

7. statspack和awr

在过去,你可以手工的使用statspack来获得历史数据.你也可以继续在oracle10g中使用statspack,但是如果你要使用workload资料库,那你需要更改你的应用程序代码。statspack用户应该转到10g的workload 资料库。

这里不支持数据从statspack移植到workload资料库.同样,也没有视图来模拟statspack.

在rac环境,每个快照包含集群的所有的节点.每个节点的快照数据有相同的snap_id,但靠实例id来区分。一般地,rac中的快照是在同一时间捕捉的。

你也可以使用db control来进行手工的快照。手工的快照支持系统产生的自动快照。手工的快照可以自定义在你要捕捉的系统行为的两个时间点跟自动的不一致的时候,从而拥有更大的灵活性。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

Oracle提供了与RedHat Kickstart类似的自动安装方式:Silent Mode。

 

OUI通过一系列预定义的选项,取代交互式的安装选项。预定义选项存储在response File中。

 


Silent Mode安装命令如下:
在Windows平台上:
setup.exe -responseFile <FileName> <optional_parameters>
在Unix平台上:
runInstaller -responseFile <FileName> <optional_parameters>

 

 

 

 

Optional参数有两个:
-nowelcome:不显示安装过程中的欢迎界面
-silent:在Silent mode下运行Universal Installer,自动忽略欢迎界面

 

这里在命令行下用正常的模式和SILENT模式登陆数据库为例子,希望能够对你有启发:

1。正常登陆:
D:\>sqlplus scott/tiger

SQL*Plus: Release 8.1.7.0.0 - Production on 星期二 8月 5 18:52:15 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


连接到:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

SQL> select * from tab;

TNAME                TABTYPE         CLUSTERID
-------------------- -------------- ----------
ACCOUNT              TABLE
BONUS                TABLE
DEPT                 TABLE
EMP                  TABLE
RECEIPT              TABLE
SALGRADE             TABLE
TEST                 TABLE

已选择7行。



2。SILENT方式登陆

D:\>sqlplus -silent scott/tiger
col tname format a20;
set line 120;
select * from tab;

TNAME                TABTYPE         CLUSTERID
-------------------- -------------- ----------
ACCOUNT              TABLE
BONUS                TABLE
DEPT                 TABLE
EMP                  TABLE
RECEIPT              TABLE
SALGRADE             TABLE
TEST                 TABLE

已选择7行。

从上面可以看出,用SILENT登陆,其实是省略了很多帮助信息。
所以,题目上是说“NOT a benefit of Oracle Database Configuration Assistant”,应该是选D。(推论而已)

 


获得response file有两种方式


1、在安装光盘的response目录中有通用的response file的模板,如下是各种response file
可以拷贝一份,按照需要修改为Response file。
enterprise.rsp       Enterprise Edition Installation of Oracle9i Server
standard.rsp         Standard Edition Installation of Oracle9i Server
custom.rsp           Custom Edition Installation of Oracle9i Server
oms.rsp               Oracle Management Server installation of Oracle9i 
                          Management and Integration
oid.rsp                Oracle Internet Directory installation of Oracle9i 
                          Management and Integration
infrastructure.rsp     Custom installation of Oracle9i Management Infrastructure
clientadmin.rsp       Administrator installation of Oracle9i Client
clientruntime.rsp     Runtime installation of Oracle9i Client
clientcustom.rsp     Custom installation of Oracle9i Client
dbca.rsp                Database Configuration Assistant
netca.rsp               Oracle Net Configuration Assistant
emca.rsp              Oracle Enterprise Manager Configuration Assistant             
Response File按照定义的目的、关键字和变量分为多个部分。

 

 

 

对于错误的context,format和变量的值,OUI将自动忽略。
Response File的结构:
Response File Sections         Function
General                              ResponseFile的版本号
Include                              该ResponseFile中包含的其他response file列表
Session                              OUI的交互式对话信息
Components                       Component sections define public variables. 
                                         They can also define installer variables.

 

2、通过运行如下命令:
E:\>setup -record -destinationFile YourResponseFile
通过OUI定制response file,并保存在指定文件中。只需要运行到SUMMARY退出OUI就可以了,不需要实际安装软件。但是Oracle10.1.0.3前,自定义安装生成的responsefile不能用,DEPENDENCY_LIST格式有问题:

利用OUI record生成的DEPENDENCY_LIST如下:

DEPENDENCY_LIST={oracle.rdbms_9.2.0.1.0,oracle.networking_9.2.0.1.0,oracle.emprod_9.2.0.1.0,oracle.p2k.devtools_9.2.0.1.0}

各个组件应该用""分开,并且oracle.rdbms_9.2.0.1.0也要用""分开,正确的格式如下:

DEPENDENCY_LIST={"oracle.rdbms","9.2.0.1.0","oracle.networking","9.2.0.1.0","oracle.emprod","9.2.0.1.0","oracle.p2k.devtools",".2.0.1.0"}

下面的perl脚本可以方便的格式用Record生成的ResponseFile:

 

#!C:\Perl\bin\perl
use warnings;
use strict;
my $file = shift;
open InFile, $file or die "Cann't open $file:$!";
foreach(<InFile>){
  
  next if (/^\s*$/) or (/^#/);
  
  if(/^DEPENDENCY_LIST={(.+)}/){
     my $temp=$1;
     $temp =~ s/_/,/g;
     my @Strings = split /,/,$temp;
     my $result = join "\",\"",@Strings;
     print "DEPENDENCY_LIST={","\"","$result","\"","}\n";
     next;     
  }
   
  print $_;
 }

 

下面我们就可以运行如下命令:

e:\setup.exe -responseFile  CustomResponse.txt -silent

采用Silent Mode安装Oracle软件。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1个最大4G个blocks 的datafile。因此,使用8KBdata blocks 的bigfile tablespace 最大可以达到32TB。

Bigfile tablespaces 常用于非常大的DB。 如果很大的DB有成千的 read/write datafiles, 那么checkpoints之类的操作将非常费时。如果用一个很大的datafile,减少datafiles的数量,将会提高效率。

创建时使用BIGFILE关键字如下:

CREATE BIGFILE TABLESPACE BIG_DEMO
DATAFILE '/ORADATA/PROD/BIG_DEMO.DBF' SIZE 25G;

Smallfile tablespace是原Oracle tablespace datafile 选项的新名字。 smallfile tablespace中,你可以包含多个datafiles。每个datafile 有最多4M个data blocks。因此, 使用8KB data blocks的smallfile tablespace 中的datafiles 最大32GB。smallfile tablespace最多有1,023 个datafiles。SYSTEM和SYSAUX tablespaces总是smallfile tablespaces。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

PMON  进程监控 
SMON 系统监控
DBWR  数据库写入程序 
LGWR 日志写入程序

PMON进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释
放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障
的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和
服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。 
PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。 

SMON进程:该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。在
具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程
有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。 

DBWR进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个OR
ACLE后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主
要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储
区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的
缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用
的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。 
ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持内存中
的数据块是最近使用的,使I/O最小。在下列情况预示DBWR 要将弄脏的缓冲区写
入磁盘: 
1、当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度
时,该服务进程将通知DBWR进行写。该临界长度是为参数DB-BLOCK-WRITE-BATCH
的值的一半。 
2、 当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没
有查到未用的缓冲区,它停止查找并通知DBWR进行写。 
3、出现超时(每次3秒),DBWR 将通知本身。 
4、 当出现检查点时,LGWR将通知DBWR 
在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数
DB-BLOCK-WRITE-BATCH所指定。如果弄脏表中没有该参数指定块数的缓冲区,DB
WR从LUR表中查找另外一个弄脏缓冲区。 
如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目
的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,DBWR查找一个新
的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK-WRITE-BAT
CH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。 
在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。DBWR将指定的缓冲
区写入磁盘。 
在有些平台上,一个实例可有多个DBWR。在这样的实例中,一些块可写入一磁盘
,另一些块可写入其它磁盘。参数DB-WRITERS控制DBWR进程个数。 


LGWR进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志
缓冲区的一个ORACLE后台进程。LGWR进程将自上次写入磁盘以来的全部日志项输
出,LGWR输出: 
1、 当用户进程提交一事务时写入一个提交记录。 
2、每三秒将日志缓冲区输出。 
3、 当日志缓冲区的1/3已满时将日志缓冲区输出。 
4、当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。 
LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或
不可用,LGWR 可继续地写入该组的其它文件。 
日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,
服务器进程可将新的日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日
志缓冲区总有空间可写入新的日志项。 
注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写
出,而这些日志项仅当在以后事务提交后才永久化。 
ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入
日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入
数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一
起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢
复操作可以同步。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

.双机热备

 从广义上讲,双机热备(双机容错)就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务 双机热备由备用的服务器解决了在主服务器故障时服务不中断的问题。但在实际应用中,可能会出现多台服务器的情况,即服务器集群 双机热备一般情况下需要有共享的存储设备。但某些情况下也可以使用两台独立的服务器 实现双机热备,需要通过专业的集群软件或双机软件


 从狭义上讲,双机热备特指基于active/standby方式的服务器热备。服务器数据包括数据库数据同时往两台或多台服务器写,或者使用一个共享的存储设备。在同一时间内只有一台服务器运行。当其中运行着的一台服务器出现故障无法启动时,另一台备份服务器会通过双机软件的诊测(一般是通过心跳诊断)将standby机器激活,保证应用在短时间内完全恢复正常使用.

所以,像VCS (VERITAS Cluster Manager)等软件实现的Oracle Cluster Server以及Oracle Standby ,Oracle RAC(Real Application Cluster),高级复制(Advanced Replication), Streams等技术都能认为是双机热备。

 

二.Physical StandbyLogical Standby (物理Standby及逻辑Standby)

Physical standby直接从主库接受archived log,然后直接做基于block的物理恢复(更新或调整变化的block),所以physical standby在物理文件一级完全都等同于主库。physical standby恢复只是底层的block apply, OS层面的工作,数据库SCHEMA,包括索引都是一样的。它是直接应用REDO或归档实现同步的 。不会涉及temp ,undo等。物理STANDBY可能的模式:只读模式(OPEN READONLY)和恢复模式(MANANGED RECOVERY)。

在逻辑STANDBY中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,然后在STANDBY上执行SQL语句(SQL Apply)。逻辑STANDBY除灾难恢复外还有其它用途,比如用于用户进行查询和报表

9i R2之前,data guard的服务器只能运行在read only或者recover模式, 一个physical standby database在物理上完全等同主库,当physical standby database正在做恢复的时候,不能打开用作其他用途。 而logical standby database只是在logical上等同需要恢复的schema, 所以在恢复的时候,可以同时打开做report(做查询动作),也可以用户和主库不一样的 数据对象等等,极大了提高了备用库的利用率。

 

三.Dataguard

都是StandbyOracle 9i之前称为Standby9i或之后的Standby被改名为Data guard。不过功能上也有了很多的改进和区别 。

 

四.StandbyLGWR / ARCH传输

查看数据库保护模式:

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

1.最大性能(maximize performance):这是data guard默认的保护模式。primay上的事务commit前不需要从standby上收到反馈信息(主数据库的提交操作不等待STANDBY),该模式在primary故障时可能丢失数据,但standbyprimary的性能影响最小。 可以使用LGWR ASYNC或者ARCH两种传输模式。

ARCH传输模式:Primary DB上的online redo log写满或其他条件引起redo log写归档的时候,redo log生成的archived log file写到本地归档目录的同时,写入了Standby归档目录。只是Primary db上的online redo log切换不必等Standby上的写归档动作结束。

2.最大可用(maximize availability):在正常情况下,最大可用模式和最大保护模式一样;在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。在问题纠正之后,Standby和主数据库进行再同步,至少有一个standby可用的情况下,即使primary down机,也能保证不丢失数据。(不过当问题修复,再同步之前有必要FAILOVER,那么有些数据可能会丢失)。最大可用性模式Standby必须配置Standby Redo logOracle推荐最大可用模式使用LGWR ASYNC(异步)模式传输。

采用最大可用的data guard模式,主库往备库传递在线日志(online redo log)信息,在线日志信息写入备用库的standby redo log,这些standby redo log归档后,备用库应用归档日志。

LGWR还分为LGWR ASYNC(异步)LGWR SYNC(同步)两种。

 

 

最大保护

最大可用

最大性能

进程

LGWR

LGWR

LGWRARCH

网络传输模式

SYNC

SYNC

LGWR时设置ASYNC

磁盘写操作

AFFIRM

AFFIRM

NOAFFIRM

备用日志

YES

物理备用需要

LGWR和物理备用时需要

备用库类型

物理Standby

物理或逻辑

物理或逻辑

 

最大保护(maximize protection):最高级别的保护模式。primay上的事务在commit前必须确认redo已经传递到至少一个standby上,如果所有standby不可用,则primary会挂起。该模式能保证零数据丢失。对于最大保护和最高可用性模式,Standby数据库必须配置standby redo log,并且oracle推荐所有数据库都使用LGWR ASYNC模式传输。

 


LGWR ASYNC: ------------

Asynchronously archiving with the LGWR process in
conjunction with SSH port forwarding showed the following characteristics when
compared to the baseline: - Significant reduction in network traffic -
Slight increase in primary database throughput - Minimal increase in cpu usage
When using LGWR to remotely archive in ASYNC mode, the LGWR process does not
wait for each network I/O to complete before proceeding. This behavior. is made
possible by the use of an intermediate process, known as a LGWR network server
process (LNS), that performs the actual network I/O and waits for each network
I/O to complete. Each LNS has a user configurable buffer that is used to
accept outbound redo data from the LGWR. This is configured by specifying the
size in 512 byte blocks on the ASYNC attribute in the archivelog destination
parameter. For example ASYNC=2048 indicates a 1Mb buffer. As long as the
LNS process is able to empty this buffer faster than the LGWR can fill it, the
LGWR will never stall. If the LNS cannot keep up, then the buffer will become
full and the LGWR will stall until either sufficient buffer space is freed up
by a successful network transmission or a timeout occurs. Reducing network
traffic in a network with high round trip times (RTT) reduces network server
timeouts due to buffer full conditions, thus reducing the impact to the
primary database throughput. ASYNC can improve the primary database throughput
due to the fact that by compressing the redo traffic, the transfer (in 1 MB
chunks) is quicker and thus the ASYNC buffer doesn't reach full capacity as
often, thereby avoiding the wait that can occur when the buffer is full.

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

shutdown abort 的时候,跟kill 进程是一样的效果 
数据库立即关闭,这个时候文件状态可能不一致 
因为正常关闭数据库会同步校验各文件,使得重新启动的时候文件时间点一致并且不用进行崩溃恢复 

若检查点信息一致,则做崩溃恢复 
若检查点信息不一致(正好在更新文件头)则需要做介质恢复 

这些问题都好处理,最怕的问题是这个时候系统有大量IO,结果这样造成写的突然中断,碰巧造成文件块的逻辑坏块,那麻烦比较大一些,尤其是系统表空间的block损坏 


虽然shutdown abort 出错的几率很小,1000个人可能只有一个人碰到,但是我们还是要小心。 
正确的处理流程是,shutdown immediate ,若数据库迟迟不能down下来,在os上观察IO状况,几乎没有io的时候,另开一窗口shutdown  abort ,几乎不会出问题了
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

位图索引是Oralce数据库索引中的异类,其在某些比较特殊的场合中有突出的表现。一般来说,位图索引的效果直接跟列的基数相关。为此在谈到如何提高位图索引的使用效果时,也往往跟这个列的基数相关。为此必须对这个列的基数有一个清晰的认识。

  一、什么时候改采用位图索引?

  基数是指某个列可能拥有的不重复数值的个数。比如说在一个中华人民共和国公民的信息表中,包含着十几亿条的记录。但是在这些记录中,有几个比较特殊的列,其指包含几个有限的重复数值。如性别这一字段,其就只有男与女两个可能值;如在民族一列内也只有56个不重复的值;如在出身地一列内,中国只有34个省市自治区。

  有时候用户可能需要根据这些列来查询相关的数据。如公司搞活动的时候,可能需要确认一下活动有没有涉及到宗教的禁忌,如可能涉及到回族的禁忌的话,那么就需要查询一下员工信息系统,看看公司有没有回族的员工。如公司可能在三八妇女节的时候,会给女员工提供一定的福利,为此也需要在数据库中拉出女员工的名单,此时也就是根据性别这个字段来查询数据。等等。如果用户查询的列的基数非常的小,只是有限的几个固定值,如性别、民族、行政区等等。要为这些基数值比较小的列建立索引时,就需要建立位图索引。如果一定要说一个具体的标准的话,那么笔者认为如果基数值在整个表记录的2%以内或者字段内容的重复值在100次以上,则通过位图索引可以起到不错的效果。

  大部分情况下都是通过基数值来确定是否需要使用位图索引。但是还有一种比较特殊的情况,可能这个列的基数值非常的大,也就是说这个列中的值重复性不是很高。但是只要起满足一定的条件,那么在这个字段上创建位图索引,也可以起到不错的效果。一般来说,如果字段往往在Where查询条件语句中被用到,并且采用的运算符为AND 或者OR 的逻辑运算符号的话,那么其效果也比建议其他索引要好的多。

  二、把需要建立位图索引的列设置为固定长度的数据类型。

  在Oracle数据库中,数据类型从大的来说,包括固定长度的数据类型与可变长度的数据类型。如就拿字符型数据来说,就有固定长度的字符串类型(char)与可变长度的字符串类型(VARCHAR2 )。这两个数据类型都是字符串数据类型,它们的差别主要在于字符串长度的控制上。CHAR存储固定长度的字符串。如果实际存储的字符串没有达到其规定的最大值的话,则数据库系统会自动在后面加上空格。而VARCHAR2则主要用来存储可变长度的字符数据类型。如存储固定长度的CHAR字符串类型不同,如果在这个列中存储的数据没有达到规定的最大值, 则数据库系统不会在最后加入空格,以实际的字符串存储。如果从数据库的体积上来看,肯定是可变长的数据类型比较好。

  但是如果从位图索引的效果上来看,则最好把建立位图索引的列设置为固定长度的数据类型。因为位图索引使用固定长度的数据类型要比可变长度的数据类型在性能上要更加的优越。也就是说,如果要在某个字符类型的列上建立位图索引,那么最好把这个列的数据类型设置为char(即使其实际存储的长度不同),而不是设置额外NVCHAR2。因为相对于性能的提升来说,这点空间的损失仍然是值得的。

  另外我们也可以通过其他一些手段来保证列中存储内存长度的一致。如拿中国的行政区为例,大部分行政区就是3个字,如浙江省;但是长度比较长的有8个字符,如新疆维吾尔自治区。如果记录比较多的话,累积下来确实会造成比较大的浪费。在这种情况下,数据库管理在设计的时候,可以采用一些折中的处理方式。如利用简称来代表各个省份的名字。还有一种就是在存储的时候利用数字来表示省份,然后再在另外一张表中建立数字与省份之间的对应关系。笔者建议采用的是后面一种方式。

  总之如果要为某个列建立位图索引的话,则数据库管理员最好能够想方设法让这个字段采用固定长度的数据类型,有时候即使牺牲一点存储空间也是在所不辞。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

   oracle10g 提供了类似操作系统中的回收站功能。当drop table的时候,实际上只是将其重命名,并将table以及相关联的对象如index,constraint等放到回收站(RecycleBin)中,后续如果发现drop错了table,可以使用flashback table命名将回收站中的table还原,这就是oracle10g的Flashback Drop功能。
    1.什么是Recycle Bin
    实际上,Recycle Bin只是一个保存被drop的对象的一个数据字典表。所以,可以通过如下语句查询回收站中的信息:select * from recyclebin
    除非拥有sysdba权限,每个用户只能看到属于自己的对象。所以,对于用户来说,好像每个人都拥有自己的回收站。即使用户有删除其他schema对象的权限,也只能在recyclebin中看到属于自己的对象。
SQL> conn hr/hr
已连接。
SQL> drop table test;
表已删除。
SQL> conn test/test
已连接。
SQL> drop table test;
表已删除。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$a5ZBzpZWTQ2TNYt7SOzUFQ==$0 TEST
SQL> conn hr/hr
已连接。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$HX/8VbJARoea6Eckpactvg==$0 TEST

注意:两个对象名是不一样的。
 以下几种drop不会将相关对象放进RecycleBin:
* drop tablespace:会将RecycleBin中所有属于该tablespace的对象清除
* drop user:会将RecycleBin中所有属于该用户的对象清除
* drop cluster:会将RecycleBin中所有属于该cluster的成员对象清除
* drop type:会将RecycleBin中所有依赖该type的对象清除
    RecycleBin中的对象会被系统自动按照规则重命名,这是为了防止命名冲突。命名格式为:BIN$unique_id$version
    其中unique_id是26个字符的对象唯一标识符,version则是对象在数据库中的版本号。

SQL> conn test/test
已连接。
SQL> create table t(id int);
表已创建。
SQL> drop table t;
表已删除。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ -------------------------------
BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 T
BIN$a5ZBzpZWTQ2TNYt7SOzUFQ==$0 TEST

SQL> create table t(id int);
表已创建。
SQL> drop table t;
表已删除。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ -------------------------------
BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 T
BIN$a5ZBzpZWTQ2TNYt7SOzUFQ==$0 TEST
BIN$to91fMaiSSCcj2eI36eDyQ==$0 T
   可以看到,删除table t后,重建一个名为t的table,再次删除,其unique_id是不一样的。
   
   这时,做一个还原看看:

SQL> flashback table t to before drop rename to t;
闪回完成。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ -------------------------------
BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 T

这里,Oracle选择了最后一次删除的T表还原。

再次删除
SQL> drop table t;
表已删除。
SQL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 T
BIN$aafxCq9gTbGMvrqnLMP69A==$0 T
    可以看到unique_id又变了。所以,通过这种命名方式,避免了对于删除table后又重建了同名table的情况可能造成的命名冲突。

2.如何启用/禁用RecycleBin

可以通过参数禁用或启用recyclebin这个特性
在Oracle 10gR1中,通过修改一个隐含_recyclebin为False可以禁
用这个特性,

在Oracle 10gR2中,recyclebin变成了一个常规参数,可以在session/system级动态修改 :
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
recyclebin                           string      on
SQL> alter session set recyclebin=off;
会话已更改。
SQL> alter session set recyclebin=on;
会话已更改。
SQL> alter system set recyclebin=off;
系统已更改。
SQL> alter system set recyclebin=on;
系统已更改。

3.如何查看RecycleBin中的信息
    前面已经提到,用户可以通过查询recyclebin来查看属于自己的被drop的对象。

 SQL> select object_name,object_type from dba_objects where object_name='RECYCLEBIN';

OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE
-------------------
RECYCLEBIN
SYNONYM


SQL> select owner,synonym_name,table_owner,table_name from dba_synonyms where synonym_name='RECYCLEBIN';

OWNER                          SYNONYM_NAME
------------------------------ ------------------------------
TABLE_OWNER                    TABLE_NAME
------------------------------ ------------------------------
PUBLIC                         RECYCLEBIN
SYS                            USER_RECYCLEBIN

可以发现,实际上recyclebin是user_recyclebin的一个公共同义词。还可以通过dba_recyclebin查看系统中所有被drop的对象,但这里没有all_recyclebin视图。
 另外,Sqlplus也提供了一个专门的命令
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$aafxCq9gTbGMvrqnLMP69A==$0 TABLE        2008-09-27:16:02:03
T                BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 TABLE        2008-09-27:15:48:13

    但该命令只能看到被drop的table,该table对应的index等只能通过查询获取。
SQL> create table t(id int);
表已创建。
SQL> create index ix_t on t(id);
索引已创建。
SQL> alter table t add constraint con_t_pk primary key(id) using index ix_t;
表已更改。
SQL> drop table t;
表已删除。
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$Lw6h3tI8SjirrzY38PbKZA==$0 TABLE        2008-09-27:16:41:51
T                BIN$aafxCq9gTbGMvrqnLMP69A==$0 TABLE        2008-09-27:16:02:03
T                BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 TABLE        2008-09-27:15:48:13

 4.如何清除RecycleBin中的对象
    回收站中的东西多了,自然要清除。Oracle10g增加了一个新的关键字purge来执行清除recyclebin的功能。
    purge table table_name可以清除指定的table,这里的table_name既可以是table原来的名字,也可以是回收站中按规则自动命名的名字。
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$Lw6h3tI8SjirrzY38PbKZA==$0 TABLE        2008-09-27:16:41:51
T                BIN$aafxCq9gTbGMvrqnLMP69A==$0 TABLE        2008-09-27:16:02:03
T                BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 TABLE        2008-09-27:15:48:13

1)SQL> purge table test;
    表已清除。
2)SQL> purge table "BIN$Lw6h3tI8SjirrzY38PbKZA==$0";
表已清除。
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$aafxCq9gTbGMvrqnLMP69A==$0 TABLE        2008-09-27:16:02:03
T                BIN$2YtUFN8ZTIqKDKXAPE7HgQ==$0 TABLE        2008-09-27:15:48:13
3) SQL> purge tablespace users;
表空间已清除。
4) SQL> purge tablespace users user hr;
表空间已清除。
 Purge recyclebin可以清除执行该命令的用户所能看到的所有recyclebin对象。也就是普通用户能清除属于自己的对象,而sysdba用户则能清除所有recyclebin中的对象。
5)purge index可以清除index对象。
SQL> create table t1(id int);
表已创建。
SQL> create index ix_t1 on t1(id);
索引已创建。
SQL> drop table t1;
表已删除。
SQL> select object_name,original_name,type from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
TYPE
-------------------------
BIN$lTA1iH/bTzqqe4/qmpBeJw==$0 T
TABLE

BIN$6G08DJvESIyFDrYA9nO24Q==$0 IX_T1
INDEX

BIN$El5FGgr8RF6MY6HiHlnoRw==$0 T1
TABLE
SQL> purge index ix_t1;

索引已清除。

SQL> select object_name,original_name,type from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
TYPE
-------------------------
BIN$lTA1iH/bTzqqe4/qmpBeJw==$0 T
TABLE

BIN$El5FGgr8RF6MY6HiHlnoRw==$0 T1
TABLE
SQL>
5.如何还原RecycleBin中的对象
    前面的试验中已经使用Flashback table来还原过被删除的table.
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$lTA1iH/bTzqqe4/qmpBeJw==$0 TABLE        2008-09-27:17:02:16
T1               BIN$El5FGgr8RF6MY6HiHlnoRw==$0 TABLE        2008-09-27:17:03:25
SQL> flashback table t to before drop rename to t;

闪回完成。

SQL>
 SQL> desc test名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
    ID NUMBER(38)
    如果多次删除同名的table,则使用上面的语句还原的是最后一个被删除的test表,这里也可以使用RecycleBin给table的名字来做还原。
    SQL> flashback table "BIN$GoZUqZ6GS222JZdcCtFlHQ==$0" to before drop rename to test;
    闪回完成。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

1.     使用expdp要先在数据库中创建directory,并给相应的用户read,write权限.

SQL>create directory dmpdir as '/u01/dmdir';
SQL>grant read,write on directory to test;

2.     最常用导出方法

$expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=test 
$expdp scott/tiger DUMPFILE=tmp_dump.dmp DIRECTORY=dmpdir TABLES=(tmp_test:p1,tmp_test:p2) JOB_NAME=tmp_dump LOGFILE=tmp_dump.log
$expdp scott/tiger DUMPFILE=full.dmp DIRECTORY=dmpdir FULL=Y JOB_NAME=full 
$expdp scott/timer DUMPFILE=tmp_200703.dmp DIRECTORY=dmpdir TABLES=tmp QUERY=\"where to_char\(create_time,\'yyyy-mm-dd\'\)\<\'2007-04\'\"

常用一些参数说明:


SCOTT/TIGER:用户/密码(*)

DUMPFILE:导出后的文件名(*)

DIRECTORY:导出文件存放位置(位于服务器端)(*)

CONTENT:导出文件中包含的内容(默认为:ALL,可选DATA_ONLY/METADATA_ONLY)

FILESIZE:指定导出文件大小(单位为bytes).

JOB_NAME:此次导出进程使用的名称,方便跟踪查询(可选)

LOGFILE:日志文件名(默认为:export.log)


INCLUDE:导出时包含指定的类型

(:INCLUDE=TABLE_DATA,

INCLUDE=TABLE:"LIKE 'TAB%'"

INCLUDE=TABLE:”NOT LIKE ‘TAB%’”…)

EXCLUDE:导出时排除的数据类型(:EXCLUDE=TABLE:EMP)


FULL:全库导出时使用(EXPFULL,默认为N)

SCHEMA:导出某一个SCHEMA下的所有数据

TABLES:按表导出(这里的方法和EXP一样)

TABLESPACE:指定一个表空间导出.

QUERY:按表导出时,使用条件语句限定导出范围(exp中的QUERY)


TRANSPORT_FULL_CHECK:

TRANSPORT_TABLESPACES:


FLASHBACK_SCN:

FLASHBACK_TIME:

PARALLEL:并行操作

PARFILE:

NETWORK_LINK:


3.     导出过程中的监控

 Data Pump Export (DPE) 运行时,按 Control-C;它将阻止消息在屏幕上显示,但不停止导出进程本身。相反,它将显示 DPE 提示符(如下所示)。进程现在被认为处于交互式模式:

Export>

这种方法允许在这个 DPE 作业上输入命令查询及控制当前作业。

4.     并行操作(PARALLEL)

您可以通过 PARALLEL 参数为导出使用一个以上的线程来显著地加速作业。每个线程创建一个单独的转储文件,因此参数 dumpfile 应当拥有和并行度一样多的项目。您可以指定通配符作为文件名,而不是显式地输入各个文件名,例如:

expdp ananda/abc123 tables=CASES directory=DPDATA1 dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export

注意:dumpfile 参数拥有一个通配符 %U,它指示文件将按需要创建,格式将为expCASES_nn.dmp,其中nn  01 开始,然后按需要向上增加。

在并行模式下,状态屏幕将显示四个工作进程。(在默认模式下,只有一个进程是可见的)所有的工作进程同步取出数据,并在状态屏幕上显示它们的进度。

分离访问数据文件和转储目录文件系统的输入/输出通道是很重要的。否则,与维护 Data Pump 作业相关的开销可能超过并行线程的效益,并因此而降低性能。并行方式只有在表的数量多于并行值并且表很大时才是有效的。

5.     数据库监控

您还可以从数据库视图获得关于运行的 Data Pump 作业的更多信息。监控作业的主视图是DBA_DATAPUMP_JOBS,它将告诉您在作业上有多少个工作进程(列 DEGREE)在工作。

另一个重要的视图是 DBA_DATAPUMP_SESSIONS,当它与上述视图和 V$SESSION 结合时将给出主前台进程的会话 SID

select sid, serial#
from v$session s, dba_datapump_sessions d
where s.saddr = d.saddr;

这条指令显示前台进程的会话。更多有用的信息可以从警报日志中获得。当进程启动时,MCP 和工作进程在警报日志中显示如下:

kupprdp:master process DM00 started with pid=23, OS id=20530 to execute - 
SYS.KUPM$MCP.MAIN('CASES_EXPORT', 'ANANDA');
kupprdp:worker process DW01 started with worker id=1, pid=24, OS id=20532 to execute - 
SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA');
kupprdp:worker process DW03 started with worker id=2, pid=25, OS id=20534 to execute - 
SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA');

它显示为数据泵操作启动的会话的 PID。您可以用以下查询找到实际的 SID

select sid, program from v$session where paddr in 
(select addr from v$process where pid in (23,24,25));

PROGRAM 列将对应警报日志文件中的名称显示进程 DM (为主进程)或 DW (为工作进程)。如果一个工作进程使用了并行查询,比如说 SID 23,您可以在视图 V$PX_SESSION 中看到它,并把它找出来。它将为您显示从 SID 23 代表的工作进程中运行的所有并行查询会话:

select sid from v$px_session where qcsid = 23;

从视图 V$SESSION_LONGOPS 中可以获得其它的有用信息来预测完成作业将花费的时间。

select sid, serial#, sofar, totalwork
from v$session_longops
where opname = 'CASES_EXPORT'
and sofar != totalwork;

 totalwork 显示总工作量,该列的 sofar 数量被加和到当前的时刻  因而您可以用它来估计还要花多长时间。

6.       处理特定对象

l         Data Pump 允许您只导出特定类型的对象。

例如,以下命令只导出过程,而不导出其它任何东西(不导出表、视图、甚至函数)

expdp scott/tiger directory=dmpdir dumpfile=procedure.dmp include=PROCEDURE

l         要只导出一些特定的对象(比如说,函数 FUNC1 和过程 PROC1)

expdp scott/tiger directory=dmpdir dumpfile=test.dmp 
include=PROCEDURE:\"=\'PROC1\'\",FUNCTION:\"=\'FUNC1\'\"

l         可以用导出的dmp文件来创建dmp文件中包含对象的 DDL 脚本,以供之后使用。

一个称为 SQLFILE(impdp参数)参数允许创建 DDL 脚本文件。

impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=expprocs.dmp SQLFILE=aa.sql

使用这种方法的impdp,可以从dp出来的dmp文件中提取对象的DDL语句,这样的impdp并不把数据导入数据库中,只是创建DDL语句文件

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有