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表中scn為1061279(或時間點為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ù)還原到scn為1061279(或時間點為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. 不能Falshback到5天以前的數(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;
上一回演示了運用閃回表查詢恢復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)比較好
在數(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
表壓縮是如何工作的
在Orcle9i第2版中,表壓縮特性通過刪除在數(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ù)才會被壓縮存放:
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)常變動的情況下,盡量不要使用表壓縮,它影響插入操作.
一.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
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) |
多線程服務器配置 |
# 其他 | 配置其他參數(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 |