一、目的:
Oracle系統中的profile可以用來對用戶所能使用的數據庫資源進行限制,使用
Create
Profile命令創建一個Profile,用它來實現對數據庫資源的限制使用,如果把該profile分配給用戶,則該用戶所能使用的數據庫資源都在該
profile的限制之內。
二、條件:
創建profile必須要有CREATE PROFILE的系統權限。
為用戶指定資源限制,必須:
1.動態地使用alter system或使用初始化參數resource_limit使資源限制生效。該改變對密碼資源無效,密碼資源總是可用。
SQL> show parameter resource_limit
NAME TYPE VALUE
———————————— ———– ——————————
resource_limit boolean FALSE
SQL> alter system set resource_limit=true;
系統已更改。
SQL> show parameter resource_limit;
NAME TYPE VALUE
———————————— ———– ——————————
resource_limit boolean TRUE
SQL>
2.使用create profile創建一個定義對數據庫資源進行限制的profile。
3.使用create user 或alter user命令把profile分配給用戶。
三、語法:
CREATE PROFILE profile
LIMIT { resource_parameters
| password_parameters
}
[ resource_parameters
| password_parameters
]... ;
<resource_parameters>
{ { SESSIONS_PER_USER
| CPU_PER_SESSION
| CPU_PER_CALL
| CONNECT_TIME
| IDLE_TIME
| LOGICAL_READS_PER_SESSION
| LOGICAL_READS_PER_CALL
| COMPOSITE_LIMIT
}
{ integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA
{ integer [ K | M ] | UNLIMITED | DEFAULT }
}
< password_parameters >
{ { FAILED_LOGIN_ATTEMPTS
| PASSWORD_LIFE_TIME
| PASSWORD_REUSE_TIME
| PASSWORD_REUSE_MAX
| PASSWORD_LOCK_TIME
| PASSWORD_GRACE_TIME
}
{ expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
{ function | NULL | DEFAULT }
}
四、語法解釋:
profile:配置文件的名稱。Oracle數據庫以以下方式強迫資源限制:
1.如果用戶超過了connect_time或idle_time的會話資源限制,數據庫就回滾當前事務,并結束會話。用戶再次執行命令,數據庫則返回一個錯誤,
2.如果用戶試圖執行超過其他的會話資源限制的操作,數據庫放棄操作,回滾當前事務并立即返回錯誤。用戶之后可以提交或回滾當前事務,必須結束會話。
提示:可以將一條分成多個段,如1小時(1/24天)來限制時間,可以為用戶指定資源限制,但是數據庫只有在參數生效后才會執行限制。
Unlimited:分配該profile的用戶對資源使用無限制,當使用密碼參數時,unlimited意味著沒有對參數加限制。
Default:指定為default意味著忽略對profile中的一些資源限制,Default profile初始定義對資源不限制,可以通過alter profile命令來改變。
Resource_parameter部分
Session_per_user:指定限制用戶的并發會話的數目。
Cpu_per_session:指定會話的CPU時間限制,單位為百分之一秒。
Cpu_per_call:指定一次調用(解析、執行和提取)的CPU時間限制,單位為百分之一秒。
Connect_time:指定會話的總的連接時間,以分鐘為單位。
Idle_time:指定會話允許連續不活動的總的時間,以分鐘為單位,超過該時間,會話將斷開。但是長時間運行查詢和其他操作的不受此限制。
Logical_reads_per_session:指定一個會話允許讀的數據塊的數目,包括從內存和磁盤讀的所有數據塊。
Logical_read_per_call:指定一次執行SQL(解析、執行和提取)調用所允許讀的數據塊的最大數目。
Private_sga:指定一個會話可以在共享池(SGA)中所允許分配的最大空間,以字節為單位。(該限制只在使用共享服務器結構時才有效,會話在SGA中的私有空間包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL)。
Composite_limit:指定一個會話的總的資源消耗,以service
units單位表示。Oracle數據庫以有利的方式計算
cpu_per_session,connect_time,logical_reads_per_session和private-sga總的
service units
Password_parameter部分:
Failed_login_attempts:指定在帳戶被鎖定之前所允許嘗試登陸的的最大次數。
Password_life_time:指定同一密碼所允許使用的天數。如果同時指定了
password_grace_time參數,如果在grace
period內沒有改變密碼,則密碼會失效,連接數據庫被拒絕。如果沒有設置password_grace_time參數,默認值unlimited將引
發一個數據庫警告,但是允許用戶繼續連接。
Password_reuse_time和password_reuse_max:這兩個參數必須互相關聯設置,password_reuse_time指定了密碼不能重用前的天數,而password_reuse_max則指定了當前密碼被重用之前密碼改變的次數。兩個參數都必須被設置為整數。
1.如果為這兩個參數指定了整數,則用戶不能重用密碼直到密碼被改變了password_reuse_max指定的次數以后在password_reuse_time指定的時間內。
如:password_reuse_time=30,password_reuse_max=10,用戶可以在30天以后重用該密碼,要求密碼必須被改變超過10次。
2.如果指定了其中的一個為整數,而另一個為unlimited,則用戶永遠不能重用一個密碼。
3.如果指定了其中的一個為default,Oracle數據庫使用定義在profile中的默認值,默認情況下,所有的參數在profile中都被設置為unlimited,如果沒有改變profile默認值,數據庫對該值總是默認為unlimited。
4.如果兩個參數都設置為unlimited,則數據庫忽略他們。
Password_lock_time:指定登陸嘗試失敗次數到達后帳戶的縮定時間,以天為單位。
Password_grace_time:指定寬限天數,數據庫發出警告到登陸失效前的天數。如果數據庫密碼在這中間沒有被修改,則過期會失效。
Password_verify_function:該字段允許將復雜的PL/SQL密碼驗證腳本做為參
數傳遞到create profile語句。Oracle數據庫提供了一個默認的腳本,但是自己可以創建自己的驗證規則或使用第三方軟件驗證。
對Function名稱,指定的是密碼驗證規則的名稱,指定為Null則意味著不使用密碼驗證功能。如果為密碼參數指定表達式,則該表達式可以是任意格
式,除了數據庫標量子查詢。
五、舉例:
1.創建一個profile:
create profile new_profile
limit password_reuse_max 10
password_reuse_time 30;
2.設置profile資源限制:
create profile app_user limit
sessions_per_user unlimited
cpu_per_session unlimited
cpu_per_call 3000
connect_time 45
logical_reads_per_session default
logical_reads_per_call 1000
private_sga 15k
composite_limit 5000000;
總的resource cost不超過五百萬service units。計算總的resource cost的公式由alter resource cost語句來指定。
3.設置密碼限制profile:
create profile app_users2 limit
failed_login_attempts 5
password_life_time 60
password_reuse_time 60
password_reuse_max 5
password_verify_function verify_function
password_lock_time 1/24
password_grace_time 10;
4.將配置文件分配給用戶:
SQL> alter user dinya profile app_user;
用戶已更改。
SQL> alter user dinya profile default;
用戶已更改。
第八章: managing password security and resources
1.controlling account lock and password
sql> alter user juncky identified by oracle account unlock;
2.user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql> password_grace_time 5;
4.altering a profile
sql> alter profile default failed_login_attempts 3
sql> password_life_time 60 password_grace_time 10;
5.drop a profile
sql> drop profile grace_5 [cascade];
6.create a profile : resource limit
sql> create profile developer_prof limit sessions_per_user 2
sql> cpu_per_session 10000 idle_time 60 connect_time 480;
7. view => resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql> alter system set resource_limit=true;
9.設置指定用戶應用profile
sql> alter user test profile profile_user;
第四章:索引
1.creating function-based indexes
sql> create index summit.item_quantity on summit.item(quantity-
quantity_shipped);
2.create a B-tree index #oracle 默認是這種索引,此種索引適用于唯一性高的列
sql> create [unique] index index_name on table_name(column,.. asc/desc)
tablespace
sql> tablespace_name [pctfree integer] [initrans integer] [maxtrans integer] #不能指定pctused參數
sql> [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql> maxextents 50);
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum
number of rows
4.creating reverse key indexes
sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial
200k
next 200k pctincrease 0 maxextents 50) tablespace indx;
5.create bitmap index #此種索引適用于唯一性低的列,如性別列,只有"男","女"兩種
情況,也就是說,很多行會重復。
sql> create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next
200k
sql> pctincrease 0 maxextents 50) tablespace indx;
6.change storage parameter of index
sql> alter index xay_id storage (next 400k maxextents 100);
7.allocating index space
sql> alter index xay_id allocate extent(size 200k datafile
'c:/oracle/index.dbf');
8.deallocating index space
sql> alter index xay_id deallocate unused;
9.rebuilding indexes
sql> alter index testindex3 rebuild tablespace indx;#移到指定tablespace
sql> alter index testindex3 rebuild reverse;#轉換成反轉索引
10.online rebuild of indexes
sql> alter index testindex3 rebuild online #不鎖定表,原有索引的基礎上建
11.coalescing indexes 碎片整理
sql> alter index testindex3 coalesce;
12.checking index validity 校驗索引
sql> analyze index testindex validate structrue;
13.dropping indexes
sql> drop index testindex;
14.identifying unused indexes
sql> alter index testindex monitoring useage; #開始監視
sql> alter index testindex nomonitoring useage; #取消監視
15. obtaining index information
dba_indexes, dba_ind_columns, dba_ind_expressions,v$object_usage
16.oracle B-tree和bitmap索引區別
1、都是樹型結構,葉子節點存儲內容不一樣。
2、列的取值范圍較大(適合常規b—tree索引),取值范圍較小(適合位圖索引);
3、由于bitmap索引的特點,他不是unique型的,也不涉及unique概念。
4、bitmap通常where如果有or連接效率比較高。
5、b-tree適合oltp,bitmap適合數據倉庫。
16.索引占用空間使用情況
sql>analyze index ***.***_subscriber_groupid_indx validate structure;
Index analyzed.
column name format a15
column blocks heading "ALLOCATED|BLOCKS"
column lf_blks heading "LEAF|BLOCKS"
column br_blks heading "BRANCH|BLOCKS"
column Empty heading "UNUSED|BLOCKS"
SQL> list
1 select name,
2 blocks,
3 lf_blks,
4 br_blks,
5 blocks-(lf_blks+br_blks) empty
6* from index_stats
SQL> /
ALLOCATED LEAF BRANCH UNUSED
NAME BLOCKS BLOCKS BLOCKS BLOCKS
————— ———- ———- ———- ———-
***_SUBSCRIBER 640 577 3 60
_GROUPID_INDX
也可通過如下的查詢來確定該索引在BTREE空間內使用情況
SQL> list
1 select name,
2 btree_space,
3 used_space,
4 pct_used
5* from index_stats
SQL> /
NAME BTREE_SPACE USED_SPACE PCT_USED
—————————— ———– ———- ———-
AGCF_SUBSCRIBER_GROUPID_INDX 4637776 3027283 66
Temp Table 的特點:
(1) 多用戶操作的獨立性:對于使用同一張臨時表的不同用戶,ORACLE都會分配一個獨立的 Temp Segment,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而保證了多個用戶操作的并發性和獨立性;
(2) 數據的臨時性:既然是臨時表,顧名思義,存放在該表中的數據是臨時性的。ORACLE根據你創建臨時表時指定的參數(On Commit Delete Rows / On Commit Preserve Rows),自動將數據TRUNCATE掉。
Temp Table 數據的時效性:
(1)On Commit Delete Rows: 數據在 Transaction 期間有效,一旦COMMIT后,數據就被自動 TRUNCATE 掉了;
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Trans
2 ON COMMIT DELETE ROWS
3 AS
4 SELECT * FROM t_Department;
表已創建。
SQL> INSERT INTO QCUI_Temp_Trans
2 SELECT * FROM t_Dept;
已創建4行。
SQL> SELECT * FROM QCUI_Temp_Trans;
DEPTID DEPTNAME
---------- --------------------
101 銷售部
201 財務部
301 貨運部
401 采購部
SQL> commit;
提交完成。
SQL> SELECT * FROM QCUI_Temp_Trans;
未選定行
(2)On Commit Preserve Rows :數據在 Session 期間有效,一旦關閉了Session 或 Log Off 后,數據就被 ORACLE 自動 Truncate 掉。
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM t_Department;
表已創建。
SQL> Select * from QCUI_Temp_Sess;
DEPTID DEPTNAME
---------- --------------------
101 銷售部
301 貨運部
401 采購部
201 財務部
SQL> exit
C:\Documents and Settings\QCUI>sqlplus sqltrainer@ibm
SQL> SELECT * FROM QCUI_Temp_Sess;
未選定行
注:這里要說明的是,ORACLE Truncate 掉的數據僅僅是分配給不同 Session 或 Transaction的 Temp Segment 上的數據,而不是將整張表數據 TRUNCATE 掉。
Temp Table 的應用:
Temp Table 就我理解而言,主要有兩方面應用。
對于一個電子商務類網站,不同消費者在網站上購物,就是一個獨立的 SESSION,選購商品放進購物車中,最后將購物車中的商品進行結算。也就是說,必須在整個SESSION期間保存購物車中的信息。同時,還存在有些消費者,往往最終結賬時放棄購買商品。如果,直接將消費者選購信息存放在最終表(PERMANENT)中,必然對最終表造成非常大的壓力。
因此,對于這種案例,就可以采用創建臨時表( ON COMMIT PRESERVE ROWS )的方法來解決。數據只在 SESSION 期間有效,對于結算成功的有效數據,轉移到最終表中后,ORACLE自動TRUNCATE 臨時數據;對于放棄結算的數據,ORACLE 同樣自動進行 TRUNCATE ,而無須編碼控制,并且最終表只處理有效訂單,減輕了頻繁的DML的壓力。
注:這里似乎說得不對,對于B/S應用,雖然SESSION是一個,但此session并不是數據庫連接的session,每次頁面請求都是使用新的連接(或從連接池中獲取的),對于數據庫而言是新的session,這種情況下,臨時表內的數據是不是不能共享呀??
wallimn 2009-11-11
Temp Table 的另一個應用,就是存放數據分析的中間數據。
Temp Table 存放在哪兒?
Temp Table 并非存放在用戶的表空間中,而是存放在 Schema 所指定的臨時表空間中。
SQL> Select Table_Name, Tablespace_Name
2 From User_Tables
3 Where Table_Name Like 'QCUI%';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
QCUI_TEMP_SESS
QCUI_TEMP_TRANS
可見這兩張臨時表并未存放在用戶的表空間中。
用戶 SQLTRAINER 的臨時表空間是 TEMP , 用戶創建的臨時表是存放在TEMP表空間中的。下面來證明
SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts
2 FROM User_Users;
USERNAME DEF_TS TEMP_TS
----------------------------- ------------------ ----------
SQLTRAINER ts_ORASQLTraining TEMP
SQL> connect system/manager@ibm
已連接。
SQL> alter tablespace temp offline;
表空間已更改。
SQL> connect sqltrainer/sqltrainer@ibm
已連接。
SQL> INSERT INTO QCUI_Temp_Sess
2 SELECT * FROM t_Department;
INSERT INTO QCUI_Temp_Sess
*
ERROR 位于第 1 行:
ORA-01542: 表空間'TEMP'脫機,無法在其中分配空間
對 Temp Table 的 DML 操作是否不產生 Redo Log ?
盡管對臨時表的DML操作速度比較快,但同樣也是要產生 Redo Log 的,只是同樣的DML語句,比對 PERMANENT 的DML 產生的Redo Log 少。
SQL> Set AutoTrace On
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess_AllObj
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM All_Objects;
表已創建。
SQL> INSERT INTO QCUI_Temp_Sess_AllObj
2 SELECT * FROM All_Objects;
已創建21839行。
Statistics
---------------------------------------------------------
……
168772 redo size
……
SQL> CREATE TABLE QCUI_ALL_OBJECTS
2 AS
3 SELECT * FROM All_Objects
4 WHERE 1 = 0;
表已創建。
SQL> INSERT INTO QCUI_All_Objects
2 SELECT * FROM ALL_Objects;
已創建21839行。
Statistics
----------------------------------------------------------
……
2439044 redo size
……
第三章:表
1.create a table
sql> create table table_name (column datatype,column datatype]....)
sql> tablespace tablespace_name [pctfree integer] [pctused integer]
sql> [initrans integer] [maxtrans integer]
sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)
sql> [logging|nologging] [cache|nocache]
2.copy an existing table
sql> create table table_name [logging|nologging] as subquery
3.create temporary table
sql> create global temporary table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows #具體可見oracle臨時表的應用
4.pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k
sql> minextents 2 maxextents 100);
6.manually allocating extents
sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
7.move tablespace
sql> alter table employee move tablespace users;
#此操作會造成索引不可用,需要重建索引,但權限之類的不受影響
sql> alter index index_name rebuild;
8.deallocate of unused space
sql> alter table table_name deallocate unused [keep integer]
9.truncate a table
sql> truncate table table_name;
10.drop a table
sql> drop table table_name [cascade constraints];
11.drop a column
sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
12.mark a column as unused
sql> alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
13.obtaining table information
data_dictionary : dba_unused_col_tabs
dba_tables
dba_objects
sql> select * from dba_tables where owner = 'ET';
sql> select * from dba_objectswhere owner = 'ET';
14.truncate,delete,drop的異同點
之前看到的:“在刪除一個表中的全部數據時,須使用TRUNCATE TABLE 表名;因為用DROP TABLE,DELETE * FROM 表名時,TABLESPACE表空間該表的占用空間并未釋放,反復幾次
DROP,DELETE操作后,該TABLESPACE上百兆的空間就被耗光了”
之前看到的:“在刪除一個表中的全部數據時,須使用TRUNCATE TABLE 表名;因為用DROP TABLE,DELETE * FROM 表名時,TABLESPACE表空間該表的占用空間并未釋放,反復幾次
DROP,DELETE操作后,該TABLESPACE上百兆的空間就被耗光了”后來查了點資料,感覺有一定道理,因為Oracle 10g開始,當我執行Drop Table是,Oracle也會把被刪除的表放到
數據庫回收站(Database Recyclebin)里。這樣我們就可以用flashback table命令恢復被刪除的表,語法:
Flashback table 表名 to before drop;
但沒有資料說,可以恢復truncate的內容。當然,他說的也不完全,因為我們刪除表時想要的效果不同。其實這三個指令之前我從來沒有怎么注意,只是知道我想保住表結構,但
不想要里頭內容時,我會用truncate,如果刪除的內容不太確定,就是用delete,因為它可以回退,有點像垃圾筒的概念,如果這整張表我都不想要了,我就drop掉它。今天在網
上查了點資料,有一篇寫得挺好,感覺比較全面:
truncate,delete,drop的異同點
注意:這里說的delete是指不帶where子句的delete語句
相同點:truncate和不帶where子句的delete, 以及drop都會刪除表內的數據
不同點:
1. truncate和 delete只刪除數據不刪除表的結構(定義)
drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger),索引(index); 依賴于該表的存儲過程/函數將保留,但是變為invalid狀態.
2.delete語句是dml,這個操作會放到rollback segement中,事務提交之后才生效;如果有相應的trigger,執行的時候將被觸發.
truncate,drop是ddl, 操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger.
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動
顯然drop語句將表所占用的空間全部釋放
truncate 語句缺省情況下將空間釋放到 minextents個 extent,除非使用reuse storage; truncate會將高水線復位(回到最開始).
4.速度,一般來說: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其沒有備份的時候.否則哭都來不及
使用上,想刪除部分數據行用delete,注意帶上where子句. 回滾段要足夠大.
想刪除表,當然用drop
想保留表而將所有數據刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發trigger,還是用delete.
如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據
1.forcing log switches
sql> alter system switch logfile;
2.forcing checkpoints
sql> alter system checkpoint;
3.adding online redo log groups
sql> alter database add logfile [group 4] ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;
4.adding online redo log members
sql> alter database add logfile member '/disk3/log1b.rdo' to group 1, '/disk4/log2b.rdo' to group 2;
5.changes the name of the online redo logfile
sql> alter database rename file 'c:/oracle/oradata/oradb/redo01.log' to 'c:/oracle/oradata/redo01.log';
6.drop online redo log groups
sql> alter database drop logfile group 3;
7.drop online redo log members
sql> alter database drop logfile member 'c:/oracle/oradata/redo01.log';
8.clearing online redo log files
sql> alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
9.using logminer analyzing redo logfiles #這個可能是8i的日志分析,10g的請看另一篇日志挖掘。
a. in the init.ora specify utl_file_dir = ' '
b. sql> execute dbms_logmnr_d.build('oradb.ora','c:"oracle"oradb"log');
c. sql> execute dbms_logmnr_add_logfile('c:"oracle"oradata"oradb"redo01.log', dbms_logmnr.new);
d. sql> execute dbms_logmnr.add_logfile('c:"oracle"oradata"oradb"redo02.log', dbms_logmnr.addfile);
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>'c:"oracle"oradb"log"oradb.ora');
f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters v$logmnr_logs);
g. sql> execute dbms_logmnr.end_logmnr;
10.查看系統日志文件信息及大小
sql>select a.group#, a.sequence#,a.bytes/1024/1024 tsize , a.members,a.status,b.member,b.type from v$log a , v$logfile b where a.group#=b.group#;
oracle數據庫通過控制文件保持數據庫的完整性,一旦控制文件被破壞數據庫將無法啟動,因此建議采用多路控制文件或者備份控制文件的方法。
控制文件是數據庫建立的時候自動生成的二進制文件,只能通過實例進行修改,如果手動修改的話會造成控制文件與物理信息不符合,從而導致數據庫不能正常工作。
控制文件主要包括下面內容:
1.控制文件所屬數據庫的名字,一個控制文件只能屬一個數據庫
2.數據庫創建時間
3.數據文件的名稱,位置,聯機,脫機狀態信息
4.所有表空間信息
5.當前日志序列號
6.最近檢查點信息
其中,數據庫名稱,標識和創建時間在數據庫創建時寫入;數據文件和重做日志名稱和位置在增加,重命名或者刪除的時候更新;表空間信息在增加或者刪除表空間的時候進行更新。
在初始化參數文件中control_files參數主要來描述控制文件的文件名跟物理路徑,如下所示:
control_files=("d:\oracle\oradata\oradb\control01.ctl")
該參數只設置一個,也可以設置多個,如下所示:
control_files=('d:\oracle\oradata\oradb\control01.ctl',
'd:\oracle\oradata\oradb\control02.ctl',
'd:oracle\oradata\oradb\control03.ctl')
這個方法叫做多路控制文件,oracle可以利用這個方法恢復被破壞的控制文件,oracle最多允許設置8個多路控制文件。
必須所有的多路控制文件都完整正確數據庫才能正常啟動,只要丟失一個或者一個內容不正確數據庫就不能順利啟動。
對控制文件的管理原則:
1.明確控制文件的名稱和存儲路徑
參數設置錯誤將無法打開數據庫,數據庫打開以后,實例將同時寫入所有的控制文件但是只會讀取第一個控制文件的內容。
2.為數據庫創建多路控制文件
a.多路控制文件內容必須完全一樣,oracle實例同時將內容寫入到control_files變量所設置的控制文件中。
b.初始化參數control_files中列出的第一個文件是數據庫運行期間唯一可讀取的控制文件。
c.創建,恢復和備份控制文件必須在數據庫關閉的狀態下運行,這樣才能保證操作過程中控制文件不被修改。
d.數據庫運行期間如果一個控制文件變為不可用,那么實例將不再運行,應該終止這個實例,并對破壞的控制文件進行修復。
3.將多路控制文件放在不同的硬盤上
4.采用操作系統鏡像方式備份控制文件
5.手工方式備份控制文件
應該及時備份特別是發生了如下的操作的時候:
添加刪除重命名數據文件
添加刪除表空間,改變表空間讀寫狀態
添加刪除重做日志文件
如果手工備份不及時的話,就會產生備份的控制文件與正在使用的控制文件不一致,那么利用備份的控制文件啟動數據庫時會破壞數據庫的一致性完整性,甚至不能啟動數據庫,因此手工備份控制文件要注意及時備份。
創建多路控制文件
利用spfile文件創建多路控制文件
(spfile以二進制文本形式存在,不能用vi等編輯器對其中參數進行修改。文件格式為spfileSID.ora。如果要對spfile文件進行修改,可以采用SQL語言)
1.利用SYS帳號登陸SQL*PLUS,查詢一下控制文件信息視圖
SQL>select name from v$controlfile;
結果顯示為:
NAME
----------------------------------
d:\oracle\oradata\oradb\control01.ctl
d:\oracle\oradata\oradb\control02.ctl
d:\oracle\oradata\oradb\control03.ctl
這里列出了控制文件的名稱以及位置
2.更改spfile中控制文件的信息:(增加了一個新的控制文件)
SQL>alter system set control_files=
'd:\oracle\oradata\oradb\control01.ctl',
'd:\oracle\oradata\oradb\control02.ctl',
'd:\oracle\oradata\oradb\control03.ctl',
'd:\oracle\oradata\oradb\control04.ctl'
scope=spfile
結果顯示為:
系統已經更改。
(第二步的操作需要注意的是:進行這些操作,必須是在DB啟動的時候,否則會彈出“ORACLE not available”錯誤。)
3.關閉數據庫
4.在操作系統中將已有的控制文件復制,修改名稱保存到剛才增加控制文件的指定位置。(這步必須做的,否則數據庫無法啟動)
5.重新啟動控制文件,使控制文件改變生效。
6.還可以使用pfile的方法來修改控制文件,使用create pfile from spfile;來生成pfile,然后使用vi等編輯器編譯pfile,先手工拷貝控制文件修改相應的名稱,然后把新的控制文件的路徑增加到pfile中,使用pfile啟動數據庫,然后使用pfile創建spfile即可.
管理控制文件
備份控制文件
SQL> alter database backup controlfile to ‘d:\20080326.ctl’
SQL> alter database backup controlfile to trace;(備份創建控制文件的腳本)
# 具體文件名請看<background_dump_dest>/alert_<SID>.log文件里有詳細說明。例如在/opt/app/oracle/diag/rdbms/orcl/orcl/trace/目錄下。
alter database backup controlfile to trace
Mon Nov 23 10:27:56 2009
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Backup controlfile written to trace file /opt/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4169.trc
數據庫已更改。
然后從這個備份的位置直接把文件拷貝回之前的目錄覆蓋就好了。
刪除控制文件(刪除某一路的控制文件)
spfile文件
1.利用SYS帳號登陸SQL*PLUS,查詢一下控制文件信息視圖
SQL>select name from v$controlfile;
結果顯示為:
NAME
----------------------------------
d:oracle\oradata\oradb\control01.ctl
d:oracle\oradata\oradb\control02.ctl
d:oracle\oradata\oradb\control03.ctl
d:oracle\oradata\oradb\control04.ctl
這里列出了控制文件的名稱以及位置
2.更改spfile中控制文件的信息,刪除一個新的控制文件
SQL>alter system set control_files=
'd:oracle\oradata\oradb\control01.ctl',
'd:oracle\oradata\oradb\control02.ctl',
'd:oracle\oradata\oradb\control03.ctl',
scope=spfile
結果顯示為:
系統已經更改。
3.關閉數據庫
4.在操作系統中刪除控制文件
5.重新啟動數據庫,使控制文件生效
Oracle 10g可以使用LOGMNR在線分析和挖掘日志,使用當前在線的數據字典,非常方便。
查看包是否已經安裝
SQL>desc dbms_logmnr
首先執行一些DDL或DML操作:
SQL> connect eygle/eygle
Connected.
SQL> alter system switch logfile;
System altered.
SQL> create table eygle as select * from dba_users;
Table created.
SQL> set autotrace on
SQL> select count(*) from eygle;
COUNT(*)
----------
19
Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| EYGLE | 19 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
7 consistent gets
5 physical reads
0 redo size
411 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
然后可以執行LOGMNR解析工作:
SQL> connect / as sysdba
Connected.
SQL> select * from v$log where status='CURRENT';
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------
2 1 100 52428800 1 NO CURRENT 12729697 01-JUL-09
SQL> SELECT MEMBER from v$logfile where group#=2;
MEMBER
------------------------------------------------------------------------------------------------------------------------
/opt/oracle/oradata/mmstest/redo02.log
SQL> exec dbms_logmnr.add_logfile('/opt/oracle/oradata/mmstest/redo02.log',dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); # 這里可以指定參數:STARTTIME與ENDTIME
PL/SQL procedure successfully completed.
SQL> select count(*) from v$logmnr_contents;
COUNT(*)
----------
136
SQL> select sql_redo from v$logmnr_contents; #同樣這里可以執行命令 select sql_undo from v$logmnr_contents;
SQL_REDO
------------------------------------------------------------------------------------------------------------------------
set transaction read write;
insert into "SYS"."OBJ$"("OBJ#","DATAOBJ#","OWNER#","NAME","NAMESPACE","SUBNAME","TYPE#","CTIME","MTIME","STIME","STATUS
","REMOTEOWNER","**NAME","FLAGS","OID$","SPARE1","SPARE2","SPARE3","SPARE4","SPARE5","SPARE6") values ('25847','25847'
,'31','EYGLE','1',NULL,'2',TO_DATE('01-JUL-09', 'DD-MON-RR'),TO_DATE('01-JUL-09', 'DD-MON-RR'),TO_DATE('01-JUL-09', 'DD-
MON-RR'),'1',NULL,NULL,'0',NULL,'6','1',NULL,NULL,NULL,NULL);
set transaction read write;
update "SYS"."CON$" set "CON#" = '10823' where "CON#" = '10822' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
SQL_REDO
------------------------------------------------------------------------------------------------------------------------
update "SYS"."CON$" set "CON#" = '10824' where "CON#" = '10823' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10825' where "CON#" = '10824' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10826' where "CON#" = '10825' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10827' where "CON#" = '10826' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10828' where "CON#" = '10827' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10829' where "CON#" = '10828' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
create table eygle as select * from dba_users;
set transaction read write;
Unsupported
update "SYS"."TSQ$" set "TS#" = '0', "GRANTOR#" = '43080', "BLOCKS" = '0', "MAXBLOCKS" = '0', "PRIV1" = '0', "PRIV2" = '
0' where "TS#" = '0' and "GRANTOR#" = '43072' and "BLOCKS" = '0' and "MAXBLOCKS" = '0' and "PRIV1" = '0' and "PRIV2" = '
0' and ROWID = 'AAAAAKAABAAAABbAAF';
commit;
set transaction read write;
SQL> exec dbms_logmnr.end_logmnr
注:在Oracle安裝過程中,如果數據庫是自動創建的,那么該數據庫最初的存檔模式是由操作系統指定的。通常情況下,歸檔日志在Oracle數據庫安裝結束后需要手工創建。
環境:Oracle 10g 10.2.0.1.0/Windows 2003 Server SP1
數據字典視圖:v$archived_log,v$log,v$archive_dest,v$database,v$archive_processes,
v$backup_redolog,v$log_histroy,v$recovery_file_dest.
一、關閉歸檔
1、啟動SQL*PLUS以管理身份登錄Oracle數據庫:
SQL> connect / as sysdba
2、關閉數據庫實例
SQL> shutdown immediate
3、備份數據庫:在對數據庫做出任何重要的改變之前,建議備份數據庫以免出現任何問題。
4、啟動一個新的實例并裝載數據庫,但不打開數據庫:
SQL> startup mount
5、禁止自動存檔
SQL> alter system archive log stop;
6、禁止存檔聯機重做日志:轉換數據庫的存檔模式。
SQL> alter database noarchivelog ;
7、打開數據庫:
SQL> alter database open ;
8、察看已連接實例的存檔信息:
SQL> archive log list ;
數據庫日志模式 非存檔模式
自動存檔 禁用
存檔終點 E:\oracle\arc
最早的聯機日志序列 50
當前日志序列 52
二、啟用類Oracle9i的歸檔
1、啟動SQL*PLUS以管理身份登錄Oracle數據庫:
SQL> connect / as sysdba
2、關閉數據庫實例
SQL> shutdown immediate
3、備份數據庫:在對數據庫做出任何重要的改變之前,建議備份數據庫以免出現任何問題。
4、啟動一個新的實例并裝載數據庫,但不打開數據庫:
SQL> startup mount
5、轉換數據庫的存檔模式為歸檔方式:
SQL> alter database archivelog ;
6、打開數據庫:
SQL> alter database open ;
7、在數據庫實例啟動后允許自動存檔方式:
SQL> alter system set log_archive_start=true scope=spfile;
8、指定歸檔日志文件的存放位置并記錄到SPFILE:
SQL> alter system set log_archive_dest_1='location=E:\oracle\arc' scope=spfile;
9、指定歸檔日志文件名命名格式:使用%s來包含日志序號作為文件名的一部份,并且使用%t來包含線程號,使用大寫字母(%S和%T)來以0填補文件名左邊的空處。
The following variables can be used in the format:
%s log sequence number
%S log sequence number, zero filled
%t thread number
%T thread number, zero filled
SQL> alter system set log_archive_format='BE%S_%R_%T.arc' scope=spfile;
三、在Oracle 10g里啟動自動歸檔模式
$ sqlplus "/ as sysdba"
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 25
Current log sequence 27
SQL> show parameter log_archive_start
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_start boolean FALSE
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3204448256 bytes
Fixed Size 1304912 bytes
Variable Size 651957936 bytes
Database Buffers 2550136832 bytes
Redo Buffers 1048576 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 25
Next log sequence to archive 27
Current log sequence 27
SQL>
查看表空間有多大
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
查看表空間及其數據文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
查看表空間總大小,已使用,剩下多少
select a.tablespace_name,total,free,round(free/total*100,2) free_precent,total-free used from
( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files
group by tablespace_name) a,
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;
1.create tablespaces
sql> create tablespace tablespace_name datafile 'c:"oracle"oradata"file1.dbf' size 100m,
sql> 'c:"oracle"oradata"file2.dbf' size 100m minimum extent 550k [logging/nologging]
sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql> [online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql> create tablespace user_data datafile 'c:"oracle"oradata"user_data01.dbf'
sql> size 500m extent management local uniform size 10m;
3.temporary tablespace
sql> create temporary tablespace temp tempfile 'c:"oracle"oradata"temp01.dbf'
sql> size 500m extent management local uniform size 10m;
4.change the storage setting
sql> alter tablespace app_data minimum extent 2m;
sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or online
sql> alter tablespace app_data offline;
sql> alter tablespace app_data online;
6.read_only tablespace
sql> alter tablespace app_data read only|write;
7.droping tablespace
sql> drop tablespace app_data including contents;
8.enableing automatic extension of data files
sql> alter tablespace app_data add datafile 'c:"oracle"oradata"app_data01.dbf'size 200m
sql> autoextend on next 10m maxsize 500m;
9.change the size fo data files manually
sql> alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m;
9.1改變表空間大小有三種方法:
a)sql>alter database datafile 'c:\oracle\oradata\app_data.dbf' autoextend on .. 自動擴大
b)sql>alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m; #同9一樣
c) alter tablesapce users add datafile 'c:\oracle\oradata\app_data01.dbf' size 10M #為表空間,手動新增一個datafile
10.Moving data files: alter tablespace
sql> alter tablespace app_data rename datafile 'c:\oracle\oradata\app_data.dbf' to 'c:\oracle\app_data.dbf';
11.moving data files:alter database
sql> alter database rename file 'c:\oracle\oradata\app_data.dbf' to 'c:\oracle\app_data.dbf';
12.OMF管理表空間
設置參數:db_create_file_dest
sql>alter system set db_create_file_dest = 'c:\oradata';
sql>create tablespace usertb; #默認100M,并存放于db_create_file_dest 目錄下
sql>drop tablespace usertb; #相應的物理文件也自動刪除
13.表空間的一些數據字典與動態性能表
dba_tablespaces v$tablespace v$datafile dba_data_files,
14.查詢系統回滾段
sql>select * from dba_rollback_segs
15.限制用戶使用表空間大小
sql>alter user eton quota 10M on users(表空間名 )
16.何為臨時表空間
由于Oracle工作時經常需要一些臨時的磁盤空間,這些空間主要用作查詢時帶有排序(Group by,Order by等)等算法所用,當用完后就立即釋放,對記錄在磁盤區的信息不再使用,因此叫臨時表空間。一般安裝之后只有一個TEMP臨時表空間。