1. 程式人生 > >轉載】Oracle的日常監控指令碼 Oracle管理及常用基礎指令碼

轉載】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