<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
     

    Flashback query(閃回查詢)原理

      Oracle根據undo信息,利用undo數據,類似一致性讀取方法,可以把表置于一個刪除前的時間點(SCN),從而將數據找回。

    Flashback query(閃回查詢)前提:

    SQL> show parameter undo;

    NAME                                TYPE       VALUE

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

    undo_management                     string     AUTO

    undo_retention                        integer    900

    undo_tablespace                       string     UNDOTBS1

    其中undo_management = auto,設置自動undo管理AUM),該參數默認設置為:auto

    Undo_retention = n(),設置決定undo最多的保存時間,其值越大,就需要越多的undo表空間的支持。修改undo_retention的命令如下:

    SQL> alter system set undo_retention = 3600;

    System altered

    閃回實現方式

    1.      獲取數據刪除前的一個時間點或scn,如下:

    SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;

    TIME               SCN

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

    2010-06-29 23:03:14 1060499

    2.      查詢該時間點(或scn)的數據,如下:

    SQL> select * from t as of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');

    SQL> select * from t as of scn 1060174;

    3.      將查詢到的數據,新增到表中。也可用更直接的方法,如:

    SQL>create table tab_test as select * from t of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');
    SQL>insert into tab_test select * from1060174;

    示例:

    Create table t(id number);

    insertinto t values(1);
    insert into t values(2);
    insert into t values(3);
    insert into t values(4);
    insert into t values(5);

    1.查看t表中的原始數據

    SQL> select * from t;

           ID

    ---------

            1

            2

            3

            4

            5

    2.獲取數據刪除前的一個時間點或scn

    SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;

    TIME               SCN

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

    2010-06-29 23:23:33  1061279

    3.刪除t表中的數據,并提交事物

    SQL> delete from t;

    5 rows deleted

    SQL> commit;

    Commit complete

    4.在查看t表,此時t表中數據以刪除

    SQL> select * from t;

           ID

    ----------

    5.查看t表中scn1061279(或時間點為2010-06-29 23:23:33)時的數據

    SQL> select * from t as of scn 1061279;

           ID

    ----------

            1

            2

            3

            4

            5

    6.確認要恢復后,將t表中的數據還原到scn1061279(或時間點為2010-06-29 23:23:33)時的數據,并提交事物

    SQL> insert into t select * from t as of scn 1061279;

    5 rows inserted

    SQL> commit;

    Commit complete

    7.確認t表數據的還原情況

    SQL> select * from t;

           ID

    ----------

            1

            2

            3

            4

            5

    注:推薦使用scn,由于oracle9i中,因為scn與時間點的同步需要5分鐘,如果最近5分鐘之內的數據需要Falshback query查詢,可能會查詢丟失,而scn則不存在這個問題。Oracle10g中這個問題已修正(scn與時間點的大致關系,可以通過logmnr分析歸檔日志獲得)。

    Falshback query查詢的局限:

    1. 不能Falshback5天以前的數據。

    2. 閃回查詢無法恢復到表結構改變之前,因為閃回查詢使用的是當前的數據字典。

    3. 受到undo_retention參數的影響,對于undo_retention之前的數據,Flashback不保證能Flashback成功。

    4. drop,truncate等不記錄回滾的操作,不能恢復。

    5. 普通用戶使用dbms_flashback包,必須通過管理員授權。命令如下:

    SQL>grant execute on dbms_flashback to scott;

    posted @ 2010-08-04 20:39 xzc 閱讀(27810) | 評論 (0)編輯 收藏

    上一回演示了運用閃回表查詢恢復delete刪除的數據以及其原理,今天了解下閃回表。

    原理:

      閃回表(Flashback table)與閃回查詢(Flashback query)的原理大致相同,也是利用undo信息來恢復表對象到以前的某一個時間點(一個快照),因此也要確保AUM有足夠的Retention值。但閃回表不等于閃回查詢,其區別如下:

    閃回查詢只是查詢以前的一個快照而已,并不改變當前表的狀態。

    閃回表則是將恢復當前表及附屬對象一起回到以前的時間點。

    特性:

    1.  在線操作

    2.  恢復到指定的時間點(或者SCN)的任何數據

    3.  自動恢復相關屬性

    4.  滿足分布式的一致性

    5.  數據的一致性,所有相關對象將自動一致。

    語法:

     SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss');

     SQL> flashback table tab_test to scn 1154953;

     SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

    運用閃回表前提

      1.普通用戶中需要有Flashback any table的系統權限。命令如:

      SQL>grant flashback any table to scott;

      2.有該表的select、insert、delete、alter權限。

      3.必須保證該表有row movement(行移動)。

    示例:

     1.創建tab_test表

    SQL> create table tab_test as select * from all_objects;

    Table created

    2.查詢tab_test表中數據量

    SQL> select count(*) from tab_test;

     COUNT(*)

    ----------

        40699

    3.為tab_test表創建索引和觸發器(觸發器為null,不做任何操作)

    SQL> create index ind_test on tab_test(object_name);

    Index created

    SQL> create or replace trigger tr_test

     2 after update on tab_test

     3 for each row

     4 begin

     5     null;

     6 

     7 end tr_test;

     8 /

    Trigger created

    4.記錄當時的時間點,試圖恢復到該時間點

    SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;

    TIME               SCN

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

    2010-06-30 23:02:37 1160764

    5.刪除tab_test表中數據

    SQL> delete from tab_test;

    40699 rows deleted

    SQL> commit;

    Commit complete

    6.查詢刪除數據后的tab_test,確定其表中已沒有數據

    SQL> select count(*) from tab_test;

     COUNT(*)

    ----------

    7.刪除tab_test表中索引ind_test

    SQL> drop index ind_test;

    Index dropped

    8.更改tr_test觸發器

    SQL> create or replace trigger tr_test

     2 after insert on tab_test

     3 for each row

     4 begin

     5     null;

     6 

     7 end tr_test;

     8 /

    Trigger created

    9.確保該表中的行遷移(row movement)功能

    SQL> alter table tab_test enable row movement;

    Table altered

    10.恢復tab_test表到剛記錄的時間點(或scn),由于表中存在觸發器,因此使用了關鍵字enable triggers;

    SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 23:02:37', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

    Done

    11.查看恢復結果如下:

    SQL> select count(*) from tab_test;

     COUNT(*)

    ----------

        40699

    SQL> select index_name from user_indexes where table_name = 'TAB_TEST';

    INDEX_NAME

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

    SQL> select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');

    OBJECT_NAME                                                                     STATUS

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

    TR_TEST            VALID

    SQL> set pages 0

    SQL> set lines 1000

    Cannot SET LINES

    SQL> set long 2000

    SQL> select text from user_source t where t.name = 'TR_TEST' order by line;

    trigger tr_test

    after insert on tab_test

    for each row

    begin

       null;

    end tr_test;

    總結:

    1. Flashback table在真正的高可用環境中,使用意義不大,受限比較多,要必須確保行遷移功能

    2. Flashback table過程中,阻止寫操作

    3. 表中數據能恢復,而表中索引確不能正常恢復

    4. 恢復的觸發器本身還是修改后的,并不隨表flashback到修改以前的時間點。說明關鍵字enable triggers只能保證觸發器的狀態正常,而不是內容回滾.

    5. 由于原理利用其undo信息,來恢復其對象,因此也是不能恢復truncate數據

    6. 恢復數據用flashback query實現比較好

    posted @ 2010-08-04 20:39 xzc 閱讀(3088) | 評論 (0)編輯 收藏

    在數據庫的日常學習中,發現公司生產數據庫的默認臨時表空間temp使用情況達到了30G,使用率達到了100%;待調整為32G后,使用率還是為100%,導致磁盤空間使用緊張。根據臨時表空間的主要是對臨時數據進行排序和緩存臨時數據等特性,待重啟數據庫后,temp會自動釋放。于是想通過重啟數據庫的方式來緩解這種情況,但是重啟數據庫之后,發現臨時表空間temp的使用率還是100%,一點沒變。雖然運行中應用暫時沒有報什么錯誤,但是這在一定程度上存在一定的隱患,有待解決該問題。由于臨時表空間主要使用在以下幾種情況:
    1、order by or group by (disc sort占主要部分);
    2、索引的創建和重創建;
    3、distinct操作;
    4、union & intersect & minus sort-merge joins;

    5、Analyze 操作;
    6、有些異常也會引起TEMP的暴漲。

    Oracle臨時表空間暴漲的現象經過分析可能是以下幾個方面的原因造成的:
    1. 沒有為臨時表空間設置上限,而是允許無限增長。但是如果設置了一個上限,最后可能還是會面臨因為空間不夠而出錯的問題,臨時表空間設置太小會影響性能,臨時表空間過大同樣會影響性能,至于需要設置為多大需要仔細的測試。
    2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據查詢的字段和表的個數會生成一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的字段過多和數據過大,那么就會消耗非常大的臨時表空間。
    3.對查詢的某些字段沒有建立索引。Oracle中,如果表沒有索引,那么會將所有的數據都復制到臨時表空間,而如果有索引的話,一般只是將索引的數據復制到臨時表空間中。
    針對以上的分析,對查詢的語句和索引進行了優化,情況得到緩解,但是需要進一步測試。
    總結:
    1.SQL語句是會影響到磁盤的消耗的,不當的語句會造成磁盤暴漲。
    2.對查詢語句需要仔細的規劃,不要想當然的去定義一個查詢語句,特別是在可以提供用戶自定義查詢的軟件中。
    3.仔細規劃表索引。如果臨時表空間是temporary的,空間不會釋放,只是在sort結束后被標記為free的,如果是permanent的,由SMON負責在sort結束后釋放,都不用去手工釋放的。查看有哪些用戶和SQL導致TEMP增長的兩個重要視圖:v$sort_usage和v$sort_segment。

    通過查詢相關的資料,發現解決方案有如下幾種:
    一、重建臨時表空間temp
    Temporary tablespace是不能直接drop默認的臨時表空間的,不過我們可以通過以下方法達到。
    查看目前的Temporary Tablespace
    SQL> select name from v$tempfile;

    NAME
    ———————————————————————
    D:\ORACLE\ORADATA\ORCL\TEMP01.DBF

    SQL> select username,temporary_tablespace from dba_users;
    USERNAME TEMPORARY_TABLESPACE
    ------------------------------ ------------------------------
    MGMT_VIEW TEMP
    SYS TEMP
    SYSTEM TEMP
    DBSNMP TEMP
    SYSMAN TEMP

    1.創建中轉臨時表空間
    create temporary tablespace TEMP1 TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M

    MAXSIZE UNLIMITED;
    2.改變缺省臨時表空間 為剛剛創建的新臨時表空間temp1
    alter database default temporary tablespace temp1;
    3.刪除原來臨時表空間
    drop tablespace temp including contents and datafiles;
    4.重新創建臨時表空間
    create temporary tablespace TEMP TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE

    UNLIMITED;
    5.重置缺省臨時表空間為新建的temp表空間
    alter database default temporary tablespace temp;
    6.刪除中轉用臨時表空間
    drop tablespace temp1 including contents and datafiles;

    以上的方法只是暫時釋放了臨時表空間的磁盤占用空間,是治標但不是治本的方法,真正的治本的方法是找出數據庫中消耗資源比較大的sql語句,然后對其進行優化處理。下面是查詢在sort排序區使用的執行耗時的SQL:

    Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_text
    from v$sort_usage su,v$parameter p,v$session se,v$sql s
    where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid;
    或是:
    Select su.username,su.Extents,tablespace,segtype,sql_text
    From v$sort_usage su,v$sql s
    Where su.SQL_ID = s.SQL_ID;
    注:如果原臨時表空間無用戶使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系統可以看看文件的時間戳。
    我們可以刪除該表空間:如果原臨時表空間還有用戶在使用,你是刪除不了這個表空間的!在一次生產環境的臨時表空間切換中,原臨時表空間始終有用戶在上面,即使我關閉了前臺程序,也還是有用戶,新的臨時表空間已經沒有用戶在使用了。我估計用戶進程已經死在原臨時表空間了,后來只有重新啟動數據庫才能把原來舊的臨時表空間給刪除。

    二、修改參數(這個方案緊適用于8i及8i以下的版本)
    修改一下TEMP表空間的storage參數,讓Smon進程觀注一下臨時段,從而達到清理和TEMP表空間的目的。
    SQL>alter tablespace temp increase 1;
    SQL>alter tablespace temp increase 0;

    三、Kill session
    1、 使用如下語句a查看一下認誰在用臨時段
    SELECT se.username, se.SID, se.serial#, se.sql_address, se.machine, se.program, su.TABLESPACE,su.segtype, su.CONTENTS FROM

    v$session se, v$sort_usage su WHERE se.saddr = su.session_addr
    2、kill正在使用臨時段的進程
    SQL>Alter system kill session 'sid,serial#';
    3、把TEMP表空間回縮一下
    SQL>Alter tablespace TEMP coalesce;

    注:這處方法只能針對字典管理表空間(Dictionary Managed Tablespace)。于本地管理表空間(LMT:Local Managed Tablespace),不需要整理的。9i以后只能創建本地管理的表空間。
    CREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT DICTIONARY
    CREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL;

    四、使用診斷事件,也是相對有效的一種方法

    1、查詢事件代碼
    SQL>select ts#, name from sys.ts$ ;
    TS# NAME
    ---------- ------------------------------
    0 SYSTEM
    1 UNDOTBS1
    2 SYSAUX
    3 TEMP
    4 USERS
    5 UNDOTBS2
     2、 執行清理操作
     SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4';
    說明:temp表空間的TS# 為 3, So TS#+ 1= 4。

    oracle臨時表空間過大的原因
    2009-05-12 11:22
    Oracle臨時表空間主要是用來做查詢和存放一些緩存的數據的,磁盤消耗的一個主要原因是需要對查詢的結果進行排序,如果沒有猜錯的話,在磁盤空間的(內存)的分配上,Oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那么臨時表空間就是1GB,如果還有增長,那么依此類推,臨時表空間始終保持在一個最大的上限。Oracle臨時表空間暴漲的現象經過分析可能是以下幾個方面的原因造成的。
            1. 沒有為臨時表空間設置上限,而是允許無限增長。但是如果設置了一個上限,最后可能還是會面臨因為空間不夠而出錯的問題,臨時表空間設置太小會影響性能,臨時表空間過大同樣會影響性能,至于需要設置為多大需要仔細的測試。
            2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據查詢的字段和表的個數會生成一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的字段過多和數據過大,那么就會消耗非常大的臨時表空間。
           3.對查詢的某些字段沒有建立索引。Oracle中,如果表沒有索引,那么會將所有的數據都復制到臨時表空間,而如果有索引的話,一般只是將索引的數據復制到臨時表空間中。
           針對以上的分析,對查詢的語句和索引進行了優化,情況得到緩解,但是需要進一步測試。

           總結:
           1.SQL語句是會影響到磁盤的消耗的,不當的語句會造成磁盤暴漲。
           2.對查詢語句需要仔細的規劃,不要想當然的去定義一個查詢語句,特別是在可以提供用戶自定義查詢的軟件中。
           3.仔細規劃表索引。

    如果臨時表空間是temporary的,空間不會釋放,只是在sort結束后被標記為free的,如果是permanent的,由SMON負責在sort結束后釋放,都不用去手工釋放的。查看有哪些用戶和SQL導致TEMP增長的兩個重要視圖:
    v$sort_usage和v$sort_segment
    對于非LMT管理方式的TEMP表空間,最簡單的方法是Metalink給出的一個方法:
    修改一下TEMP表空間的storage參數,讓Smon進程觀注一下臨時段,從而達到清理和TEMP表空間的目的。
    SQL>alter tablespace temp default storage(pctincrease 1);
    SQL>alter tablespace temp default storage(pctincrease 0);

    而對于LMT管理方式的TEMP表空間,需要重新建立一個新的臨時表空間,將所有用戶的默認臨時表空間指定到新的表空間上,然后offline舊的臨時表空間,并drop掉。具體步驟如下:
    首先查詢用戶的缺省臨時表空間:

    [oracle@jumper oracle]$ sqlplus "/ as sysdba"

    SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 11:11:43 2006

    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


    Connected to:
    Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning option
    JServer Release 9.2.0.4.0 - Production

    SQL> select username,temporary_tablespace from dba_users;

    USERNAME                       TEMPORARY_TABLESPACE
    ------------------------------ ------------------------------
    SYS                                 TEMP2
    SYSTEM                         TEMP2
    OUTLN                           TEMP2
    EYGLE                            TEMP2
    CSMIG                            TEMP2
    TEST                               TEMP2
    REPADMIN                     TEMP2
    ......

    13 rows selected.

    SQL> select name from v$tempfile;

    NAME
    ---------------------------------------------------------------------
    /opt/oracle/oradata/conner/temp02.dbf
    /opt/oracle/oradata/conner/temp03.dbf
     

    重建新的臨時表空間并進行切換:

    SQL> create temporary tablespace temp tempfile '/opt/oracle/oradata/conner/temp1.dbf' size 10M;

    Tablespace created.

    SQL> alter tablespace temp add tempfile '/opt/oracle/oradata/conner/temp2.dbf' size 20M;

    Tablespace altered.

    SQL> alter database default temporary tablespace temp;

    Database altered.

    SQL> select username,temporary_tablespace from dba_users;

    USERNAME                       TEMPORARY_TABLESPACE
    ------------------------------ ------------------------------
    SYS                                 TEMP
    SYSTEM                         TEMP
    OUTLN                           TEMP
    EYGLE                            TEMP
    CSMIG                           TEMP
    TEST                               TEMP
    REPADMIN                     TEMP
    .......

    13 rows selected.
     

    如果原臨時表空間無用戶使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系統可以看看文件的時間戳。

    我們可以刪除該表空間:(如果原臨時表空間還有用戶在用,你是刪除不了這個表空間的!在一次生產環境的臨時表空間切換中,原臨時表空間始終有用戶在上面,即使我關閉了前臺程序,也還是有用戶,新的臨時表空間已經沒有用戶在使用了。我估計用戶進程已經死在原臨時表空間了。后來只有重新啟動數據庫才能把原來舊的臨時表空間給刪除。)

    SQL> drop tablespace temp2;

    Tablespace dropped.

    SQL>
    SQL> select name from v$tempfile;

    NAME
    ---------------------------------------------------------------
    /opt/oracle/oradata/conner/temp1.dbf
    /opt/oracle/oradata/conner/temp2.dbf

    SQL> select file_name,tablespace_name,bytes/1024/1024 MB,autoextensible
    2 from dba_temp_files
    3 /

    FILE_NAME                              TABLESPACE_NAME              MB AUTOEXTENSIBLE
    -------------------------------------- -------------------- ---------- --------------
    /opt/oracle/oradata/conner/temp2.dbf   TEMP                         20 NO
    /opt/oracle/oradata/conner/temp1.dbf   TEMP                         10 NO
     

    drop tablespace temp including contents and datafiles; --將表空間的內容和數據文件一起刪除。

    下面是查詢在sort排序區使用的執行耗時的SQL:
    Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as    Space,tablespace,segtype,sql_text
      from v$sort_usage su,v$parameter p,v$session se,v$sql s
      where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr
      order by se.username,se.sid

    或是:

    Select su.username,su.Extents,tablespace,segtype,sql_text
    From v$sort_usage su,v$sql s
    Where su.SQL_ID = s.SQL_ID
     

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xiaozhang0731/archive/2010/05/05/5557856.aspx

    posted @ 2010-08-04 17:13 xzc 閱讀(2916) | 評論 (2)編輯 收藏
    此文從以下幾個方面來整理關于分區表的概念及操作:
            1.表空間及分區表的概念
            2.表分區的具體作用
            3.表分區的優缺點
            4.表分區的幾種類型及操作方法
            5.對表分區的維護性操作.
    (1.) 表空間及分區表的概念
    表空間:
      是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。
     
    分區表:
    當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至于每次都掃描整張表。
     
    ( 2).表分區的具體作用
    Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。
     
    分區功能能夠將表、索引或索引組織表進一步細分為段,這些數據庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從數據庫管理員的角度來看,一個分區后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區后的對象時有相當大的靈活性。但是,從應用程序的角度來看,分區后的表與非分區表完全相同,使用 SQL DML 命令訪問分區后的表時,無需任何修改。
     
    什么時候使用分區表:
    1、表的大小超過2GB。
    2、表中包含歷史數據,新的數據被增加都新的分區中。
     
     (3).表分區的優缺點
    表分區有以下優點:
    1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
    2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
    3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
    4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
     
    缺點:
    分區表相關:已經存在的表沒有方法可以直接轉化為分區表。不過 Oracle 提供了在線重定義表的功能。
     
    (4).表分區的幾種類型及操作方法
     一.范圍分區:
    范圍分區將數據基于范圍映射到每一個分區,這個范圍是你在創建分區時指定的分區鍵決定的。這種分區方式是最為常用的,并且分區鍵經常采用日期。舉個例子:你可能會將銷售數據按照月份進行分區。
    當使用范圍分區時,請考慮以下幾個規則:
    1、每一個分區都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區中的上限值。分區鍵的任何值等于或者大于這個上限值的記錄都會被加入到下一個高一些的分區中。
    2、所有分區,除了第一個,都會有一個隱式的下限值,這個值就是此分區的前一個分區的上限值。
    3、在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高于其它分區中的任何分區鍵的值,也可以理解為高于任何分區中指定的VALUE LESS THEN的值,同時包括空值。
    例一:
    假設有一個CUSTOMER表,表中有數據200000行,我們將此表通過CUSTOMER_ID進行分區,每個分區存儲100000行,我們將每個分區保存到單獨的表空間中,這樣數據文件就可以跨越多個物理磁盤。下面是創建表和分區的代碼,如下:
    CREATE TABLE CUSTOMER
    (
        CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
        FIRST_NAME  VARCHAR2(30) NOT NULL,
        LAST_NAME   VARCHAR2(30) NOT NULL,
        PHONE        VARCHAR2(15) NOT NULL,
        EMAIL        VARCHAR2(80),
        STATUS       CHAR(1)
    )
    PARTITION BY RANGE (CUSTOMER_ID)
    (
        PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
        PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
    )
    例二:按時間劃分
    CREATE TABLE ORDER_ACTIVITIES
    (
        ORDER_ID      NUMBER(7) NOT NULL,
        ORDER_DATE    DATE,
        TOTAL_AMOUNT NUMBER,
        CUSTOTMER_ID NUMBER(7),
        PAID           CHAR(1)
    )
    PARTITION BY RANGE (ORDER_DATE)
    (
      PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,
      PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
      PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
    )
    例三:MAXVALUE
    CREATE TABLE RangeTable
    (
      idd   INT PRIMARY KEY ,
      iNAME VARCHAR(10),
      grade INT 
    )
    PARTITION  BY  RANGE (grade)
    (
          PARTITION  part1 VALUES  LESS  THEN (1000) TABLESPACE  Part1_tb,
          PARTITION  part2 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  Part2_tb
    );
     
    二.列表分區:
    該分區的特點是某列的值只有幾個,基于這樣的特點我們可以采用列表分區。
    例一
    CREATE TABLE PROBLEM_TICKETS
    (
        PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,
        DESCRIPTION  VARCHAR2(2000),
        CUSTOMER_ID  NUMBER(7) NOT NULL,
        DATE_ENTERED DATE NOT NULL,
        STATUS       VARCHAR2(20)
    )
    PARTITION BY LIST (STATUS)
    (
          PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,
          PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
    例二
    CREATE  TABLE  ListTable
    (
        id    INT  PRIMARY  KEY ,
        name  VARCHAR (20),
        area  VARCHAR (10)
    )
    PARTITION  BY  LIST (area)
    (
        PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,
        PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb
    );
    )
     
    三.散列分區:
    這類分區是在列值上使用散列算法,以確定將行放入哪個分區中。當列的值沒有合適的條件時,建議使用散列分區。
    散列分區為通過指定分區編號來均勻分布數據的一種分區類型,因為通過在I/O設備上進行散列分區,使得這些分區大小一致。
    例一:
    CREATE TABLE HASH_TABLE
    (
      COL NUMBER(8),
      INF VARCHAR2(100)
    )
    PARTITION BY HASH (COL)
    (
      PARTITION PART01 TABLESPACE HASH_TS01,
      PARTITION PART02 TABLESPACE HASH_TS02,
      PARTITION PART03 TABLESPACE HASH_TS03
    )
    簡寫:
    CREATE TABLE emp
    (
        empno NUMBER (4),
        ename VARCHAR2 (30),
        sal   NUMBER
    )
    PARTITION BY  HASH (empno) PARTITIONS 8
    STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
     
    hash分區最主要的機制是根據hash算法來計算具體某條紀錄應該插入到哪個分區中,hash算法中最重要的是hash函數,Oracle中如果你要使用hash分區,只需指定分區的數量即可。建議分區的數量采用2的n次方,這樣可以使得各個分區間數據分布更加均勻。
     
    四.組合范圍散列分區
    這種分區是基于范圍分區和列表分區,表首先按某列進行范圍分區,然后再按某列進行列表分區,分區之中的分區被稱為子分區。
    CREATE TABLE SALES
    (
    PRODUCT_ID VARCHAR2(5),
    SALES_DATE DATE,
    SALES_COST NUMBER(10),
    STATUS VARCHAR2(20)
    )
    PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
    (
       PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
              (
                  SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                  SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
              ),
       PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
              (
                  SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                  SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
              )
    )
     
    五.復合范圍散列分區:
    這種分區是基于范圍分區和散列分區,表首先按某列進行范圍分區,然后再按某列進行散列分區。
    create table dinya_test
     (
     transaction_id number primary key,
     item_id number(8) not null,
     item_description varchar2(300),
     transaction_date date
     )
     partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
     (
         partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
         partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
         partition part_03 values less than(maxvalue)
     );
     
    (5).有關表分區的一些維護性操作:
    一、添加分區
    以下代碼給SALES表添加了一個P3分區
    ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
    注意:以上添加的分區界限應該高于最后一個分區界限。
    以下代碼給SALES表的P3分區添加了一個P3SUB1子分區
    ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
    二、刪除分區
    以下代碼刪除了P3表分區:
    ALTER TABLE SALES DROP PARTITION P3;
    在以下代碼刪除了P4SUB1子分區:
    ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
    注意:如果刪除的分區是表中唯一的分區,那么此分區將不能被刪除,要想刪除此分區,必須刪除表。
    三、截斷分區
    截斷某個分區是指刪除某個分區中的數據,并不會刪除分區,也不會刪除其它分區中的數據。當表中即使只有一個分區時,也可以截斷該分區。通過以下代碼截斷分區:
    ALTER TABLE SALES TRUNCATE PARTITION P2;
    通過以下代碼截斷子分區:
    ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
    四、合并分區
    合并分區是將相鄰的分區合并成一個分區,結果分區將采用較高分區的界限,值得注意的是,不能將分區合并到界限較低的分區。以下代碼實現了P1 P2分區的合并:
    ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
    五、拆分分區
    拆分分區將一個分區拆分兩個新分區,拆分后原來分區不再存在。注意不能對HASH類型的分區進行拆分。
    ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
    六、接合分區(coalesca)
    結合分區是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,可以增加散列分區,然后進行接合,值得注意的是,接合分區只能用于散列分區中。通過以下代碼進行接合分區:
    ALTER TABLE SALES COALESCA PARTITION;
    七、重命名表分區
    以下代碼將P21更改為P2
    ALTER TABLE SALES RENAME PARTITION P21 TO P2;
    八、相關查詢
    跨分區查詢
    select sum( *) from
    (select count(*) cn from t_table_SS PARTITION (P200709_1)
    union all
    select count(*) cn from t_table_SS PARTITION (P200709_2)
    );
    查詢表上有多少分區
    SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
    查詢索引信息
    select object_name,object_type,tablespace_name,sum(value)
    from v$segment_statistics
    where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
    group by object_name,object_type,tablespace_name
    order by 4 desc
     
    --顯示數據庫所有分區表的信息:
    select * from DBA_PART_TABLES
     
    --顯示當前用戶可訪問的所有分區表信息:
    select * from ALL_PART_TABLES
     
    --顯示當前用戶所有分區表的信息:
    select * from USER_PART_TABLES
     
    --顯示表分區信息 顯示數據庫所有分區表的詳細分區信息:
    select * from DBA_TAB_PARTITIONS
     
    --顯示當前用戶可訪問的所有分區表的詳細分區信息:
    select * from ALL_TAB_PARTITIONS
     
    --顯示當前用戶所有分區表的詳細分區信息:
    select * from USER_TAB_PARTITIONS
     
    --顯示子分區信息 顯示數據庫所有組合分區表的子分區信息:
    select * from DBA_TAB_SUBPARTITIONS
     
    --顯示當前用戶可訪問的所有組合分區表的子分區信息:
    select * from ALL_TAB_SUBPARTITIONS
     
    --顯示當前用戶所有組合分區表的子分區信息:
    select * from USER_TAB_SUBPARTITIONS
     
    --顯示分區列 顯示數據庫所有分區表的分區列信息:
    select * from DBA_PART_KEY_COLUMNS
     
    --顯示當前用戶可訪問的所有分區表的分區列信息:
    select * from ALL_PART_KEY_COLUMNS
     
    --顯示當前用戶所有分區表的分區列信息:
    select * from USER_PART_KEY_COLUMNS
     
    --顯示子分區列 顯示數據庫所有分區表的子分區列信息:
    select * from DBA_SUBPART_KEY_COLUMNS
     
    --顯示當前用戶可訪問的所有分區表的子分區列信息:
    select * from ALL_SUBPART_KEY_COLUMNS
     
    --顯示當前用戶所有分區表的子分區列信息:
    select * from USER_SUBPART_KEY_COLUMNS
     
    --怎樣查詢出oracle數據庫中所有的的分區表
    select * from user_tables a where a.partitioned='YES'
     
    --刪除一個表的數據是
    truncate table table_name;
     
    --刪除分區表一個分區的數據是
    alter table table_name truncate partition p5;
    posted @ 2010-07-31 17:53 xzc 閱讀(207) | 評論 (0)編輯 收藏
         摘要: Oracle 分析函數使用介紹    分析函數是oracle816引入的一個全新的概念,為我們分析數據提供了一種簡單高效的處理方式.在分析函數出現以前,我們必須使用自聯查詢,子查詢或者內聯視圖,甚至復雜的存儲過程實現的語句,現在只要一條簡單的sql語句就可以實現了,而且在執行效率方面也有相當大的提高.下面我將針對分析函數做一些具體的說明. 今天我主要給大家介紹一下以下幾...  閱讀全文
    posted @ 2010-07-29 11:15 xzc 閱讀(177) | 評論 (0)編輯 收藏

    表壓縮是如何工作的

    Orcle9i2版中,表壓縮特性通過刪除在數據庫表中發現的重復數據值來節省空間。壓縮是在數據庫的數據塊級別上進行的。當確定一個表要被壓縮后,數據庫便在每一個數據庫數據塊中保留空間,以便儲存在該數據塊中的多個位置上出現的數據的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的數據只存儲在該符號表中,而不是在數據庫行本身內。當在一個數據庫行中出現被標識為要壓縮的數據時,該行在該符號表中存儲一個指向相關數據的指針,而不是數據本身。節約空間是通過刪除表中數據值的冗余拷貝而實現的。

    對于用戶或應用程序開發人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發人員訪問表的方式都是相同的,所以當你決定壓縮一個表時,不需要修改SQL查詢。表壓縮的設置通常由數據庫管理人員或設計人員進行配置,幾乎不需要開發人員或用戶參與。

    1.表級別:

    1.1 創建一個壓縮表:

    創建表時使用COMPRESS關鍵字,COMPRESS關鍵字指示Oracle數據庫盡可能以壓縮的格式存儲該表中的行。

    SQL> create table tmp_test

    (id number,phone varchar2(20),create_time date)

    compress;

    1.2 修改現有表為壓縮表:

    SQL> alter table tmp_test compress;

    取消表的壓縮:

    SQL> alter table tmp_test nocompress;

    1.3 確定表是否被壓縮:

    確定一個表是否使用了壓縮,查詢user_tables,compression字段表明表是否被壓縮.

    SQL> select table_name,compression from user_tables where table_name not like 'BIN%';

    TABLE_NAME COMPRESS

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

    CLASSES ENABLED

    ROOMS ENABLED

    STUDENTS DISABLED

    MAJOR_STATS DISABLED

    2.表空間級別:

    2.1 創建表壓縮空間:

    可以在表空間級別上定義COMPRESS屬性,既可以在生成時利用CREATE TABLESPACE來定義,也可以稍后時間利用ALTER TABLESPACE來定義。

    與其他存儲參數類似,COMPRESS屬性也具有一些繼承特性。當在一個表空間中創建一個表時,它從該表空間繼承COMPRESS屬性。

    可以在一個表空間直接壓縮或解壓縮一個表,而不用考慮表空間級別上的COMPRESS屬性。

    2.2 使現有表空間轉換為壓縮表空間 SQL> alter tablespace sms default compress;
    SQL> alter tablespace sms default nocompress;

    2.3 確定是否已經利用COMPRESS對一個表空間進行了定義,可查詢USER_TABLESPACES數據字典視圖并查看DEF_TAB_COMPRESSION

    SQL> select tablespace_name,def_tab_compression from user_tablespaces;

    TABLESPACE DEF_TAB_

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

    USERS DISABLED

    TEST DISABLED

    UNDOTBS01 DISABLED

    STATPACK DISABLED

    3.向一個壓縮的表中加載數據

    :當像上面那樣指定compress,其它表中(表空間)的數據并沒有壓縮,它只是修改了數據字典的設置;只有在向一個表中加裁/插入數據時,才會壓縮數據.

    只有在使用下面4種方法時,表中的數據才會被壓縮存放:

    • 直接路徑的 sql*load
    • 帶有/*+ append*/ insert語句
    • create table .. as select..
    • 并行insert

    4.壓縮一個已經存在但并未壓縮的表

    使用alter table .. move compress使一個已存在但未壓縮的表轉換為壓縮表.

    SQL> alter table tmp_test move compress;

    同樣,也可以使用alter table.. move nocompress來解壓一個已經壓縮的表:

    SQL> alter table tmp_test move nocompress;

    5.壓縮一個物化視圖

    使用用于壓縮表的類似方式來壓縮物化視圖。

    基于多個表的聯接生成的物化視圖通常很適于壓縮,因為它們通常擁有大量的重復數據項。

    SQL> create materialized view mv_tmp_test

    compress

    as

    select a.phone,b.create_time from tmp_test a,recv_stat b

    where a.id=b.id;

    可以使用ALTER MATERIALIZED VIEW命令來改變一個物化視圖的壓縮屬性。

    當你使用此命令時,請注意通常是在下一次刷新該物化視圖時才會進行實際的壓縮。

    SQL> alter materialized view mv_temp_test compress;

    6.壓縮一個已分區的表

    在對已分區的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分區級別上應用壓縮。

    你可以利用ALTER TABLE ...MOVE PARTITION命令對此分區進行壓縮

    SQL> alter table tmp_test move partition create_200606 compress;

    要找出一個表中的哪些分區被壓縮了,可以查詢數據字典視圖USER_TAB_PARTITIONS

    SQL>SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;

    7.壓縮表的性能開銷

    一個壓縮的表可以存儲在更少的數據塊中,從而節省了儲存空間,而使用更少的數據塊也意味著性能的提高。 在一個I/O受到一定限制的環境中對一個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的數據庫數據塊要少得多。

    使用sql*load加載100萬數據:

    表名

     

    行數

     

    路徑

     

    是否是壓縮的

     

    消耗的時間

     

    test_nocom

     

    1000000

     

    直接

     

    非壓縮的

     

    00:00:21.12

     

    test_comp

     

    1000000

     

    直接

     

    壓縮的

     

    00:00:47.77

     

    由此可以看出,向壓縮表中加入數據的時間是正常表的一倍.加載壓縮的表所需要的額外時間來自于在數據加載過程中所執行的壓縮操作。

    可以得出的結論是:在很少改變的表上使用壓縮技術還是可以的.表中數據經常變動的情況下,盡量不要使用表壓縮,它影響插入操作.

    posted @ 2010-07-16 14:58 xzc 閱讀(5565) | 評論 (2)編輯 收藏
    一、Linux壓縮工具概述

    在Linux系統中,提供了許多壓縮工具,雖然方便,但也難免造成一些混亂。筆者通過一段時間的整理,將它們理一理順,希望能夠對大家有所幫助:
    首先,我們看一下下面這張“壓縮包擴展名與壓縮工具對應表”,大家通過這張表,就知道網上下載的壓縮包,該用什么軟件來解了。
    工具名 壓縮包擴展名
    gzip/gunzip “.gz”
    compress/uncompress “.Z”
    zip/unzip “.zip”
    bzip2/bunzip2 “.bz2”
    lha “.lzh”

    接下來,我們通過實例,來測量一下它們的壓縮效率與性能:

    測試一:
    測試數據:源文件是一個數據庫文件,其大小為5,244,928;
    測試結果:
    gzip:19,136,2秒
    compress:17,769,1秒
    zip:19,261,2秒
    bzip2:1902,2秒
    測試二:
    測試數據:源文件是一個/etc目錄的tar包,其大小為2,631,680;
    測試結果:
    gzip:551,736,2秒
    compress:877,391,3秒
    zip:551,856,3秒
    bzip2:478,512,11秒
    測試三:
    測試數據:源文件是一個avi視頻文件,其大小為23,157,760;
    測試結果:
    gzip:17,151,395,43秒
    compress:壓縮失敗,43秒
    zip:17,151,509,42秒
    bzip2:16,587,991,2分40秒
    通過上面的實驗,我認為如果你需要高壓縮率,就選擇bzip2;否則最佳選擇就是gzip,它的性價比較好,而且是純正的自由軟件:gzip就是GNU zip!
    在LINUX/UNIX系統下,用這些壓縮軟件是不能直接對一個目錄進行打包,當您需要這樣做時,通常先使用tar進行歸檔,將整個目錄打包成為一個tar包,然后用壓縮軟件來壓縮。下面我們以備份/etc目錄下的所有文件為例,說明一下:
    tar –cvf etc /etc (將在當前目錄生成一個etc.tar)
    gzip etc.tar (將會把etc.tar壓縮成為etc.tar.gz)

    關于tar的更多信息,我們將專文說明。
    好了,說了這么多,下面我們就一起逐一看一下這些壓縮工具的用法。


    二、Linux壓縮工具概述

    1.gzip和gunzip
    壓縮包擴展名:“.gz”
    特點:
    1)它是純正的自由軟件,性能不錯!
    2)若沒有加上任何參數,生成壓縮文件后,會刪除原始文件;

    命令使用:
    1) 壓縮一個文件:
    gzip file 這樣將生成file.gz,刪除原文件file;

    2) 壓縮一個文件,并保留源文件:
    gzip –c a > a.gz
    3) 提高壓縮率:gzip –9 file
    注:壓縮等級可以從1-9,數字越大壓縮效果越好,但要花的時間也越長,默認值為6。
    4) 解壓縮:
    gzip –d file.gz 或
    gunzip file.gz

    5) 顯示詳細信息:
    gzip –v file
    6) 顯示版本信息:
    gzip –V

    2.bzip2和bunzip2
    壓縮包擴展名:“.bz2”
    特點:
    1)它采用了新的壓縮演算法,壓縮效果比傳統的LZ77/LZ78壓縮演算法來得好;
    2)若沒有加上任何參數,生成壓縮文件后,會刪除原始文件;
    命令使用:
    1) 壓縮一個文件:
    bzip2 file 這樣將生成file.bz2,刪除原文件file;
    2) 壓縮一個文件,并保留源文件:
    bzip2 –k file
    3) 提高壓縮率:bzip –9 file
    注:壓縮等級可以從1-9,數字越大壓縮效果越好,但要花的時間也越長。
    4) 解壓縮:
    bzip2 –d file.bz2 或
    bunzip2 file.bz2
    5) 顯示詳細信息:
    bzip2 –v file
    6) 顯示版本信息:
    bzip2 –V
    相關工具:
    如果用bzip2壓縮的文件出錯的話,你可以嘗試使用bzip2recover來恢復:
    bzip2recover file-bad.bz2

    3.compress和uncompress
    壓縮包擴展名:“.Z”
    特點:
    1)它是一個歷史悠久的壓縮程序,在許多UNIX系統中都可以找到;
    2)默認情況下,生成壓縮文件后,會刪除原始文件。
    命令使用:
    1) 壓縮一個文件:
    compress file
    2) 壓縮一個文件,并保留源文件:
    compress –c a > a.Z
    3) 提高壓縮率:compress –b9 file
    注:壓縮等級可以從9-16,數字越大壓縮效果越好,但要花的時間也越長。預設值是16。
    4) 解壓縮:
    compress –d file.Z 或
    uncompress a.Z
    5) 顯示詳細信息:
    compress –v file
    6) 顯示版本信息:
    compress –V

    4.zip和unzip
    壓縮包擴展名:“.zip”
    特點:
    1)它是一個使用廣泛的壓縮程序,其版本橫跨十多種操作系統與硬件結構平臺;
    2)默認情況下,生成壓縮文件后,不會刪除原始文件。
    命令使用:
    1) 壓縮一個文件:
    注意:如果要壓縮的是個文件夾,則要加上-r參數,表示調用遞歸壓縮,如:
    zip -r temp.zip temp
    zip zipfile file (zipfile是壓縮后的文件名,file要壓縮的文件名)
    2) 壓縮一個文件,并刪除源文件:
    zip –m file
    3) 提高壓縮率:zip –9 file
    注:壓縮等級可以從1-9,數字越大壓縮效果越好,但要花的時間也越長。預設值是6。
    4) 解壓縮:
    zip –d file.zip 或
    unzip file.zip
    5) 顯示詳細信息:
    zip –v file
    6) 顯示版本信息:
    zip –V
    相關工具:
    在Linux中,還提供了一個叫zipinfo的工具,能夠察看zip壓縮文件的詳細信息:
    zipinfo file.zip


    三、其它壓縮/解壓縮工具

    除了這四對壓縮/解壓縮工具外,在Linux下還有以下三種壓縮/解壓縮工具:

    1.lha
    lha是從lharc演變而來的壓縮程序,文件經它壓縮后,會產生一個具有“.lzh”的擴展名。使用起來還是比較簡單的,而且它是可以直接將一個目錄打包的:
    1) 壓縮一個文件:
    lha –a lhzfile file (lhzfile是壓縮后的文件名,file要壓縮的文件名)
    2) 解壓縮:
    lha –xiw=/tmp lhzfile (其中/tmp是解壓縮后的存放目錄,lhzfile是壓縮文件名)
    3) 壓縮一個目錄:
    lha –a lhzfile directory

    2.gzexe
    這是一個十分特殊的壓縮工具,它用來壓縮可執行文件。當您執行被gzexe壓縮過的可執行文件時,該文件會自動解壓后繼續執行,和執行一般的可執行文件一樣。
    當然這一過程會多占用一些系統資源,只有你的可用磁盤空間十分有限時才建議使用。
    1) 壓縮
    gzexe program
    這樣會生成一個program~,為的是萬一壓縮失敗還能夠恢復,當你確定壓縮后可以使用后,應刪掉它,否則不就白壓縮了嗎?
    2) 解壓縮
    gzexe –d program

    3.unarj
    如果你有一些用arj壓縮的包的話,你可以使用unarj解開它,不過它只能夠解,卻無法執行壓縮。在Linux沒有提供arj壓縮工具。
    解壓時,很簡單:unarj e arjfile
    posted @ 2010-07-13 11:28 xzc 閱讀(540) | 評論 (0)編輯 收藏
    tar命令
    [root@linux ~]# tar [-cxtzjvfpPN] 文件目錄 ....
    參數
    -c :建立一個壓縮文件的參數指令(create 的意思);
    -x :解開一個壓縮文件的參數指令!
    -t :查看 tarfile 里面的文件!
    特別注意,在參數的下達中, c/x/t 僅能存在一個!不可同時存在!
    因為不可能同時壓縮與解壓縮。
    -z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
    -j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
    -v :壓縮的過程中顯示文件!這個常用,但不建議用在背景執行過程!
    -f :使用檔名,請留意,在 f 之后要立即接檔名喔!不要再加參數!
       例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法,要寫成
       『 tar -zcvPf tfile sfile』才對喔!
    -p :使用原文件的原來屬性(屬性不會依據使用者而變)
    -P :可以使用絕對路徑來壓縮!
    -N :比后面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的文件中!
    --exclude FILE:在壓縮的過程中,不要將 FILE 打包!

    范例:
    范例一:將整個 /etc 目錄下的文件全部打包成為 /tmp/etc.tar
    [root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
    [root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 壓縮
    [root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 壓縮
    # 特別注意,在參數 f 之后的文件檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
    # 如果加 z 參數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
    # 如果加 j 參數,則以 .tar.bz2 來作為附檔名啊~
    # 上述指令在執行的時候,會顯示一個警告訊息:
    # 『tar: Removing leading `/' from member names』那是關於絕對路徑的特殊設定。
    范例二:查閱上述 /tmp/etc.tar.gz 文件內有哪些文件?
    [root@linux ~]# tar -ztvf /tmp/etc.tar.gz
    # 由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的文件時,
    # 就得要加上 z 這個參數了!這很重要的!

    范例三:將 /tmp/etc.tar.gz 文件解壓縮在 /usr/local/src 底下
    [root@linux ~]# cd /usr/local/src
    [root@linux src]# tar -zxvf /tmp/etc.tar.gz
    # 在預設的情況下,我們可以將壓縮檔在任何地方解開的!以這個范例來說,
    # 我先將工作目錄變換到 /usr/local/src 底下,并且解開 /tmp/etc.tar.gz ,
    # 則解開的目錄會在 /usr/local/src/etc 呢!另外,如果您進入 /usr/local/src/etc
    # 則會發現,該目錄下的文件屬性與 /etc/ 可能會有所不同喔!

    范例四:在 /tmp 底下,我只想要將 /tmp/etc.tar.gz 內的 etc/passwd 解開而已
    [root@linux ~]# cd /tmp
    [root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
    # 我可以透過 tar -ztvf 來查閱 tarfile 內的文件名稱,如果單只要一個文件,
    # 就可以透過這個方式來下達!注意到! etc.tar.gz 內的根目錄 / 是被拿掉了!

    范例五:將 /etc/ 內的所有文件備份下來,并且保存其權限!
    [root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
    # 這個 -p 的屬性是很重要的,尤其是當您要保留原本文件的屬性時!

    范例六:在 /home 當中,比 2005/06/01 新的文件才備份
    [root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

    范例七:我要備份 /home, /etc ,但不要 /home/dmtsai
    [root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

    范例八:將 /etc/ 打包后直接解開在 /tmp 底下,而不產生文件!
    [root@linux ~]# cd /tmp
    [root@linux tmp]# tar -cvf - /etc | tar -xvf -
    # 這個動作有點像是 cp -r /etc /tmp 啦~依舊是有其有用途的!
    # 要注意的地方在於輸出檔變成 - 而輸入檔也變成 - ,又有一個 | 存在~
    # 這分別代表 standard output, standard input 與管線命令啦!
    # 這部分我們會在 Bash shell 時,再次提到這個指令跟大家再解釋啰!




    gzip, zcat 命令
    [root@linux ~]# gzip [-cdt#] 檔名
    [root@linux ~]# zcat 檔名.gz
    參數:
    -c :將壓縮的資料輸出到螢幕上,可透過資料流重導向來處理;
    -d :解壓縮的參數;
    -t :可以用來檢驗一個壓縮檔的一致性~看看文件有無錯誤;
    -# :壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!預設是 -6 ~
    范例:
    范例一:將 /etc/man.config 複制到 /tmp ,并且以 gzip 壓縮
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp /etc/man.config .
    [root@linux tmp]# gzip man.config
    # 此時 man.config 會變成 man.config.gz !
    范例二:將范例一的文件內容讀出來!
    [root@linux tmp]# zcat man.config.gz
    # 此時螢幕上會顯示 man.config.gz 解壓縮之后的文件內容!!

    范例三:將范例一的文件解壓縮
    [root@linux tmp]# gzip -d man.config.gz

    范例四:將范例三解開的 man.config 用最佳的壓縮比壓縮,并保留原本的文件
    [root@linux tmp]# gzip -9 -c man.config > man.config.gz



    bzip2, bzcat 命令
    [root@linux ~]# bzip2 [-cdz] 檔名
    [root@linux ~]# bzcat 檔名.bz2
    參數:
    -c :將壓縮的過程產生的資料輸出到螢幕上!
    -d :解壓縮的參數
    -z :壓縮的參數
    -# :與 gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最快!
    范例:
    范例一:將剛剛的 /tmp/man.config 以 bzip2 壓縮
    [root@linux tmp]# bzip2 -z man.config
    # 此時 man.config 會變成 man.config.bz2 !
    范例二:將范例一的文件內容讀出來!
    [root@linux tmp]# bzcat man.config.bz2
    # 此時螢幕上會顯示 man.config.bz2 解壓縮之后的文件內容!!

    范例三:將范例一的文件解壓縮
    [root@linux tmp]# bzip2 -d man.config.bz2

    范例四:將范例三解開的 man.config 用最佳的壓縮比壓縮,并保留原本的文件
    [root@linux tmp]# bzip2 -9 -c man.config > man.config.bz2



    compress 命令
    [root@linux ~]# compress [-dcr] 文件或目錄
    參數:
    -d :用來解壓縮的參數
    -r :可以連同目錄下的文件也同時給予壓縮呢!
    -c :將壓縮資料輸出成為 standard output (輸出到螢幕)

    范例:
    范例一:將 /etc/man.config 複制到 /tmp ,并加以壓縮
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp /etc/man.config .
    [root@linux tmp]# compress man.config
    [root@linux tmp]# ls -l
    -rw-r--r-- 1 root root 2605 Jul 27 11:43 man.config.Z
    范例二:將剛剛的壓縮檔解開
    [root@linux tmp]# compress -d man.config.Z

    范例三:將 man.config 壓縮成另外一個文件來備份
    [root@linux tmp]# compress -c man.config > man.config.back.Z
    [root@linux tmp]# ll man.config*
    -rw-r--r-- 1 root root 4506 Jul 27 11:43 man.config
    -rw-r--r-- 1 root root 2605 Jul 27 11:46 man.config.back.Z
    # 這個 -c 的參數比較有趣!他會將壓縮過程的資料輸出到螢幕上,而不是寫入成為
    # file.Z 文件。所以,我們可以透過資料流重導向的方法將資料輸出成為另一個檔名。
    # 關於資料流重導向,我們會在 bash shell 當中詳細談論的啦!



    dd 命令
    [root@linux ~]# dd if="input_file" of="outptu_file" bs="block_size" \
    count="number"
    參數:
    if :就是 input file 啰~也可以是裝置喔!
    of :就是 output file 喔~也可以是裝置;
    bs :規劃的一個 block 的大小,如果沒有設定時,預設是 512 bytes
    count:多少個 bs 的意思。
    范例:
    范例一:將 /etc/passwd 備份到 /tmp/passwd.back 當中
    [root@linux ~]# dd if=/etc/passwd of=/tmp/passwd.back
    3+1 records in
    3+1 records out
    [root@linux ~]# ll /etc/passwd /tmp/passwd.back
    -rw-r--r-- 1 root root 1746 Aug 25 14:16 /etc/passwd
    -rw-r--r-- 1 root root 1746 Aug 29 16:57 /tmp/passwd.back
    # 仔細的看一下,我的 /etc/passwd 文件大小為 1746 bytes,因為我沒有設定 bs ,
    # 所以預設是 512 bytes 為一個單位,因此,上面那個 3+1 表示有 3 個完整的
    # 512 bytes,以及未滿 512 bytes 的另一個 block 的意思啦!
    # 事實上,感覺好像是 cp 這個指令啦~

    范例二:備份 /dev/hda 的 MBR
    [root@linux ~]# dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1
    1+0 records in
    1+0 records out
    # 這就得好好瞭解一下啰~我們知道整顆硬盤的 MBR 為 512 bytes,
    # 就是放在硬盤的第一個 sector 啦,因此,我可以利用這個方式來將
    # MBR 內的所有資料都紀錄下來,真的很厲害吧! ^_^

    范例三:將整個 /dev/hda1 partition 備份下來。
    [root@linux ~]# dd if=/dev/hda1 of=/some/path/filenaem
    # 這個指令很厲害啊!將整個 partition 的內容全部備份下來~
    # 后面接的 of 必須要不是在 /dev/hda1 的目錄內啊~否則,怎么讀也讀不完~
    # 這個動作是很有效用的,如果改天你必須要完整的將整個 partition 的內容填回去,
    # 則可以利用 dd if=/some/file of=/dev/hda1 來將資料寫入到硬盤當中。
    # 如果想要整個硬盤備份的話,就類似 Norton 的 ghost 軟體一般,
    # 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厲害厲害!



    cpio 命令
    [root@linux ~]# cpio -covB > [file|device] <==備份
    [root@linux ~]# cpio -icduv < [file|device] <==還原
    參數:
    -o :將資料 copy 輸出到文件或裝置上
    -i :將資料自文件或裝置 copy 出來系統當中
    -t :查看 cpio 建立的文件或裝置的內容
    -c :一種較新的 portable format 方式儲存
    -v :讓儲存的過程中文件名稱可以在螢幕上顯示
    -B :讓預設的 Blocks 可以增加至 5120 bytes ,預設是 512 bytes !
       這樣的好處是可以讓大文件的儲存速度加快(請參考 i-nodes 的觀念)
    -d :自動建立目錄!由於 cpio 的內容可能不是在同一個目錄內,
    如此的話在反備份的過程會有問題! 這個時候加上 -d 的話,
    就可以自動的將需要的目錄建立起來了!
    -u :自動的將較新的文件覆蓋較舊的文件!
    范例:
    范例一:將所有系統上的資料通通寫入磁帶機內!
    [root@linux ~]# find / -print | cpio -covB > /dev/st0
    # 一般來說,使用 SCSI 介面的磁帶機,代號是 /dev/st0 喔!
    范例二:檢查磁帶機上面有什么文件?
    [root@linux ~]# cpio -icdvt < /dev/st0
    [root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content
    # 第一個動作當中,會將磁帶機內的檔名列出到螢幕上面,而我們可以透過第二個動作,
    # 將所有的檔名通通紀錄到 /tmp/content 文件去!

    范例三:將磁帶上的資料還原回來~
    [root@linux ~]# cpio -icduv < /dev/st0
    # 一般來說,使用 SCSI 介面的磁帶機,代號是 /dev/st0 喔!

    范例四:將 /etc 底下的所有『文件』都備份到 /root/etc.cpio 中!
    [root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio
    # 這樣就能夠備份啰~您也可以將資料以 cpio -i < /root/etc.cpio
    # 來將資料捉出來!!!!
    posted @ 2010-07-12 16:47 xzc 閱讀(241) | 評論 (0)編輯 收藏

    一.tar命令

             tar可以為文件和目錄創建檔案。利用tar,用戶可以為某一特定文件創建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。tar 最初被用來在磁帶上創建檔案,現在,用戶可以在任何設備上創建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對于備份文 件或將幾個文件組合成為一個文件以便于網絡傳輸是非常有用的。Linux上的tar是GNU版本的。

    語法:tar [主選項+輔選項] 文件或者目錄

    使用該命令時,主選項是必須要有的,它告訴tar要做什么事情,輔選項是輔助使用的,可以選用。

    主選項:

    c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。
    r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經作好備份文件,又發現還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。
    t 列出檔案文件的內容,查看已經備份了哪些文件。
    u 更新文件。就是說,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最后。
    x 從檔案文件中釋放文件。

    輔助選項:
    b 該選項是為磁帶機設定的。其后跟一數字,用來說明區塊的大小,系統預設值為20(20*512 bytes)。
    f 使用檔案文件或設備,這個選項通常是必選的。
    k 保存已經存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。
    m 在還原文件時,把所有文件的修改時間設定為現在。
    M 創建多卷的檔案文件,以便在幾個磁盤中存放。
    v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。
    w 每一步都要求確認。
    z 用gzip來壓縮/解壓縮文件,加上該選項后可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。


    二.Linux下的壓縮文件剖析
             對于剛剛接觸Linux的人來說,一定會給Linux下一大堆各式各樣的文件名 給搞暈。別個不說,單單就壓縮文件為例,我們知道在Windows下最常見的壓縮文件就只有兩種,一是,zip,另一個是.rar。可是Linux就不同 了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等眾多的壓縮文件名,此外windows下的.zip和.rar也可以在Linux下使 用,不過在Linux使用.zip和.rar的人就太少了。本文就來對這些常見的壓縮文件進行一番小結,希望你下次遇到這些文件時不至于被搞暈:)

       在具體總結各類壓縮文件之前,首先要 弄清兩個概念:打包和壓縮。打包是指將一大堆文件或目錄什么的變成一個總的文件,壓縮則是將一個大的文件通過一些壓縮算法變成一個小文件。為什么要區分這 兩個概念呢?其實這源于Linux中的很多壓縮程序只能針對一個文件進行壓縮,這樣當你想要壓縮一大堆文件時,你就得先借助另外的工具將這一大堆文件先打 成一個包,然后再就原來的壓縮程序進行壓縮。

      Linux下最常用的打包程序就是tar了,使用tar程序打出來的包我們常稱為tar包,tar包文件的命令通常都是以.tar結尾的。生成tar包后,就可以用其它的程序來進行壓縮了,所以首先就來講講tar命令的基本用法:

      tar命令的選項有很多(用man tar可以查看到),但常用的就那么幾個選項,下面來舉例說明一下:
      # tar -cf all.tar *.jpg
      這條命令是將所有.jpg的文件打成一個名為all.tar的包。-c是表示產生新的包,-f指定包的文件名。
      # tar -rf all.tar *.gif
      這條命令是將所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
            # tar -uf all.tar logo.gif
      這條命令是更新原來tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

      # tar -tf all.tar
      這條命令是列出all.tar包中所有文件,-t是列出文件的意思
      # tar -xf all.tar
      這條命令是解出all.tar包中所有文件,-x是解包的意思
      以上就是tar的最基本的用法。為了方便用戶在打包解包的同時可以壓縮或解壓文件,tar提供了一種特殊的功能。這就是tar可以在打包或解包的同時調用其它的壓縮程序,比如調用gzip、bzip2等。
      1) tar調用gzip
      gzip是GNU組織開發的一個壓縮程序,.gz結尾的文件就是gzip壓縮的結果。與gzip相對的解壓程序是gunzip。tar中使用-z這個參數來調用gzip。下面來舉例說明一下:
      # tar -czf all.tar.gz *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且將其用gzip壓縮,生成一個gzip壓縮過的包,包名為all.tar.gz
      # tar -xzf all.tar.gz
      這條命令是將上面產生的包解開。
      2) tar調用bzip2
      bzip2是一個壓縮能力更強的壓縮程序,.bz2結尾的文件就是bzip2壓縮的結果。與bzip2相對的解壓程序是bunzip2。tar中使用-j這個參數來調用bzip2。下面來舉例說明一下:
      # tar -cjf all.tar.bz2 *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且調用bzip2壓縮,生成一個bzip2壓縮過的包,包名為all.tar.bz2
      # tar -xjf all.tar.bz2
      這條命令是將上面產生的包解開。
        3)tar調用compress


    compress也是一個壓縮程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z結尾的文件就是bzip2壓縮的結果。與compress相對的解壓程序是uncompress。tar中使用-Z這個參數來調用gzip。下面來舉例說明一下:

      # tar -cZf all.tar.Z *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且調用compress壓縮,生成一個uncompress壓縮過的包,包名為all.tar.Z
      # tar -xZf all.tar.Z
      這條命令是將上面產生的包解開
      有了上面的知識,你應該可以解開多種壓縮文件了,下面對于tar系列的壓縮文件作一個小結:
      1)對于.tar結尾的文件
      tar -xf all.tar
      2)對于.gz結尾的文件
      gzip -d all.gz
      gunzip all.gz
      3)對于.tgz或.tar.gz結尾的文件
      tar -xzf all.tar.gz
      tar -xzf all.tgz
      4)對于.bz2結尾的文件
      bzip2 -d all.bz2
      bunzip2 all.bz2
      5)對于tar.bz2結尾的文件
      tar -xjf all.tar.bz2
      6)對于.Z結尾的文件
      uncompress all.Z
      7)對于.tar.Z結尾的文件
      tar -xZf all.tar.z
      另外對于Window下的常見壓縮文件.zip和.rar,Linux也有相應的方法來解壓它們:
      1)對于.zip
      linux下提供了zip和unzip程序,zip是壓縮程序,unzip是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
      # zip all.zip *.jpg
      這條命令是將所有.jpg的文件壓縮成一個zip包

          注意:如果要壓縮的是個文件夾,則要加上-r參數,表示調用遞歸壓縮,如:

          zip -r temp.zip temp


            # unzip all.zip
      這條命令是將all.zip中的所有文件解壓出來

      2)對于.rar
      要在linux下處理.rar文件,需要安裝RAR for Linux,可以從網上下載,但要記住,RAR for Linux
    不是免費的;然后安裝:
      # tar -xzpvf rarlinux-3.2.0.tar.gz
      # cd rar
      # make
      這樣就安裝好了,安裝后就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
      # rar a all *.jpg
      這條命令是將所有.jpg的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名后。
      # unrar e all.rar
      這條命令是將all.rar中的所有文件解壓出來
       到此為至,我們已經介紹過linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你應該已經能夠使用它們對.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar這10種壓縮文件進行解壓了,以后應該不需要為下載了一個軟件而不知道如何在Linux下解開而煩惱了。而且以上方 法對于Unix也基本有效。
      本文介紹了linux下的壓縮程式tar、gzip、gunzip、bzip2、bunzip2、 compress、uncompress、zip、unzip、rar、unrar等程式,以及如何使用它們對.tar、.gz、.tar.gz、. tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar這10種壓縮文件進行操作。

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hbcui1984/archive/2007/04/25/1583796.aspx

    posted @ 2010-07-12 16:42 xzc 閱讀(7200) | 評論 (0)編輯 收藏

    6.2.1 Pfile文件
        Pfile(Parameter File)文件是基于文本格式的參數文件,含有數據庫的配置參數。
        Oracle 9i在安裝時為每個數據庫建立了一個Pfile,默認的名稱為“init+例程名.ora”,這是一個文本文件,可以用任何文本編輯工具打開。
    表6.1 數據庫的初始化參數文件分析

    內容 說明
    # Copyright (c) 1991, 2001 by Oracle Corporation Oracle公司版權標識
    # MTS 多線程服務器配置標識,在Oracle 9i里稱為共享服務器配置

    dispatchers="(PROTOCOL=TCP)(SER=MODOSE)", "(PROTOCOL=TCP)
    (PRE=oracle.aurora.server.GiopServer)", "(PROTOCOL=TCP)
    (PRE=oracle.aurora.server.SGiopServer)"

    多線程服務器配置
    # 其他 配置其他參數
    compatible=9.0.0 兼容版本9.0.0
    db_name=myoracle 數據庫名稱為myoracle
    # 分布式, 復制和快照 配置分布式、復制和快照參數
    db_domain=mynet 數據庫域名為mynet,加上數據庫名稱db_name構成全局數據庫名稱
    remote_login_passwordfile=EXCLUSIVE 指定操作系統或口令文件是否具有檢查用戶口令的權限。設置為EXCLUSIVE, 將使用數據庫的口令文件對每個具有權限的用戶進行驗證。
    # 排序, 散列聯接, 位圖索引 配置排序、散列聯接、位圖索引參數
    sort_area_size=524288 指定排序區使用的最大內存量為512KB。排序完成后, 各行將返回, 并且內存將釋放。增大該值可以提高大型排序的效率。
    # 文件配置 文件配置參數
    control_files=("C:\oracle\oradata\myoracle\CONTROL01.CTL",
    "C:\oracle\oradata\myoracle\CONTROL02.CTL",
    "C:\oracle\oradata\myoracle\CONTROL03.CTL")
    指定控制文件的路徑及文件名
    # 池 內存配置參數
    Java_pool_size=33554432 指定Java存儲池的大小為32MB,用于存儲 Java 的方法、類定義和Java對象。
    large_pool_size=1048576 指定大型池的大小為1MB, 用于共享服務器的會話內存、并行執行的消息緩沖區以及RMAN備份和恢復的磁盤 I/O 緩沖區。
    shared_pool_size=33554432 指定共享池的大小為32MB,用于存儲共享游標、存儲的過程、控制結構和并行執行消息緩沖區等對象。較大的值能改善多用戶系統的性能
    # 游標和庫高速緩存 配置游標和高速緩存參數
    open_cursors=300 指定一個會話一次可以打開的游標的最大數量為300,應將該值設置得足夠高,這樣才能防止應用程序耗盡打開的游標
    # 系統管理的撤消和回退段 配置系統管理撤消和回滾段參數
    undo_management=AUTO 指定系統使用的撤消空間管理方式為SMU 方式,在SMU方式下, 撤消空間會像撤消表空間一樣在外部分配
    undo_tablespace=UNDOTBS 指定回滾表空間為UNDOTBS
    # 網絡注冊 配置網絡注冊參數
    instance_name=myoracle 例程名稱為myoracle
    # 診斷和統計 配置診斷和統計參數
    background_dump_dest=C:\oracle\admin\myoracle\bdump 后臺進程跟蹤文件目錄
    core_dump_dest=C:\oracle\admin\myoracle\cdump 核心轉儲跟蹤文件目錄
    timed_statistics=TRUE 收集操作系統的計時信息,這些信息可被用來優化數據庫和 SQL 語句
    user_dump_dest=C:\oracle\admin\myoracle\udump 用戶進程跟蹤文件目錄
    # 進程和會話 配置進程和會話信息
    processes=150 指定可同時連接到一個Oracle Server上的操作系統用戶進程的最大數量為150
    # 重做日志和恢復 重做日志和恢復參數設置
    Fast_start_mttr_target=300 指定從單個數據庫例程崩潰中恢復所需的時間為300秒
    # 高速緩存和 I/O 配置高速緩存和I/O參數
    db_block_size=4096 指定數據塊大小為4KB
    db_cache_size=33554432 指定數據緩沖區為32MB,該值越大,可以減少對數據庫文件的I/O次數,提高效率

    6.2.2 SPfile文件
        SPfile(Server Parameter File,服務器參數文件)是基于二進制格式的參數文件,含有數據庫及例程的參數和數值,但不能用文本編輯工具打開。
        下面對兩種初始化參數文件進行比較如表6.2所示。
    表6.2 Spfile和Pfile文件的比較

    比較內容 SPfile Pfile
    格式 二進制格式 文本格式
    編輯方式 (1)利用企業管理器對Pfile進行修改,然后轉換為Spfile (2)在SQL Plus里使用ALTER SYSTEM語句進行修改 (1)利用文本工具直接進行修改 (2)在企業管理器里修改配置后導出形成
    默認名稱 SPfile+例程名.ora Init+例程名.ora 實際參數文件Init.ora
    默認路徑 Oracle\ora90\database\ Oracle\ora90\database\ Init.ora位于Oracle\admin\數據庫例程名\pfile\
    啟動次序 SPfile優先于Pfile Pfile低于Spfile
    posted @ 2010-06-28 10:43 xzc 閱讀(160) | 評論 (0)編輯 收藏
    僅列出標題
    共32頁: First 上一頁 12 13 14 15 16 17 18 19 20 下一頁 Last 
    主站蜘蛛池模板: 亚洲第一成年免费网站| 两性色午夜视频免费网| AV大片在线无码永久免费| 亚洲精品国产成人| 又大又硬又爽又粗又快的视频免费| 中文亚洲AV片不卡在线观看| av网站免费线看| 久久精品亚洲视频| 亚洲一区二区三区免费观看| 亚洲人成影院午夜网站| 歪歪漫画在线观看官网免费阅读| 亚洲最大天堂无码精品区| 天天拍拍天天爽免费视频| 亚洲国产欧洲综合997久久| 国产乱色精品成人免费视频| 一级免费黄色大片| 亚洲AV无码成人网站久久精品大 | 风间由美在线亚洲一区| 亚洲av无码国产精品色在线看不卡| 三级片免费观看久久| 亚洲桃色AV无码| 久草视频免费在线观看| 亚洲午夜无码毛片av久久京东热 | 国产午夜亚洲精品理论片不卡| 久99久无码精品视频免费播放| 国产精品亚洲A∨天堂不卡| 免费A级毛片无码视频| 中文字幕亚洲精品无码| 五月婷婷亚洲综合| 午夜网站在线观看免费完整高清观看 | 美女无遮挡拍拍拍免费视频| 久久久久久亚洲精品中文字幕| 99爱在线精品免费观看| 亚洲av片在线观看| 亚洲欧洲日韩不卡| 在线看片无码永久免费aⅴ| 成人免费ā片在线观看| 亚洲va在线va天堂va手机| 免费二级毛片免费完整视频| 亚洲视频在线观看免费| 亚洲AV噜噜一区二区三区|