ORACLE 服務器的配置及優化

发表于:2007-07-02来源:作者:点击数: 标签:
ORACLE 服務器的配置及優化 1. 在ORACLE中實現分布式快速存取和充實內存是很重要的。 要不惜任何代價避免頁面調度和交換﹐每次都必須把系統全局區(SGA)放到內存。 將SGA放到內存中﹐在INIT.ORA中設置參數 PRE_PAGE_SGA PRE_PAGE_SGA=YES 2. 回卷段的竟爭會降
  ORACLE 服務器的配置及優化
1.        在ORACLE中實現分布式快速存取和充實內存是很重要的。

        要不惜任何代價避免頁面調度和交換﹐每次都必須把系統全局區(SGA)放到內存。

將SGA放到內存中﹐在INIT.ORA中設置參數 PRE_PAGE_SGA

   PRE_PAGE_SGA=YES

2.        回卷段的竟爭會降低系統的性能

SELECT  GETS,WAITS  FROM V$ROLLSTAT;

GETS代表回卷段被訪問的次數

WAITS代表進程等待回卷段中哪個進程的次數

如果GETS與WAITS的比大于2%表示存在竟爭問題

解決辦法是創建更多的回卷段。

有兩種類型的鎖存竟爭會產生嚴重的后果﹕立即鎖存(IMMEDIATE)和等待(WAIT)鎖存。

等待鎖存的計算公式﹕

     WAIT CONTENTION=(MISSES/(GETS+MISSES))*100

立即鎖存的計算公式﹕

     IMMEDIATE CONNECTION=(IMMEDIATE_MISSES/(IMMEDIATE_GETS+IMMEDIATE_MISSES))*100

如果任何一個值>0則就存在對鎖存的竟爭

如果發生恢復分配鎖存的竟爭﹐可以減小INIT.ORA中的LOG_SMALL_ENTRY_MAX_SIZE的參數值。如果發生恢復復制竟爭﹐可以增大INIT.ORA中的LOG_SIMULATANOUS_COPIES的參數值。

任何回卷段的OPTIMAL參數的設置不能太小﹐如果OPTIMAL<MINEXTENTS會降低系統的操作性能。

SELECT  CLASS,COUNT  FROM V$WAITSTAT  WHERE UPPER(CLASS) IN (‘SYSTEM UNDO HEADER)’,’SYSTEM  UNDO BLOCK’,

‘UNDO  HEADER’,’UNDO  BLOCK’);

    SELECT SUM(VALUE)  FROM  V$SYSSTAT  WHERE UPPER(NAME)

IN (‘DB  BLOCK  GETS’,’CONSISTENT  GETS’);

    第一條查詢中的每一類與第二條查詢中的比率最好<0.01

3.        提高緩沖區的效率。

SELECT  RELOADS,PINS FROM V$LIBRARYCACHE;

   RELOADS存入SQL命令被載入和分解的次數

PINS存入數據庫對SQL高速緩沖區查找一條語句的次數

如果RELOADS與PINS的比率大于1%則應增加INIT.ORA中的SHARED_POOL_SIZE的參數值。

   SELECT GETMISSES,GETS FROM V$ROWCACHE;

   如果RELOADS與PINS的比率大于10%則應增加INIT.ORA中的

SHARED_POOL_SIZE的參數值。

4.        用戶任何時點擁有的打開游標的最大數

修改INIT.ORA中的OPEN_CURSORS的參數值。

 與高速緩存有關的是游標在會話中的緩存方式。

 在INIT.ORA中增加 SESSION_CACHED_CURSORS=100

5.        SELECT SUM(GETS),SUM(GETMISSES)  FROM V$ROWCACHE;

必須使GETMISSES比率接近0, 為了優化性能﹐可以增加INIT.ORA中的參數SHARED_POLL_SIZE和DB_BLOCK_BUFFERS的值。

6.        SELECT NAME,VALUE FROM V$SYSSTAT WHERE UPPER(NAME) IN

(‘SORTS(MEMORY)’,’SORTS(DISK)’);

如果用于磁盤上的排序量較高﹐可以增加INIT.ORA中的SORT_AREA_SIZE的值。

7.        LGWR的日志文件如果切換太快會影響數據庫的活動﹐導致性能的下將。

在INIT.ORA 中 CHECKPOINT_PROCESS=TRUE

               LOG_CHECKPOINT_INTERVAL=10000

               LOG_CHECKPOINT_TIMEOUT=1800

8.        多線程服務器(MTS)的配置

1>      MTS_SERVICE

這是調度程序用來向SQL*NET監聽器注冊服務的服務名。

最好取和SID相同的名稱。

2>      MTS_DISPATCHERS

配置調度進程的數目。

3>      MTS_MAX_DISPATCHERS

   配置調度進程的最大數目。

4>      MTS_SERCERS

啟動共享服務器的最初數目。

5>      MTS_MAX_SERVERS

設置共享服務器的最大數目。

6>      MTS_LISTENTER_ADDRESS

       這是調度程序用來向SQL*NET監聽器注冊服務的服務名的地址。

一個MTS的配置例子:

在INIT.ORA中

mts_listener_address=’(ADDRESS=(PROTOCOL=TCP)(KEY=MYDB))’

mts_dispatchers=’tcp,10’

mts_dispatchers=’ipx,2’

mts_max_dispatchers=10

mts_max_servers=10

mts_servers=2

在LISTENER.ORA中應包括下類似的內容:

