轉載】Oracle的日常監控指令碼 Oracle管理及常用基礎指令碼
1 效能監控
1. 檢測資料庫中的事件和等待
SELECT event, total_waits, total_timeouts,time_waited, average_wait
FROM v$system_event
2. 查詢會話中的事件和等待時間
select sid, event, total_waits,average_wait
from v$session_event where sid=10;
3. 查詢等待程序
SELECT sid, seq#, event, wait_time, state
FROM v$session_wait;
4. 監控全域性區的效能
select * from v$sgastat;
5. 查詢命中率
select gethitratio
from v$librarycache
where namespace = 'SQL AREA';
6. 當前 sql 語句
select sql_text, users_executing,
executions, loads
from v$sqlarea;
7. 查詢快取記憶體中的命中率
select sum(pins) "Executions", sum(reloads) "Cache Misses",
sum(reloads)/sum(pins)
from v$librarycache;
8. 查詢全域性字典中的有效裝載次數
select namespace,pins,reloads,invalidations
from v$librarycache;
9. 回滾段的爭用情況
select name, waits, gets, waits/gets "Ratio"
from v$rollstat a, v$rollname b
where a.usn = b.usn;
10. 監控表空間的 I/O 比例
select df.tablespace_name name,df.file_name "file",f.phyrds pyr,
f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw
from v$filestat f, dba_data_files df
where f.file# = df.file_id
order by df.tablespace_name;
11. 監控檔案系統的 I/O 比例
select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",
a.status, a.bytes, b.phyrds, b.phywrts
from v$datafile a, v$filestat b
where a.file# = b.file#;
12. 在某個使用者下找所有的索引
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
13. 監控 SGA 中字典緩衝區的命中率
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses;
14. 監控 SGA 中共享快取區的命中率,應該小於 1%
select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;
select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
from v$librarycache;
15. 顯示所有資料庫物件的類別和大小
select count(name) num_instances ,type ,sum(source_size) source_size ,
sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
from dba_object_size
group by type order by 2;
16. 監控 SGA 中重做日誌快取區的命中率,應該小於 1%
select name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');
17. 監控記憶體和硬碟的排序比率,最好使它小於 .10 ,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');
18. 監控字典緩衝區
select (sum(pins - reloads)) / sum(pins) "lib cache" from v$librarycache;
select (sum(gets - getmisses - usage - fixed)) / sum(gets) "row cache" from v$rowcache;
select sum(pins) "executions", sum(reloads) "cache misses while executing" from v$librarycache;
後者除以前者 , 此比率小於 1%, 接近 0% 為好
select sum(gets) "dictionary gets",sum(getmisses) "dictionary cache get misses"
from v$rowcache
19. 找 ORACLE 字符集
select * from sys.props$ where name='NLS_CHARACTERSET';
20. 監控 MTS
select busy/(busy+idle) "shared servers busy" from v$dispatcher;
此值大於 0.5 時,引數需加大
select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher';
select count(*) from v$dispatcher;
select servers_highwater from v$mts;
servers_highwater 接近 mts_max_servers 時,引數需加大
21. 碎片程度
select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
having count(tablespace_name)>10;
alter tablespace name coalesce;
alter table name deallocate unused;
create or replace view ts_blocks_v as
select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space
union all
select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
select * from ts_blocks_v;
select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
group by tablespace_name;
檢視碎片程度高的表
SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);
17. 表、索引的儲存情況檢查
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name;
select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner'
group by segment_name;
18 、找使用 CPU 多的使用者 session
12 是 cpu used by this session
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;
2 空間管理
1. 察看資料庫的大小,和空間使用情況
SQL> col tablespace format a20 -- 在顯示中指明列的輸出格式
SQL> select b.file_id -- 檔案 ID,
b.tablespace_name -- 表空間 ,
b.file_name -- 物理檔名 ,
b.bytes -- 總位元組數 ,
(b.bytes-sum(nvl(a.bytes,0))) -- 已使用 ,
sum(nvl(a.bytes,0)) -- 剩餘 ,
sum(nvl(a.bytes,0))/(b.bytes)*100 -- 剩餘百分比
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.file_id,b.bytes
order by b.tablespace_name
/
dba_free_space -- 表空間剩餘空間狀況
dba_data_files -- 資料檔案空間佔用情況
2. 檢視現有回滾段及其狀態
select segment_name,owner,tablespace_name,segment_id,file_id,status from dba_rollback_segs;
3. 表空間大小
select tablespace_name,count(*),sum(blocks),sum(bytes)/1024/1024
from dba_data_files
group by tablespace_name;
4. 表空間使用情況
select df.tablespace_name " 表空間名 ",totalspace " 總空間 M",freespace " 剩餘空間 M",round((1-freespace/totalspace)*100,2) " 使用率 %"
from (select tablespace_name,round(sum(bytes)/1024/1024) totalspace
from dba_data_files
group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace
from dba_free_space
group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name;
5. 刪除表空間
select t.name,d.name from v$tablespace t,v$datafile d where t.name='DATA_HOST_A' and t.ts#=d.ts#;alter tablespace DATA_HOST_A offline;
drop tablespace DATA_HOST_A including contents;
6. 檢視資料檔案的位置
select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;
7. 為這個表空間增加一個數據檔案
alter tablespace 表空間名 add datafile '/u1/oradata/userdata_002.ora' size 50m; --Unix
alter tablespace 表空間名 add datafile 'c:\oradata\userdata_002.ora' size 50m; --Windows NT
8. 重新調整資料檔案的大小
alter database datafile '/u1/oradata/userdata_001.ora' resize 50M; --Unix
alter database datafile 'c:\oradata\userdata_002.ora' resize 50M; --Windows NT
9. 臨時表空間和排序表空間的使用狀態
select substr(vses.username,1,12) "ORA_USER", substr(osuser,1,12) "OS_USER",
substR(sql_text,1,50) "SQL_STMT"
from
V$sqlarea vsql, V$session vses, V$sort_usage vsort
where
vsort.tablespace = 'TEMP' and vsort.sqladdr=vses.sql_address and vsql.address=vsort.sqladdr
select tablespace_name, extent_size, total_extents, used_extents, free_extents, max_used_size
from v$sort_segment;
10. 確定盤區和盤區內容及表或者空間的碎片程度
select segment_name,exten from dba_extents -- 確定盤區的內容
desc dba_segments -- 確定段的內容
-- 返回了結果表明碎片的嚴重
select segment_name ,tablespace_name,extents,segment_type from dba_segments where extents>4
-- 空間碎片嚴重程度
select tablespace_name ,count(tablespace_name) from dba_free_space group by tablespace_name
having count(tablespace_name) >10
3 基本知識
1. 為一個事務指定一個回滾段
set transaction use rollback segment rollback_segment_name -- 指定回滾段
2. 如何建立和使用游標
-- 游標的使用
declare @name char(30)
declare @homebase char(40)
declare @style char(20)
declare @arttist_id int
create artist_cursor cursor
for select * from dim_age
open artist_cursor
fetch artist_cursor into @arttist_id,@homebase,@style
while (@@sqlstatus=0)
begin
print @homebase
print @style
print @arttist_id
end
close artist_cursor
deallocate cursor artist_cursor
go
3. 如何匯出和匯入資料
-- 資料匯出匯入
exp dss/[email protected] query=\"where day_id > 12\" tables=(customer) file= d:\sample.dmp log=
rows=n
full=y tables=() owner= -- 三種匯出方式
imp userid/[email protected]_sid fromuser =( dss,dwh) touser =(dss,dwh) dwh file=sample.dmp
-- 分割槽表的到匯出 user1.table_name:px 分割槽 px
exp user_id/[email protected]_sid tables=(user1.table_name:px) file=sample.dmp
4. 如何使資料庫運行於歸檔模式
1. 開啟 ini.ora 檔案
2. 修改檔案內容
log_archive_start = true
log_archive_dest_1 = "location=D:\Oracle\oradata\ORACLE\archive"
log_archive_format = %%ORACLE_SID%%T%TS%S.ARC
3. 進入服務管理器輸入
shutdown
startup mount
alter database archivelog
alter database open
此時資料庫執行與歸檔模式下可以查詢輸入
archive log list
5. 如何做資料庫的熱備份和恢復
-- 要對資料庫做熱備份需要資料庫執行在歸檔模式下 :
-- 首先使表空間處於備份狀態
-- 拷貝資料檔案
-- 使表空間回覆到正常狀態
-- 進入 sqlplus 輸入:
alter tablespace users begin backup ;
$ copy d:\oracle_home\usr.ora d:\backup\user.dbf;
alter tablespace users end backup ;
alter system checkpoint ;
-- 恢復資料庫需要做如下的步驟:
-- 將映像備份檔案拷貝到各個表空間對應的正確的位置
svrmgrl
connect internal
startup mount
alter database open
recover database
6. 如何檢視所有的表和建立結構相同的表
1 、檢視當前所有物件
SQL> select * from tab;
2 、建一個和 a 表結構一樣的空表
SQL> create table b as select * from a where 1=2;
SQL> create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;
7. 如何檢視當前日期
SQL> select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
8. 如何在使用者間複製資料
SQL> copy from user1 to user2 create table2 using select * from table1;
9. 檢視中不能使用 order by ,但可用 group by 代替來達到排序目的
SQL> create view a as select b1,b2 from b group by b1,b2;
10. 通過授權的方式來建立使用者
SQL> grant connect,resource to test identified by test default tablespace users;
SQL>alter user test quota 100M on users-- 在指定的表空間中為某個使用者分配資源
SQL> conn test/test
如果不給使用者 connect 和 resource 角色的話那麼他們在指定的表空間中將
無法建立物件,比如 create table
11. 如何鎖定使用者的賬號和密碼
alter user test account unlock/lock;
12. 如何在命令列安裝
runInstaller -responsefile filename [-silent] [-nowelcome]
13. 如何使用作業系統認證
Set REMOTE_LOGIN_PASSWORDFILE to NONE
CONNECT / AS SYSDBA
CONNECT / AS SYSOPER
14. 如何通過密碼檔案認證
$orapwd file=$ORACLE_HOME/dbs/orapw SID password=admin entries=10
Set REMOTE_LOGIN_PASSWORDFILE to EXCLUSIVE or SHARED
CONNECT INTERNAL/CONNECT
15. 如何進行管理例程
STARTUP PFILE=/DISK1/initU15.ora
STARTUP[FORCE][RESTRICT][PFILE=filename][OPEN RECOVER][ database]|MOUNT|NOMOUNT]
ALTER DATABASE database MOUNT;
ALTER DATABASE database OPEN READ
ALTER DATABASE database OPEN READ ONLY;
ALTER DATABASE { MOUNT | OPEN }
ALTER DATABASE OPEN [READ WRITE| READ ONLY]
16. 如何建立物化檢視
CREATE MATERIALIZED VIEW LOG ON sales
WITH SEQUENCE, ROWID
(prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)
INCLUDING NEW VALUES; 首先建立檢視日誌
CREATE MATERIALIZED VIEW sum_sales
PARALLEL
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT s.prod_id, s.time_id,COUNT(*) AS count_grp,SUM(s.amount_sold) AS sum_dollar_sales,
COUNT(s.amount_sold) AS count_dollar_sales,SUM(s.quantity_sold) AS sum_quantity_sales,
COUNT(s.quantity_sold) AS count_quantity_sales
FROM sales s
GROUP BY s.prod_id, s.time_id; 然後建立檢視
17. 分割槽表的建立、更改和刪除等管理
-- 建立表空間
create tablespace space_name1 datafile '/oradata/space_name1.dbf' size 100m
-- 建立分割槽表
create table mx_xsmx (cat char(1) , product varchar(20))
partition by range(cat) 有 range hash list 三種分割槽方法
(partition xsmx_01 values less than ('B') tablespace space_name1,
partition xsmx_02 values less than (maxvalue) tablespace space_name1)
-- 新增分割槽
alter table mx_xsmx add partition xsmx_03 values less than ('Z')
-- 將某一個分割槽割裂
alter table mx_xsmx split partition xsmx_03 at ('G') into (partition xsmx_04,partition xsmx_05)
-- 刪除分割槽
alter table mx_xsmx drop partition xsmx_04
alter table mx_xsmx truncate partition xsmx_04
alter table mx_xsmx rename partition xsmx_04 to xsmx_06
alter table mx_xsmx modify partition xsmx_01
storage (next 1m pctincrease 0)
-- 分割槽表的匯出 某個分割槽
exp sales/sales_password tables=mx_xsmx:xsmx_01 rows=Y
file=sales1999_q1.dmp
---- 6 、 IMPORT 分割槽:
---- ORACLE8 的 IMPORT 工具可在表的分割槽以及匯入資料,例如在 2001 年,使用者要檢視 1999 年的資料, DBA 必須匯入 1999 年的資料,使之線上,操作如下: STEP1 、建立表的 1999 年的四個表空間和相應的分割槽,參照( 2 ); STEP2 、匯入資料:
oracle$ imp sales/sales_password FILE =sales1999_q1.dmp
TABLES = (sales:sales1999_q1) IGNORE=y
-- 選擇指定的分割槽來查詢結果
select * from mx_xsmx partition (xsmx_04) where DeptNo between 11 and 20
-- 對分割槽表來作索引
create index index_name on table_name(DeptNO 列名 )
local (partition part1 tablespace space_idx1, partition part2 tablespace space_idx2)
18. 建立表的語句中引數的含義
建立表及其引數含義
CREATE TABLE MB_CPZ (
YWFWDM VARCHAR2 (4),
CPZDM VARCHAR2 (2))
TABLESPACE DWSDATA
PCTFREE 10 -- 本引數設定為非零的時候後臺 SMON 程序會自動合併相鄰的自由範圍 .
PCTUSED 40 -- 為恢復 INSERT 操作而設定的。
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 65536 -- 初始範圍為 65536 個位元組就是 64K , oracle 的塊大小我們設定為 8K 。這也是 Oracle 給出的預設值
NEXT 0 -- Oracle 將不會考慮這個設定的值
MINEXTENTS 1 -- 最少 1 個範圍
MAXEXTENTS 2147483645 -- 最大範圍 Oracle 將不會考慮這個設定的值
FREELISTS 1 FREELIST GROUPS 1 )
NOCACHE; 不放入快取記憶體
[LOGGING|NOLOGGING] 所有的對錶的操作都要記入 REDOLOG , ORACLE 建議使用 NOLOGGING ;
手動修改表的引數
ALTER TABLE 名稱 PCTFREE 20 PCTUSED 50 STOAGE ( MAXEXTENTS 1000 );
手工分配空間
ALTER TABLE 名稱 ALLOCATE EXTENT ( SIZE 500K DATAFILE ' ' );
19. 索引的基本知識
一、索引的分類:
1 、邏輯上:
單列索引 複合索引 唯一索引 非唯一索引
2 、物理上:
B-TREE OR BITMAP
B-TREE ( NORMAL 和反向索引)
二、 CREATE INDEX
CREATE INDEX 名稱 ON 表名(列名) PCTFREE 30 STORAGE (。。。。。) TABLESPACE 名稱沒有定義 PCTUSED :索引是按照一定儲存的,如果通過 PCTUSED 允許恢復對 BLOCK 的 INSERT 操作,可能影響 INDEX 的效率。
三、建立索引的注意事項
1 、索引對查詢效能有提高,但對 DML 語句有影響。
2 、索引也應該放在一個專用的表空間
3 、定義索引的 EXTENT 的大小時, =5*DB BLOCK
4 、建立索引時,應採用 NOLOGGING 方式。
四、修改索引
ALTER INDEX 名稱 STORAGE (新值)
五、分配空間給索引
1 、 ALTER INDEX 名稱 ALLOCATE EXTENT ( SIZE 200K DATAFILE ' 。。 ' )
六、重建索引
1 、提高查詢效能
2 、當一個索引重建時,老的索引會在新索引建立完成後,被刪除。
3 、新索引建立過程中,老的索引仍可用於查詢。
4 、硬碟的開銷大,
七、 DROP 一個索引
DROP INDEX 名稱
八、資訊獲取
1 、 DBA_INDEXES: 建索引的引數
2 、 DBA_IND_COLUMNS:
20.ORACLE 中使用者管理
一、 ORACLE 的安全域
1 、 TABLESPACE QUOTAS :表空間的使用定額
2 、 DEFAULT TABLESPACE :預設表空間
3 、 TEMPORARY TABLESPACE :指定臨時表空間。
4 、 ACCOUNT LOCKING :使用者鎖
5 、 RESOURCE LIMITE :資源限制
6 、 DIRECT PRIVILEGES :直接授權
7 、 ROLE PRIVILEGES :角色授權先將應用中的使用者劃為不同的角色,
二、建立使用者時的清單:
1 、選擇一個使用者名稱稱和檢驗機制: A ,看到使用者名稱,實際操作者是誰,業務中角色。
2 、選擇合適的表空間:
3 、決定定額:
4 、口令的選擇:
5 、臨時表空間的選擇:先建立一個臨時表空間,然後在分配。不分配,使用 SYSTEM 表空間
6 、 CREATE USER
7 、授權: A ,使用者的工作職能 B ,使用者的級別
三、使用者的建立:
1 、命令:
CREATE USER 名稱 IDENTIFIED BY 口令 DEFAULT TABLESPACE 預設表空間名 TEMPOARAY TABLESPACE 臨時表空間名 QUOTA 15M ON 表空間名
[PASSWORD EXPIRE] :當用戶第一次登陸到 ORACLE ,建立時所指定的口令過期失效,強迫使用者自己定義一個新口令。 [ACCOUNT LOCK] :加使用者鎖
QUOTA UNLIMITED ON TABLESPACE :不限制,有多少有多少。
[PROFILE 名稱 ] :受 PROFILE 檔案的限制。
四、如何控制使用者口令和使用者鎖
1 、強迫使用者修改口令: ALTER USER 名稱 IDENTIFIED BY 新口令 PASSWORD EXPIRE ;
2 、給使用者加鎖: ALTER USER 名稱 ACCOUNT [LOCK|UNLOCK]
3 、注意事項:
A 、所有操作對當前連線無效
B 、 1 的操作適用於當用戶忘記口令時。
五、更改定額
1 、命令: ALTER USER 名稱 QUOTA 0 ON 表空間名
ALTER USER 名字 QUOTA (數值) K|M|UNLIMITED ON 表空間名;
2 、使用方法:
A 、控制使用者資料增長
B 、當用戶擁有一定的資料,而管理員不想讓他在增加新的資料的時候。
C 、當將使用者定額設為零的時候,使用者不能建立新的資料,但原有資料仍可訪問。
六、 DROP 一個 USER
1 、 DROP USER 名稱 適合於刪除一個新的使用者
2 、 DROP USER 名稱 CASCADE : 刪除一個使用者,將使用者的表,索引等都刪除。
3 、對連線中的使用者不好用。
七、資訊獲取:
1 、 DBA_USERS: 使用者名稱,狀態,加鎖日期,預設表空間,臨時表空間
2 、 DBA_TS_QUOTAS: 使用者名稱,表空間名,定額。
兩個表的連線欄位: USERNAME
GRANT CREATE SESSION TO 使用者名稱
21.PROFILE 的管理(資原始檔的管理)
一、 PROFILE 的管理內容:
1 、 CPU 的時間
2 、 I/O 的使用
3 、 IDLE TIME (空閒時間)
4 、 CONNECT TIME (連線時間)
5 、併發會話數量
6 、口令機制:
二、 DEFAULT PROFILE :
1 、所有的使用者建立時都會被指定這個 PROFILE
2 、 DEFAULT PROFILE 的內容為空,無限制
三、 PROFILE 的劃分:
1 、 CALL 級 LIMITE :
物件是語句:
當該語句資源使用溢位時:
A 、該語句終止
B 、事物回退
C 、 SESSION 連線保持
2 、 SESSION 級 LIMITE :
物件是:整個會話過程
溢位時:連線終止
四、如何管理一個 PROFILE
1 、 CREATE PROFILE
2 、分配給一個使用者
3 、象開關一樣開啟限制。
五、如何建立一個 PROFILE :
1 、命令: CREATE PROFILE 名稱
LIMIT
SESSION_PER_USER 2
CPU_PER_SESSION 1000
IDLE_TIME 60
CONNECT_TIME 480
六、限制引數:
1 、 SESSION 級 LIMITE :
CPU_PER_SESSION: 定義了每個 SESSION 佔用的 CPU 的時間:( 1/100 秒)
2 、 SESSION_PER_USER: 每個使用者的併發連線數
3 、 CONNECT_TIME: 一個連線的最長連線時間(分鐘)
4 、 LOGICAL_READS_PER_SESSION: 一次讀寫的邏輯塊的數量
5 、 CALL 級 LIMITE
CPU_PER_CALL: 每個語句佔用的 CPU 時間
LOGICAL_READS_PER_CALL:
七、分配給一個使用者:
CREATE USER 名稱。。。。。。
PROFILE 名稱
ALTER USER 名稱 PROFILE 名稱
八、開啟資源限制:
1 、 RESOURCE_LIMT: 資原始檔中含有
2 、 ALTER SYSTEM SET RESOURCE_LIMIT=TRUE ;
3 、預設不開啟
九、修改 PROFIE 的內容:
1 、 ALTER PROFILE 名稱引數 新值
2 、對於當前連線修改不生效。
十、 DROP 一個 PROFILE
1 、 DROP PROFILE 名稱
刪除一個新的尚未分配給使用者的 PROFILE ,
2 、 DROP PROFILE 名稱 CASCADE
3 、注意事項
A 、一旦 PROFILE 被刪除,使用者被自動載入 DEFAULT PROFILE
B 、對於當前連線無影響
C 、 DEFAULT PROFILE 不可以被刪除
十一、資訊獲取:
1 、 DBA_USERS:
使用者名稱, PROFILE
2 、 DBA_PROFILES:
PROFILE 及各種限制引數的值
每個使用者的限制: PROFILE (關鍵欄位)
十二、 PROFILE 的口令機制限制
1 、限制內容
A 、限制連續多少次登入失敗,使用者被加鎖
B 、限制口令的生命週期
C 、限制口令的使用間隔
2 、限制生效的前提:
A RESOURCE_LIMIT:=TRUE
B ORACLE\RDBMS\ADMIN\UTLPWDMG.SQL
3 、如何建立口令機制:
CREATE PROFILE 名稱
SESSIONS_PER_USER
.....
password_life_time 30
failed_log_attempts 3
password_reuse_time 3
4 、引數的含義:
A FAILED_LOGIN_ATTEMPTS:
當連續登陸失敗次數達到該引數指定值時,使用者加鎖
B PASSWORD_LOCK_TIME: 加鎖天數
C PASSWORD_LIFE_TIME: 口令的有效期(天)
D PASSWORD_GRACE_TIME: 口令修改的間隔期(天)
E PASSWORD_REUSE_TIME: 口令被修改後原有口令隔多少天被重新使用。
F PASSWORD_REUSE_MAX: 口令被修改後原有口令被修改多少次被重新使用。
22.ORACLE 的許可權管理
一授權的兩種分類 :
1 SYSTEM 授權 : 允許特定的使用者對特定的一類物件做特定的操作 . 可操作的物件 :TABLES,INDEXES,PROCEDURES,SEGMENTS; 系統授權是對某一類物件 .
GRANT SELECT ANY TABLE TO ZT
2 OBJECT( 物件授權 ):
A 允許一個特定的使用者對一個特定的物件做特定的操作 . 物件 :TABLE,INDEX,SEGMENT,..
GRANT UPDATE ON EMP TO ZT
二系統授權的特點
1 ORACLE 中有超過 80 種以上的 SYSTEM 授權
2 幾乎所有的 SYSTEM 授權包含 ANY 關鍵字
3 SYSTEM 授權 :GRANT 授權
4 SYSTEM 授權 :REVOKE 回收
5 允許使用者做系統一級的操作 , 建表空間 , 建 SESSION.
6 最常用的系統授權 :
INDEX:CREATE ANY INDEX
ALTER ANY INDEX
DROP ANY INDEX
TABLE:CREATE ANY TABLE
ALTER .........
DROP .........
SELECT .......
UPDATE.........
SESSION:CREATE SESSION
ALTER SESSION
RESTRICTED SESSION
TABLESPACE: CREATE TABLESPACE
ALTER TABLESPACE
DROP TABLESPACE
三如何授權 :
1 命令格式
GRANT CREATE SESSION,SELECT ANY TABLE TO [USERNAME|PUBLIC|ROLE]
2 帶有轉授許可權 :
A 轉授 : 當 A 使用者得到系統授權後 , 如果可以將這個許可權授給別人 , 稱轉授 .
GRANT CREATE SESSION,SELECT ANY TABLE
TO [USERNAME|PUBLIC|ROLE] WITH ADMIN OPTION
舉例 :
1 SYSTEM->ZT
GRANT CREATE SESSION TO ZT WITH ADMIN OPTION
ZT 使用者可以擁有 CREATE SESSION 許可權
2 ZT->OLM
GRANT CREATE SESSION TO OLM,
ZT,OLM 也有了 .
四 SYSDBA 和 SYSOPER 系統許可權
1 SYSOPER:SYSTEM OPERATOR: 系統操作員
STARTUP,SHUTDOWN;
ALTER DATABASE[MOUNT|OPEN];
RECOVER TABLESPACE
BACKUP DATABASE
ARCHIVELOG OR NOARCHIVELOG;
2 SYSDBA
SYSTEM DABASE ADMIN: 資料庫管理員 ,
SYSOPER WITH ADMIN OPTION
RECOVER DATABASE
CREATE DATABASE
五資訊獲取
DBA_SYS_PRIVS
GRANTEE: 得到許可權的人
PRIVILEGE: 得到何種許可權
ADMIN OPTION: 是否可以轉授
想知道 SCOTT 有多少許可權
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='SCOTT'
六回收許可權 :
REVOKE 許可權 FROM [USERNAME|PUBLIC|ROLE]
舉例 :
SYSTEM->ZT(CREATE SESSION WITH ADMIN OPTION)
ZT->OLM(CREATE SESSION)
七物件授權
TABLE: ALTER DELETE SELECT UPDATE INSERT
INDEX:DELETE INSERT SELECT UPDATE
CREATE, 物件是已經存在的事物 , 授權者是所有者 .
一 , 授權 :
GRANT UPDATE(ENAME) ON EMP TO ZT WITH GRANT OPTION
二資訊獲取
1 DBA_TAB_PRIVS:
GRANTEE: 得到者
GRANTOR: 授權者
PRIVILEGE: 許可權
GRANTABLE: 是否可以轉授
OWNER: 所有者
三 回收物件授權
1 REVOKE 許可權 FROM 使用者
第十五章 : 角色管理
一 , 角色及其特點 :
1, 角色實際上是若干許可權的集合體
2,DBA 通過為應用中的不同使用者 , 不同職責 , 定義不同的角色 , 可以達到減少工作量的目的 .
3, 角色的使用同授權一樣 , 可以用 GRANT 授權 ,REVOKE 回收 .
4, 角色可以象開關一樣開啟關閉
5, 角色的使用可以提高效能 .
6, 角色的使用可以大大減少工作量
二 建立角色
1 CREATE ROLE 名
2 CREATE ROLE 名
IDENTIFIED BY 口令
三 修改角色
1 ALTER ROLE 名稱 IDENTIFIED BY 口令
將沒有口令的加一個口令
2ALTER ROLE 名稱 NOT IDENTIFIED
將有口令的變為沒有口令
三 分配一個角色
GRANT ROLE 名 TO 使用者名稱
四 回收一個角色
REVOKE ROLE 名 FROM 使用者名稱
五 如何建立一個預設角色
只有設為預設角色 , 才可以在使用者登入時 , 使角色所含有的許可權生效
1 ALTER USER SCOTT
DEFAULT ROLE 角色 1, 角色 2
2 ATLER USR SCOTT
DEFAULT ROLE ALL
3 ALTER USER SCOTT DEFAULT ROLE ALL EXCEPT 角色名
4 ALTER USER SCOTT DEFAULT ROLE NONE
六 開啟和關閉角色 :
1 SET ROLE 名稱
2 SET ROLE IDENTIFIED BY 口令 ,( 建立角色時 , 帶口令 )
3 SET ROLE NONE
七 刪除角色
DROP ROLE 名稱
八 資訊獲取
DBA_ROLE:
DBA_ROLE_PRIVS:
九 如何向角色里加許可權 :
GRANT 許可權 TO 角色名
REVOKE 許可權 FROM 角色名
角色 :1 不能跟使用者名稱重複
2 ROLE 的 ALTER 和其他物件的 ALTER 不一樣 ,ROLE 的 ALTER 不能修改 ROLE 的內容 , 只可以修改角色的認證方式
23. 如何建立資料庫連線 database link
如果伺服器的初始化引數中 global_names 的值為 TRUE 那麼就要求你建立的連線名稱必須與 SID 相同,如果改成 FALSE 就可以按如下的方式建立了
create public database link link_name connect to user_name identified by passwd using ‘connecting_string’
然後可以建立一個同義詞為使用方便起見。
create synonyms synonyms_name for @ link_name
24. 回滾段的管理
1. 回滾段概述
回滾段用於存放資料修改之前的值(包括資料修改之前的位置和值)。回滾段的頭部包含正在使用的該回滾段事務的資訊。一個事務只能使用一個回滾段來存放它的回滾資訊,而一個回滾段可以存放多個事務的回滾資訊。
2. 回滾段的作用
事務回滾 :當事務修改表中資料的時候,該資料修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務( ROLLBACK )時, ORACLE 將會利用回滾段中的資料前影像來將修改的資料恢復到原來的值。
事務恢復 :當事務正在處理的時候,例程失敗,回滾段的資訊儲存在重做日誌檔案中, ORACLE 將在下次開啟資料庫時利用回滾來恢復未提交的資料。
讀一致性 :當一個會話正在修改資料時,其他的會話將看不到該會話未提交的修改。而且,當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)。當 ORACLE 執行 SELECT 語句時, ORACLE 依照當前的系統改變號( SYSTEMCHANGENUMBER-SCN )來保證任何前於當前 SCN 的未提交的改變不被該語句處理。可以想象:當一個長時間的查詢正在執行時,若其他會話改變了該查詢要查詢的某個資料塊, ORACLE 將利用回滾段的資料前影像來構造一個讀一致性檢視。
事務級的讀一致性
ORACLE 一般提供 SQL 語句級( SQLSTATEMENTLEVEL )的讀一致性,可以用以下語句來實現事務級的讀一致性。
SET TRANSACTION READONLY ;
或:
SET TANNSACTION SERIALIZABLE ;
以上兩個語句都將在事務開始後提供讀一致性。需要注意的是,使用第二個語句對資料庫的併發性和效能將帶來影響。
3. 回滾段的種類
系統回滾段:當資料庫建立後,將自動建立一個系統回滾段,該回滾段只用於存放系統表空間中物件的前影像。
非系統回滾段:擁有多個表空間的資料庫至少應該有一個非系統回滾段,用於存放非系統表空間中物件的資料前影像。非系統回滾段又分為私有回滾段和公有回滾段,私有回滾段應在引數檔案的 ROLLBACKSEGMENTS 引數中列出,以便例程啟動時自動使其線上( ONLINE )。公有回滾段一般在 OPS ( ORACLE 並行伺服器)中出現,將在例程啟動時自動線上。
DEFERED 回滾段:該回滾段在表空間離線( OFFLINE )時由系統自動建立,當表空間再次線上( ONLINE )時由系統自動刪除,用於存放表空間離線時產生的回滾資訊。
4. 回滾段的使用
分配回滾段:當事務開始時, ORACLE 將為該事務分配回滾段,並將擁有最少事務的回滾段分配給該事務。事務可以用以下語句申請指定的回滾段:
SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment
事務將以順序,迴圈的方式使用回滾段的區( EXTENTS ),噹噹前區用滿後移到下一個區。幾個事務可以寫在回滾段的同一個區,但每個回滾段的塊只能包含一個事務的資訊。
例如(兩個事務使用同一個回滾段,該回滾段有四個區):
1 、事務在進行中,它們正在使用回滾段的第三個區;
2 、當兩個事務產生更多的回滾資訊,它們將繼續使用第三個區;
3 、當第三個區滿後,事務將寫到第四個區,當事務開始寫到一個新的區時,稱為翻轉( WRAP );
4 、當第四個區用滿時,如果第一個區是空閒或非活動(使用該區的所有事務完成而沒有活動的事務)的,事務將接著使用第一個區。
回滾段的擴張( EXTEND )
噹噹前回滾段區的所有塊用完而事務還需要更多的回滾空間時,回滾段的指標將移到下一個區。當最後一個區用完,指標將移到第一個區的前面。回滾段指標移到下一個區的前提是下一個區沒有活動的事務,同時指標不能跨區。當下一個區正在使用時,事務將為回滾段分配一個新的區,這種分配稱為回滾段的擴充套件。回滾段將一直擴充套件到該回滾段區的個數到達回滾段的引數 MAXEXTENTS 的值時為止。
回滾段的回收和 OPTIMAL 引數
OPTIMAL 引數指明回滾段空閒時收縮到的位置,指明回滾段的 OPTIMAL 引數可以減少回滾段空間的浪費。
5. 建立回滾段
語法:
CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment
[TABLESPACE tablespace]
[STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]]
[MINEXTENTS integer]
[MAXTENTS {integer|UNLIMITED}]
[OPTIMAL {integer[K|M]|NULL}]) ]
注:
回滾段可以在建立時指明 PRIVATE 或 PUBLIC ,一旦建立將不能修改。
MINEXTENTS 必須大於等於 2
PCTINCREASE 必須是 0
OPTIMAL 如果要指定,必須大於等於回滾段的初始大小(由 MINEXTENTS 指定)
建議:
一般情況下, INITIAL=NEXT
設定 OPTIMAL 引數來節約空間的使用
不要設定 MAXEXTENTS 為 UNLIMITED
回滾段應建立在一個特定的回滾段表空間內
CREATE ROLLBACK SEGMENT rbs01
TABLESPACE rbs
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 10
MAXEXTENTS 500 OPTIMAL 1000K);
6. 回滾段的資訊
DROP ROLLBACK SEGMENT rbs01;
查詢回滾段的資訊
所用資料字典: DBA_ROLLBACK_SEGS
可以查詢的資訊:回滾段的標識 (SEGMENT_ID) 、名稱 (SEGMENT_NAME) 、所在表空間 (TABLESPACE_NAME) 、型別 (OWNER) 、狀態 (STATUS) 。
例:
SQL>SELECT segment_name,tablespace_name,owner,status FROM dba_rollback_segs;
回滾段的統計資訊
資料字典: V$ROLLNAME,V$ROLLSTAT
SELECT n.name,s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.status
FROM v$rollname n,v$rollstat s
WHERE n.usn=s.usn;
回滾段的當前活動事務
資料字典: V$SESSION,V$TRANSACTION
SQL>SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk
FROM v$session s,v$transaction t
WHERE s.saddr=t.ses_addr;
4 函式用法
1. 時間函式
select add_months(sysdate,2) from dual
select last_day(sysdate) from dual
select next_day(sysdate,'FRIDAY') from dual
select months_between('19 MAY 95',add_months(sysdate,2)) duration from dual
2. 字元函式
select chr(67) from dual
select concat('asf','af') / 列 1|| 列 2 from dual
select initcap('sample') from dual
select lower('SSD')/upper('ssd') from dual
select lpad('myname',20,'*') from dual -- 左邊填充指定長度的字元
select rpad('myname',20,'*') from dual
select ltrim('myname','m') /rtrim('myname','m') from dual
select replace('myname','yn','*') from dual
select substr('myname',2,6) from dual
select instr('myname','n',1,1) from dual
select length('myname') from dual
3. 轉換函式
select to_char(sysdate)||'Is good day!' from dual
select to_number('23') from dual
select least(34,567,3,45,1090) / greatest(34,567,3,45,1090) from dual
select user from dual -- 查詢當前使用者
4.decode 函式
select decode(columnname,'1','first','2','second','other' ) from table_name
-- 如果 columnname 等於 1 那麼取 first 值,如果等於 2 取 second 否則等於 other 。實現邏輯控制
5. 連線的用法
select last_name, d.dept_id
from employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
5 常見問題
1 .字符集問題
錯誤現象:
1 、有的時候,伺服器資料先匯出,重灌伺服器,再匯入資料,結果,發生資料查詢成 ??? 。
2 、有時,伺服器設定就有問題,字符集設成單位元組了。
錯誤原因:
一般,是因為字符集設定不對照成的。 如果兩臺伺服器上的字元設定不同就造成資料不能通訊,那麼最簡單的方法就是將字符集設定成一樣的格式。
解決方法:
1 、檢查伺服器上 Oracle 資料庫的字符集
SQL> conn sys/change_on_install
連線成功 .
SQL> desc props$
列名 可空值否 型別
------------------------------- -------- ----
NAME NOT NULL VARCHAR2(30)
VALUE$ VARCHAR2(2000)
COMMENT$ VARCHAR2(2000)
SQL> col value$ format a40
SQL> select name,value$ from props$;
NAME VALUE$
------------------------------ -------------------------
DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_CALENDAR GREGORIAN
NLS_RDBMS_VERSION 7.3.4.0.0
GLOBAL_DB_NAME ORACLE.WORLD
EXPORT_VIEWS_VERSION 3
查詢到 14 記錄 .
NLS_CHARACTERSET 這個引數應該是 ZHS16GBK ,如不是,改為它。
SQL*Plus 中修改方法:
SQL> update props$ set value$=' 新字符集 ' where name='NLS_CHARACTERSET';
作業系統中修改方法:
connect internal
alter database ORCL character set ZHS16GBK;
alter database ORCL national character set ZHS16GBK;
2 、檢查作業系統級 Oracle 漢字顯示的字符集
執行 regedit ,定位到:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
找到以下字串
NLS_LANG
檢查是否以下內容,如不是,改之
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
2.回滾段太舊問題
3 .備份與恢復
一:非歸檔備份
執行 testsql1.txt
關閉系統,利用 oracle backup manager 備份資料
開啟資料庫,執行 testsql2.txt 關閉資料庫系統。
刪除 ts_test2 檔案
重新啟動資料庫時出現 1157,1110 錯誤,處理方法:
1 :利用 oracle recovery manager 恢復資料。
2:alter database datafile 'd:\orant\database\ts_test2' offline drop;
然後開啟資料庫即可(丟失 ts_test2 檔案內容)。
注意:
1:alter database datafile 'd:\orant\database\ts_test2' offline 只能在 archivelog
模式下時才可使用。刪除檔案後,建議把表空間刪除後重建。
2: 刪除表空間 drop tablespace ts_test including contents;
3: 重建表空間
二:丟失沒有回滾段的非 SYSTEM 資料檔案(在歸檔模式下執行)
A :使用 recover database 恢復,要求資料庫安裝但沒有開啟,即離線備份
B :使用 recover datafile 恢復,要求資料檔案要離線但資料庫是開啟的
C :使用 recover tablespace 恢復,要求表空間離線且資料庫是開啟的
問題產生過程:
svrmgrl
connect internal
insert into myinfo values(34,'myname34','no');
.......
commit;
alter system switchlogfile;
shutdown abort
( 刪除 ts_test1