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

          Flashback query(閃回查詢)原理

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

          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),該參數(shù)默認設置為:auto

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

          SQL> alter system set undo_retention = 3600;

          System altered

          閃回實現(xiàn)方式

          1.      獲取數(shù)據(jù)刪除前的一個時間點或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)的數(shù)據(jù),如下:

          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.      將查詢到的數(shù)據(jù),新增到表中。也可用更直接的方法,如:

          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表中的原始數(shù)據(jù)

          SQL> select * from t;

                 ID

          ---------

                  1

                  2

                  3

                  4

                  5

          2.獲取數(shù)據(jù)刪除前的一個時間點或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表中的數(shù)據(jù),并提交事物

          SQL> delete from t;

          5 rows deleted

          SQL> commit;

          Commit complete

          4.在查看t表,此時t表中數(shù)據(jù)以刪除

          SQL> select * from t;

                 ID

          ----------

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

          SQL> select * from t as of scn 1061279;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

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

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

          5 rows inserted

          SQL> commit;

          Commit complete

          7.確認t表數(shù)據(jù)的還原情況

          SQL> select * from t;

                 ID

          ----------

                  1

                  2

                  3

                  4

                  5

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

          Falshback query查詢的局限:

          1. 不能Falshback5天以前的數(shù)據(jù)。

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

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

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

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

          SQL>grant execute on dbms_flashback to scott;

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

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

          原理:

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

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

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

          特性:

          1.  在線操作

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

          3.  自動恢復相關屬性

          4.  滿足分布式的一致性

          5.  數(shù)據(jù)的一致性,所有相關對象將自動一致。

          語法:

           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的系統(tǒng)權限。命令如:

            SQL>grant flashback any table to scott;

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

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

          示例:

           1.創(chuàng)建tab_test表

          SQL> create table tab_test as select * from all_objects;

          Table created

          2.查詢tab_test表中數(shù)據(jù)量

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

              40699

          3.為tab_test表創(chuàng)建索引和觸發(fā)器(觸發(fā)器為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表中數(shù)據(jù)

          SQL> delete from tab_test;

          40699 rows deleted

          SQL> commit;

          Commit complete

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

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

          7.刪除tab_test表中索引ind_test

          SQL> drop index ind_test;

          Index dropped

          8.更改tr_test觸發(fā)器

          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),由于表中存在觸發(fā)器,因此使用了關鍵字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在真正的高可用環(huán)境中,使用意義不大,受限比較多,要必須確保行遷移功能

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

          3. 表中數(shù)據(jù)能恢復,而表中索引確不能正常恢復

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

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

          6. 恢復數(shù)據(jù)用flashback query實現(xiàn)比較好

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

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

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

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

          通過查詢相關的資料,發(fā)現(xiàn)解決方案有如下幾種:
          一、重建臨時表空間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.創(chuàng)建中轉臨時表空間
          create temporary tablespace TEMP1 TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M

          MAXSIZE UNLIMITED;
          2.改變缺省臨時表空間 為剛剛創(chuàng)建的新臨時表空間temp1
          alter database default temporary tablespace temp1;
          3.刪除原來臨時表空間
          drop tablespace temp including contents and datafiles;
          4.重新創(chuàng)建臨時表空間
          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;

          以上的方法只是暫時釋放了臨時表空間的磁盤占用空間,是治標但不是治本的方法,真正的治本的方法是找出數(shù)據(jù)庫中消耗資源比較大的sql語句,然后對其進行優(yōu)化處理。下面是查詢在sort排序區(qū)使用的執(zhí)行耗時的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;),如果是文件系統(tǒng)可以看看文件的時間戳。
          我們可以刪除該表空間:如果原臨時表空間還有用戶在使用,你是刪除不了這個表空間的!在一次生產(chǎn)環(huán)境的臨時表空間切換中,原臨時表空間始終有用戶在上面,即使我關閉了前臺程序,也還是有用戶,新的臨時表空間已經(jīng)沒有用戶在使用了。我估計用戶進程已經(jīng)死在原臨時表空間了,后來只有重新啟動數(shù)據(jù)庫才能把原來舊的臨時表空間給刪除。

          二、修改參數(shù)(這個方案緊適用于8i及8i以下的版本)
          修改一下TEMP表空間的storage參數(shù),讓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以后只能創(chuàng)建本地管理的表空間。
          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、 執(zhí)行清理操作
           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臨時表空間主要是用來做查詢和存放一些緩存的數(shù)據(jù)的,磁盤消耗的一個主要原因是需要對查詢的結果進行排序,如果沒有猜錯的話,在磁盤空間的(內存)的分配上,Oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那么臨時表空間就是1GB,如果還有增長,那么依此類推,臨時表空間始終保持在一個最大的上限。Oracle臨時表空間暴漲的現(xiàn)象經(jīng)過分析可能是以下幾個方面的原因造成的。
                  1. 沒有為臨時表空間設置上限,而是允許無限增長。但是如果設置了一個上限,最后可能還是會面臨因為空間不夠而出錯的問題,臨時表空間設置太小會影響性能,臨時表空間過大同樣會影響性能,至于需要設置為多大需要仔細的測試。
                  2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據(jù)查詢的字段和表的個數(shù)會生成一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的字段過多和數(shù)據(jù)過大,那么就會消耗非常大的臨時表空間。
                 3.對查詢的某些字段沒有建立索引。Oracle中,如果表沒有索引,那么會將所有的數(shù)據(jù)都復制到臨時表空間,而如果有索引的話,一般只是將索引的數(shù)據(jù)復制到臨時表空間中。
                 針對以上的分析,對查詢的語句和索引進行了優(yōu)化,情況得到緩解,但是需要進一步測試。

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

          如果臨時表空間是temporary的,空間不會釋放,只是在sort結束后被標記為free的,如果是permanent的,由SMON負責在sort結束后釋放,都不用去手工釋放的。查看有哪些用戶和SQL導致TEMP增長的兩個重要視圖:
          v$sort_usage和v$sort_segment
          對于非LMT管理方式的TEMP表空間,最簡單的方法是Metalink給出的一個方法:
          修改一下TEMP表空間的storage參數(shù),讓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;),如果是文件系統(tǒng)可以看看文件的時間戳。

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

          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; --將表空間的內容和數(shù)據(jù)文件一起刪除。

          下面是查詢在sort排序區(qū)使用的執(zhí)行耗時的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 閱讀(2911) | 評論 (2)編輯 收藏
          此文從以下幾個方面來整理關于分區(qū)表的概念及操作:
                  1.表空間及分區(qū)表的概念
                  2.表分區(qū)的具體作用
                  3.表分區(qū)的優(yōu)缺點
                  4.表分區(qū)的幾種類型及操作方法
                  5.對表分區(qū)的維護性操作.
          (1.) 表空間及分區(qū)表的概念
          表空間:
            是一個或多個數(shù)據(jù)文件的集合,所有的數(shù)據(jù)對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。
           
          分區(qū)表:
          當表中的數(shù)據(jù)量不斷增大,查詢數(shù)據(jù)的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區(qū)。表進行分區(qū)后,邏輯上表仍然是一張完整的表,只是將表中的數(shù)據(jù)在物理上存放到多個表空間(物理文件上),這樣查詢數(shù)據(jù)時,不至于每次都掃描整張表。
           
          ( 2).表分區(qū)的具體作用
          Oracle的表分區(qū)功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區(qū)可以使某些查詢以及維護操作的性能大大提高。此外,分區(qū)還可以極大簡化常見的管理任務,分區(qū)是構建千兆字節(jié)數(shù)據(jù)系統(tǒng)或超高可用性系統(tǒng)的關鍵工具。
           
          分區(qū)功能能夠將表、索引或索引組織表進一步細分為段,這些數(shù)據(jù)庫對象的段叫做分區(qū)。每個分區(qū)有自己的名稱,還可以選擇自己的存儲特性。從數(shù)據(jù)庫管理員的角度來看,一個分區(qū)后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數(shù)據(jù)庫管理員在管理分區(qū)后的對象時有相當大的靈活性。但是,從應用程序的角度來看,分區(qū)后的表與非分區(qū)表完全相同,使用 SQL DML 命令訪問分區(qū)后的表時,無需任何修改。
           
          什么時候使用分區(qū)表:
          1、表的大小超過2GB。
          2、表中包含歷史數(shù)據(jù),新的數(shù)據(jù)被增加都新的分區(qū)中。
           
           (3).表分區(qū)的優(yōu)缺點
          表分區(qū)有以下優(yōu)點:
          1、改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關心的分區(qū),提高檢索速度。
          2、增強可用性:如果表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;
          3、維護方便:如果表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可;
          4、均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能。
           
          缺點:
          分區(qū)表相關:已經(jīng)存在的表沒有方法可以直接轉化為分區(qū)表。不過 Oracle 提供了在線重定義表的功能。
           
          (4).表分區(qū)的幾種類型及操作方法
           一.范圍分區(qū):
          范圍分區(qū)將數(shù)據(jù)基于范圍映射到每一個分區(qū),這個范圍是你在創(chuàng)建分區(qū)時指定的分區(qū)鍵決定的。這種分區(qū)方式是最為常用的,并且分區(qū)鍵經(jīng)常采用日期。舉個例子:你可能會將銷售數(shù)據(jù)按照月份進行分區(qū)。
          當使用范圍分區(qū)時,請考慮以下幾個規(guī)則:
          1、每一個分區(qū)都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區(qū)中的上限值。分區(qū)鍵的任何值等于或者大于這個上限值的記錄都會被加入到下一個高一些的分區(qū)中。
          2、所有分區(qū),除了第一個,都會有一個隱式的下限值,這個值就是此分區(qū)的前一個分區(qū)的上限值。
          3、在最高的分區(qū)中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高于其它分區(qū)中的任何分區(qū)鍵的值,也可以理解為高于任何分區(qū)中指定的VALUE LESS THEN的值,同時包括空值。
          例一:
          假設有一個CUSTOMER表,表中有數(shù)據(jù)200000行,我們將此表通過CUSTOMER_ID進行分區(qū),每個分區(qū)存儲100000行,我們將每個分區(qū)保存到單獨的表空間中,這樣數(shù)據(jù)文件就可以跨越多個物理磁盤。下面是創(chuàng)建表和分區(qū)的代碼,如下:
          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
          );
           
          二.列表分區(qū):
          該分區(qū)的特點是某列的值只有幾個,基于這樣的特點我們可以采用列表分區(qū)。
          例一
          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
          );
          )
           
          三.散列分區(qū):
          這類分區(qū)是在列值上使用散列算法,以確定將行放入哪個分區(qū)中。當列的值沒有合適的條件時,建議使用散列分區(qū)。
          散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使得這些分區(qū)大小一致。
          例一:
          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分區(qū)最主要的機制是根據(jù)hash算法來計算具體某條紀錄應該插入到哪個分區(qū)中,hash算法中最重要的是hash函數(shù),Oracle中如果你要使用hash分區(qū),只需指定分區(qū)的數(shù)量即可。建議分區(qū)的數(shù)量采用2的n次方,這樣可以使得各個分區(qū)間數(shù)據(jù)分布更加均勻。
           
          四.組合范圍散列分區(qū)
          這種分區(qū)是基于范圍分區(qū)和列表分區(qū),表首先按某列進行范圍分區(qū),然后再按某列進行列表分區(qū),分區(qū)之中的分區(qū)被稱為子分區(qū)。
          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
                    )
          )
           
          五.復合范圍散列分區(qū):
          這種分區(qū)是基于范圍分區(qū)和散列分區(qū),表首先按某列進行范圍分區(qū),然后再按某列進行散列分區(qū)。
          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).有關表分區(qū)的一些維護性操作:
          一、添加分區(qū)
          以下代碼給SALES表添加了一個P3分區(qū)
          ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
          注意:以上添加的分區(qū)界限應該高于最后一個分區(qū)界限。
          以下代碼給SALES表的P3分區(qū)添加了一個P3SUB1子分區(qū)
          ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
          二、刪除分區(qū)
          以下代碼刪除了P3表分區(qū):
          ALTER TABLE SALES DROP PARTITION P3;
          在以下代碼刪除了P4SUB1子分區(qū):
          ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
          注意:如果刪除的分區(qū)是表中唯一的分區(qū),那么此分區(qū)將不能被刪除,要想刪除此分區(qū),必須刪除表。
          三、截斷分區(qū)
          截斷某個分區(qū)是指刪除某個分區(qū)中的數(shù)據(jù),并不會刪除分區(qū),也不會刪除其它分區(qū)中的數(shù)據(jù)。當表中即使只有一個分區(qū)時,也可以截斷該分區(qū)。通過以下代碼截斷分區(qū):
          ALTER TABLE SALES TRUNCATE PARTITION P2;
          通過以下代碼截斷子分區(qū):
          ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
          四、合并分區(qū)
          合并分區(qū)是將相鄰的分區(qū)合并成一個分區(qū),結果分區(qū)將采用較高分區(qū)的界限,值得注意的是,不能將分區(qū)合并到界限較低的分區(qū)。以下代碼實現(xiàn)了P1 P2分區(qū)的合并:
          ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
          五、拆分分區(qū)
          拆分分區(qū)將一個分區(qū)拆分兩個新分區(qū),拆分后原來分區(qū)不再存在。注意不能對HASH類型的分區(qū)進行拆分。
          ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
          六、接合分區(qū)(coalesca)
          結合分區(qū)是將散列分區(qū)中的數(shù)據(jù)接合到其它分區(qū)中,當散列分區(qū)中的數(shù)據(jù)比較大時,可以增加散列分區(qū),然后進行接合,值得注意的是,接合分區(qū)只能用于散列分區(qū)中。通過以下代碼進行接合分區(qū):
          ALTER TABLE SALES COALESCA PARTITION;
          七、重命名表分區(qū)
          以下代碼將P21更改為P2
          ALTER TABLE SALES RENAME PARTITION P21 TO P2;
          八、相關查詢
          跨分區(qū)查詢
          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)
          );
          查詢表上有多少分區(qū)
          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
           
          --顯示數(shù)據(jù)庫所有分區(qū)表的信息:
          select * from DBA_PART_TABLES
           
          --顯示當前用戶可訪問的所有分區(qū)表信息:
          select * from ALL_PART_TABLES
           
          --顯示當前用戶所有分區(qū)表的信息:
          select * from USER_PART_TABLES
           
          --顯示表分區(qū)信息 顯示數(shù)據(jù)庫所有分區(qū)表的詳細分區(qū)信息:
          select * from DBA_TAB_PARTITIONS
           
          --顯示當前用戶可訪問的所有分區(qū)表的詳細分區(qū)信息:
          select * from ALL_TAB_PARTITIONS
           
          --顯示當前用戶所有分區(qū)表的詳細分區(qū)信息:
          select * from USER_TAB_PARTITIONS
           
          --顯示子分區(qū)信息 顯示數(shù)據(jù)庫所有組合分區(qū)表的子分區(qū)信息:
          select * from DBA_TAB_SUBPARTITIONS
           
          --顯示當前用戶可訪問的所有組合分區(qū)表的子分區(qū)信息:
          select * from ALL_TAB_SUBPARTITIONS
           
          --顯示當前用戶所有組合分區(qū)表的子分區(qū)信息:
          select * from USER_TAB_SUBPARTITIONS
           
          --顯示分區(qū)列 顯示數(shù)據(jù)庫所有分區(qū)表的分區(qū)列信息:
          select * from DBA_PART_KEY_COLUMNS
           
          --顯示當前用戶可訪問的所有分區(qū)表的分區(qū)列信息:
          select * from ALL_PART_KEY_COLUMNS
           
          --顯示當前用戶所有分區(qū)表的分區(qū)列信息:
          select * from USER_PART_KEY_COLUMNS
           
          --顯示子分區(qū)列 顯示數(shù)據(jù)庫所有分區(qū)表的子分區(qū)列信息:
          select * from DBA_SUBPART_KEY_COLUMNS
           
          --顯示當前用戶可訪問的所有分區(qū)表的子分區(qū)列信息:
          select * from ALL_SUBPART_KEY_COLUMNS
           
          --顯示當前用戶所有分區(qū)表的子分區(qū)列信息:
          select * from USER_SUBPART_KEY_COLUMNS
           
          --怎樣查詢出oracle數(shù)據(jù)庫中所有的的分區(qū)表
          select * from user_tables a where a.partitioned='YES'
           
          --刪除一個表的數(shù)據(jù)是
          truncate table table_name;
           
          --刪除分區(qū)表一個分區(qū)的數(shù)據(jù)是
          alter table table_name truncate partition p5;
          posted @ 2010-07-31 17:53 xzc 閱讀(201) | 評論 (0)編輯 收藏
               摘要: Oracle 分析函數(shù)使用介紹    分析函數(shù)是oracle816引入的一個全新的概念,為我們分析數(shù)據(jù)提供了一種簡單高效的處理方式.在分析函數(shù)出現(xiàn)以前,我們必須使用自聯(lián)查詢,子查詢或者內聯(lián)視圖,甚至復雜的存儲過程實現(xiàn)的語句,現(xiàn)在只要一條簡單的sql語句就可以實現(xiàn)了,而且在執(zhí)行效率方面也有相當大的提高.下面我將針對分析函數(shù)做一些具體的說明. 今天我主要給大家介紹一下以下幾...  閱讀全文
          posted @ 2010-07-29 11:15 xzc 閱讀(173) | 評論 (0)編輯 收藏

          表壓縮是如何工作的

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

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

          1.表級別:

          1.1 創(chuàng)建一個壓縮表:

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

          SQL> create table tmp_test

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

          compress;

          1.2 修改現(xiàn)有表為壓縮表:

          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 創(chuàng)建表壓縮空間:

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

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

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

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

          2.3 確定是否已經(jīng)利用COMPRESS對一個表空間進行了定義,可查詢USER_TABLESPACES數(shù)據(jù)字典視圖并查看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.向一個壓縮的表中加載數(shù)據(jù)

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

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

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

          4.壓縮一個已經(jīng)存在但并未壓縮的表

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

          SQL> alter table tmp_test move compress;

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

          SQL> alter table tmp_test move nocompress;

          5.壓縮一個物化視圖

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

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

          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.壓縮一個已分區(qū)的表

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

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

          SQL> alter table tmp_test move partition create_200606 compress;

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

          SQL>SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;

          7.壓縮表的性能開銷

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

          使用sql*load加載100萬數(shù)據(jù):

          表名

           

          行數(shù)

           

          路徑

           

          是否是壓縮的

           

          消耗的時間

           

          test_nocom

           

          1000000

           

          直接

           

          非壓縮的

           

          00:00:21.12

           

          test_comp

           

          1000000

           

          直接

           

          壓縮的

           

          00:00:47.77

           

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

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

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

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

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

          測試一:
          測試數(shù)據(jù):源文件是一個數(shù)據(jù)庫文件,其大小為5,244,928;
          測試結果:
          gzip:19,136,2秒
          compress:17,769,1秒
          zip:19,261,2秒
          bzip2:1902,2秒
          測試二:
          測試數(shù)據(jù):源文件是一個/etc目錄的tar包,其大小為2,631,680;
          測試結果:
          gzip:551,736,2秒
          compress:877,391,3秒
          zip:551,856,3秒
          bzip2:478,512,11秒
          測試三:
          測試數(shù)據(jù):源文件是一個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系統(tǒng)下,用這些壓縮軟件是不能直接對一個目錄進行打包,當您需要這樣做時,通常先使用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)若沒有加上任何參數(shù),生成壓縮文件后,會刪除原始文件;

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

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

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

          2.bzip2和bunzip2
          壓縮包擴展名:“.bz2”
          特點:
          1)它采用了新的壓縮演算法,壓縮效果比傳統(tǒng)的LZ77/LZ78壓縮演算法來得好;
          2)若沒有加上任何參數(shù),生成壓縮文件后,會刪除原始文件;
          命令使用:
          1) 壓縮一個文件:
          bzip2 file 這樣將生成file.bz2,刪除原文件file;
          2) 壓縮一個文件,并保留源文件:
          bzip2 –k file
          3) 提高壓縮率:bzip –9 file
          注:壓縮等級可以從1-9,數(shù)字越大壓縮效果越好,但要花的時間也越長。
          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系統(tǒng)中都可以找到;
          2)默認情況下,生成壓縮文件后,會刪除原始文件。
          命令使用:
          1) 壓縮一個文件:
          compress file
          2) 壓縮一個文件,并保留源文件:
          compress –c a > a.Z
          3) 提高壓縮率:compress –b9 file
          注:壓縮等級可以從9-16,數(shù)字越大壓縮效果越好,但要花的時間也越長。預設值是16。
          4) 解壓縮:
          compress –d file.Z 或
          uncompress a.Z
          5) 顯示詳細信息:
          compress –v file
          6) 顯示版本信息:
          compress –V

          4.zip和unzip
          壓縮包擴展名:“.zip”
          特點:
          1)它是一個使用廣泛的壓縮程序,其版本橫跨十多種操作系統(tǒng)與硬件結構平臺;
          2)默認情況下,生成壓縮文件后,不會刪除原始文件。
          命令使用:
          1) 壓縮一個文件:
          注意:如果要壓縮的是個文件夾,則要加上-r參數(shù),表示調用遞歸壓縮,如:
          zip -r temp.zip temp
          zip zipfile file (zipfile是壓縮后的文件名,file要壓縮的文件名)
          2) 壓縮一個文件,并刪除源文件:
          zip –m file
          3) 提高壓縮率:zip –9 file
          注:壓縮等級可以從1-9,數(shù)字越大壓縮效果越好,但要花的時間也越長。預設值是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演變而來的壓縮程序,文件經(jīng)它壓縮后,會產(chǎn)生一個具有“.lzh”的擴展名。使用起來還是比較簡單的,而且它是可以直接將一個目錄打包的:
          1) 壓縮一個文件:
          lha –a lhzfile file (lhzfile是壓縮后的文件名,file要壓縮的文件名)
          2) 解壓縮:
          lha –xiw=/tmp lhzfile (其中/tmp是解壓縮后的存放目錄,lhzfile是壓縮文件名)
          3) 壓縮一個目錄:
          lha –a lhzfile directory

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

          3.unarj
          如果你有一些用arj壓縮的包的話,你可以使用unarj解開它,不過它只能夠解,卻無法執(zhí)行壓縮。在Linux沒有提供arj壓縮工具。
          解壓時,很簡單:unarj e arjfile
          posted @ 2010-07-13 11:28 xzc 閱讀(538) | 評論 (0)編輯 收藏
          tar命令
          [root@linux ~]# tar [-cxtzjvfpPN] 文件目錄 ....
          參數(shù)
          -c :建立一個壓縮文件的參數(shù)指令(create 的意思);
          -x :解開一個壓縮文件的參數(shù)指令!
          -t :查看 tarfile 里面的文件!
          特別注意,在參數(shù)的下達中, c/x/t 僅能存在一個!不可同時存在!
          因為不可能同時壓縮與解壓縮。
          -z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
          -j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
          -v :壓縮的過程中顯示文件!這個常用,但不建議用在背景執(zhí)行過程!
          -f :使用檔名,請留意,在 f 之后要立即接檔名喔!不要再加參數(shù)!
             例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法,要寫成
             『 tar -zcvPf tfile sfile』才對喔!
          -p :使用原文件的原來屬性(屬性不會依據(jù)使用者而變)
          -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 壓縮
          # 特別注意,在參數(shù) f 之后的文件檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
          # 如果加 z 參數(shù),則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
          # 如果加 j 參數(shù),則以 .tar.bz2 來作為附檔名啊~
          # 上述指令在執(zhí)行的時候,會顯示一個警告訊息:
          # 『tar: Removing leading `/' from member names』那是關於絕對路徑的特殊設定。
          范例二:查閱上述 /tmp/etc.tar.gz 文件內有哪些文件?
          [root@linux ~]# tar -ztvf /tmp/etc.tar.gz
          # 由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的文件時,
          # 就得要加上 z 這個參數(shù)了!這很重要的!

          范例三:將 /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
          # 則會發(fā)現(xiàn),該目錄下的文件屬性與 /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 底下,而不產(chǎn)生文件!
          [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
          參數(shù):
          -c :將壓縮的資料輸出到螢幕上,可透過資料流重導向來處理;
          -d :解壓縮的參數(shù);
          -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
          參數(shù):
          -c :將壓縮的過程產(chǎn)生的資料輸出到螢幕上!
          -d :解壓縮的參數(shù)
          -z :壓縮的參數(shù)
          -# :與 gzip 同樣的,都是在計算壓縮比的參數(shù), -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] 文件或目錄
          參數(shù):
          -d :用來解壓縮的參數(shù)
          -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 的參數(shù)比較有趣!他會將壓縮過程的資料輸出到螢幕上,而不是寫入成為
          # file.Z 文件。所以,我們可以透過資料流重導向的方法將資料輸出成為另一個檔名。
          # 關於資料流重導向,我們會在 bash shell 當中詳細談論的啦!



          dd 命令
          [root@linux ~]# dd if="input_file" of="outptu_file" bs="block_size" \
          count="number"
          參數(shù):
          if :就是 input file 啰~也可以是裝置喔!
          of :就是 output file 喔~也可以是裝置;
          bs :規(guī)劃的一個 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] <==還原
          參數(shù):
          -o :將資料 copy 輸出到文件或裝置上
          -i :將資料自文件或裝置 copy 出來系統(tǒng)當中
          -t :查看 cpio 建立的文件或裝置的內容
          -c :一種較新的 portable format 方式儲存
          -v :讓儲存的過程中文件名稱可以在螢幕上顯示
          -B :讓預設的 Blocks 可以增加至 5120 bytes ,預設是 512 bytes !
             這樣的好處是可以讓大文件的儲存速度加快(請參考 i-nodes 的觀念)
          -d :自動建立目錄!由於 cpio 的內容可能不是在同一個目錄內,
          如此的話在反備份的過程會有問題! 這個時候加上 -d 的話,
          就可以自動的將需要的目錄建立起來了!
          -u :自動的將較新的文件覆蓋較舊的文件!
          范例:
          范例一:將所有系統(tǒng)上的資料通通寫入磁帶機內!
          [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 閱讀(240) | 評論 (0)編輯 收藏

          一.tar命令

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

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

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

          主選項:

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

          輔助選項:
          b 該選項是為磁帶機設定的。其后跟一數(shù)字,用來說明區(qū)塊的大小,系統(tǒng)預設值為20(20*512 bytes)。
          f 使用檔案文件或設備,這個選項通常是必選的。
          k 保存已經(jīng)存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。
          m 在還原文件時,把所有文件的修改時間設定為現(xiàn)在。
          M 創(chuàng)建多卷的檔案文件,以便在幾個磁盤中存放。
          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的人就太少了。本文就來對這些常見的壓縮文件進行一番小結,希望你下次遇到這些文件時不至于被搞暈:)

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

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

            tar命令的選項有很多(用man tar可以查看到),但常用的就那么幾個選項,下面來舉例說明一下:
            # tar -cf all.tar *.jpg
            這條命令是將所有.jpg的文件打成一個名為all.tar的包。-c是表示產(chǎn)生新的包,-f指定包的文件名。
            # tar -rf all.tar *.gif
            這條命令是將所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
                  # tar -uf all.tar logo.gif
            這條命令是更新原來tar包all.tar中l(wèi)ogo.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組織開發(fā)的一個壓縮程序,.gz結尾的文件就是gzip壓縮的結果。與gzip相對的解壓程序是gunzip。tar中使用-z這個參數(shù)來調用gzip。下面來舉例說明一下:
            # tar -czf all.tar.gz *.jpg
            這條命令是將所有.jpg的文件打成一個tar包,并且將其用gzip壓縮,生成一個gzip壓縮過的包,包名為all.tar.gz
            # tar -xzf all.tar.gz
            這條命令是將上面產(chǎn)生的包解開。
            2) tar調用bzip2
            bzip2是一個壓縮能力更強的壓縮程序,.bz2結尾的文件就是bzip2壓縮的結果。與bzip2相對的解壓程序是bunzip2。tar中使用-j這個參數(shù)來調用bzip2。下面來舉例說明一下:
            # tar -cjf all.tar.bz2 *.jpg
            這條命令是將所有.jpg的文件打成一個tar包,并且調用bzip2壓縮,生成一個bzip2壓縮過的包,包名為all.tar.bz2
            # tar -xjf all.tar.bz2
            這條命令是將上面產(chǎn)生的包解開。
              3)tar調用compress


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

            # tar -cZf all.tar.Z *.jpg
            這條命令是將所有.jpg的文件打成一個tar包,并且調用compress壓縮,生成一個uncompress壓縮過的包,包名為all.tar.Z
            # tar -xZf all.tar.Z
            這條命令是將上面產(chǎn)生的包解開
            有了上面的知識,你應該可以解開多種壓縮文件了,下面對于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是解壓程序。它們的參數(shù)選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
            # zip all.zip *.jpg
            這條命令是將所有.jpg的文件壓縮成一個zip包

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

                zip -r temp.zip temp


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

            2)對于.rar
            要在linux下處理.rar文件,需要安裝RAR for Linux,可以從網(wǎng)上下載,但要記住,RAR for Linux
          不是免費的;然后安裝:
            # tar -xzpvf rarlinux-3.2.0.tar.gz
            # cd rar
            # make
            這樣就安裝好了,安裝后就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數(shù)選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
            # rar a all *.jpg
            這條命令是將所有.jpg的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名后。
            # unrar e all.rar
            這條命令是將all.rar中的所有文件解壓出來
             到此為至,我們已經(jīng)介紹過linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你應該已經(jīng)能夠使用它們對.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 閱讀(7199) | 評論 (0)編輯 收藏

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

          內容 說明
          # 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)"

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

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

          比較內容 SPfile Pfile
          格式 二進制格式 文本格式
          編輯方式 (1)利用企業(yè)管理器對Pfile進行修改,然后轉換為Spfile (2)在SQL Plus里使用ALTER SYSTEM語句進行修改 (1)利用文本工具直接進行修改 (2)在企業(yè)管理器里修改配置后導出形成
          默認名稱 SPfile+例程名.ora Init+例程名.ora 實際參數(shù)文件Init.ora
          默認路徑 Oracle\ora90\database\ Oracle\ora90\database\ Init.ora位于Oracle\admin\數(shù)據(jù)庫例程名\pfile\
          啟動次序 SPfile優(yōu)先于Pfile Pfile低于Spfile
          posted @ 2010-06-28 10:43 xzc 閱讀(159) | 評論 (0)編輯 收藏
          僅列出標題
          共32頁: First 上一頁 12 13 14 15 16 17 18 19 20 下一頁 Last 
          主站蜘蛛池模板: 霍林郭勒市| 岳阳县| 荣成市| 开远市| 沙河市| 锦屏县| 开化县| 石狮市| 淄博市| 莱西市| 东海县| 垦利县| 星子县| 神池县| 永登县| 临颍县| 镇赉县| 石家庄市| 新营市| 图木舒克市| 中宁县| 黄陵县| 镇康县| 大安市| 昭通市| 扎鲁特旗| 桃园市| 唐河县| 贡嘎县| 胶州市| 峨眉山市| 涿鹿县| 鹰潭市| 长垣县| 黄梅县| 和政县| 平山县| 宁夏| 庐江县| 林州市| 濮阳县|