LISTENER=

  (ADDRESS_LIST=

     (ADDRESS=

      (PROTOCOL=IPX)

  (KEY=MYDB)

     )

    (ADDRESS=

      (PROTOCOL=TCP)

      (HOST=OURHOST)

      (PORT=1521

    )

STARTUP_WAIT_TIME_LISTENER=0

CONNECT_TIMEOUT_LISTENER=10

TRACE_LEVEL_LISTENER=ADMIN

SID_LIST_LISTENER=

  (SID_LIST=

    (SID_DESC=

      (SID_NAME=MYDB)

    )

  )

添加MTS參數之后要重新啟動數據庫。

在SQL*PLUS下用PS命令檢查共享服務器和調度程序是否存在。

Ø       PS  -EF|GREP  FOXMOLD;

具有ORA_SNNN_SID和ORA_DNNN_SID名稱的進程分別是共享服務器和調度進程。

SELECT USERNAME,PROGRAM,SERVER  FROM V$SESSION WHERE AUDSID=USERENV(‘SESSIONID’);

在SERVER列中返回的值應該是SHARED,如果是DEDICATED,就說明沒有正確配置MTS.

用LSNRCTL  SERVICES命令來檢查調度程序是否向監聽器登記了服務。

7. 移動數據庫文件

第一種方法﹕(ALTER DATABASE)

關閉數據庫-移動數據文件-裝載并改名-啟動

1>      SVRMGRL

2>      CONNECT  INTERNAL

3>      SHUTDOWN

4>      EXIT

5>      MV  /U/PRODUCT/ORADATA/FOXMOLD/USER01.DBF     /DB3/ORADATA

6>      SVRMGRL

7>      CONNECT  INTERNAL

8>      STARTUP  MOUNT  FOXMOLD

9>      ALTER DATABASE RENAME FILE

‘/U/PRODUCT/ORADATA/FOXMOLD/USER01.DBF’ TO

‘/DB3/ORADATA/USER01.DBF’

   10> ALTER  DATABASE  OPEN

第二種方法﹕(ALTER  TABLESPACE)

關閉數據庫-移動數據文件-裝載并改名-啟動

1>      SVRMGRL

2>      CONNECT  INTERNAL

3>      SHUTDOWN

4>      EXIT

5>      MV  /U/PRODUCT/ORADATA/FOXMOLD/USER01.DBF     /DB3/ORADATA

6>      SVRMGRL

7>      CONNECT  INTERNAL

8>      ALTER TABLESPACE DATA RENAME DATAFILE

‘/U/PRODUCT/ORADATA/FOXMOLD/USER01.DBF’ TO

‘/DB3/ORADATA/USER01.DBF’

    9> ALTER  DATABASE  OPEN

8. 統計分析

SPOOL C:\ANALYZE.SQL

SELECT   @#ANALYZE  TABLE  @#||TRIM(OBJECT_NAME)||@#   COMPUTE   STATISTICS; @#

     FROM  USER_OBJECTS

    WHERE  OBJECT_TYPE=@#TABLE@#

然后運行analyze.sql文件即可

最后,對TABLESPACE碎片進行清理.

SELECT  TABLESPACE_NAME, PERCENT_BLOCKS_COALESCED

    FROM  DBA_FREE_SPACE_COALESCED

去看那一個TABLESPACE對應的值不是100的就運行如下命令:

ALTER  TABLESPACE  TABLESPACE_NAME  COALESCE

注意:如果TABLESPACE的值為100就沒有必要作此命令.

9.        移動TABLE INDEX 到另一個TABLESPACE

1>      SPOOL  C:\MV_INDEX.SQL

2>      SELECT  ‘ALTER  INDEX  ‘||TRIM(OBJECT_NAME)||’  REBUILD TABLESPACE  FOXMOLD1;’  FROM USER_OBJECTS  WHERE OBJECT_TYPE=’INDEX’

3>      將此命令生成MV_INDEX.SQL文件

4>      @C:\MV_INDEX.SQL

10.     MAINTAINING THE CONTROLFILE

1>      SVRMGRL

2>      CONNECT  INTERNAL

3>      SHUTDOWN

4>      EXIT

5>      CP  /U/PRODUCT/ORADATA/FOXMOLD/CONTROL01.CTL

/DB4/ORADATA/CONTROL01.CTL

6>      CHMOD  660  /DB4/ORADATA/CONTROL01.CTL

7>      修改INIT.ORA  CONTROL_FILES=……

8>      STARTUP  MOUNT  FOXMOLD

11.     MAINTAINING  REDO LOG FILE

1>      SHUTDOWN

2>      EXIT

3>      CP  /DISK1/*.RDO  /DISK4/*.RDO

4>      CHMOD  660  /DISK4/*.RDO

5>      STARTUP  MOUNT  FOXMOLD

12.     RECOVER SYNTAX

A.      RECOVER A CLOSED DATABASE

1>      RECOVER  DATABASE

2>      RECOVER  DATAFILE  ‘/DISK1/DF2.DBF’

3>      ALTER  DATABASE  RECOVER  DATABASE

B.       RECOVER AN OPEN DATABASE

1>      RECOVER TABLESPACE USER_DATA

2>      RECOVER DATAFILE 2

3>      ALTER DATABASE RECOVER DATAFILE 2
    注意﹕ALTER DATABASE一定在RECOVER后執行。

原文转自:http://www.ltesting.net