如何搭建一个数据库服务器平台 .
玩Oracle 2年多了,從接觸Oracle 到現在,一直沒有停止過學習。 要學的東西太多,剛入門的時候是這樣的感覺,現在還是這樣的感覺。 有時候也在想,還要學多長時間才能感覺自我良好了,有十足的自信心了。 很多朋友都想做DBA, 因為他們覺得這一個高薪的行業。 但是并不是所有都明白為什么DBA是個高薪的行業。 高薪意味著壓力大,責任大。
?
現代化的程度越高,對數據庫的依賴性越大。 數據安全性和系統的安全性也就越大。比如公司業務系統。 數據庫是直接的存儲地方的,他的重要性是不言而喻的,宕機帶來的損失可能是按分鐘或者秒算的。 而誰對這些數據庫負責--DBA。 所以很多公司,企業都是找有經驗的DBA ,他們也是在為他們的系統買保險。 這也是為什么企業不愿意招一個沒有實戰經驗的DBA來管理自己的數據庫。
?
試想某個省移動的數據庫出了問題,造成數據丟失,在比如銀行數據庫掛了。 他們帶來的損失不光是影響正常的業務運行,還有可能是數據錯誤。假如你在銀行存了100萬,結果銀行一不小心,在數據庫里少了幾個0. 這個是誰也不愿意看到的。 當然以上都是假設的情況。 因為像這些數據重要性極高的單位,他們都有一整套數據的保護機制。 是不會發生這種情況的。
?
下面就來總結一下如何的來搭建一個數據庫平臺。 主要從參數和一些特性的配置上來說明。當然我玩Oracle也才2年,經驗不足,可能對與這些參數的設置也不是很合理。
?
從網上看到過一句話:每個DBA心中對重要的參數都有一個標準。 我想這也是經驗的價值。
?
?
?
一. Linux 系統
?
說明,在安裝操作系統之前,現在服務器上做個RAID。一般都用RAID5.
?
1.LINUX磁盤劃分:
?? a.對于內置2塊磁盤(146GB)的系統,/目錄20GB,SWAP與內存大小相當(8GB以下內存機器SWAP配置8GB),/boot 100MB。如果作為應用服務器,那么其余空間建立/apps文件系統,mke2fs –j 命令;如果作為數據庫平臺,那么建立/dba文件系統20GB,其余建立/u01文件系統。
?? b.對于內置4-6塊磁盤的系統,/目錄60GB,SWAP與內存大小相當(8GB以下內存機器SWAP配置8GB),/boot 100MB。如果作為應用服務器,那么其余空間建立/apps文件系統,mke2fs –j 命令;如果作為數據庫平臺,那么建立/dba文件系統40GB,其余建立/u01文件系統。
?? c.對于oracle數據文件目錄文件系統使用mke2fs –j –T largefiles命令建立
?
2.對于非外接存儲情況下:
a.ORACLE目錄標準:ORACLE_HOME=/dba/app/oracle/product/10.2.0.4(按版本指定)
???? ORACLE_BASE=/dba? (dump目錄為/dba/admin/sid/)
???? Datafile目錄為/u01/oradata/sid
???? 歸檔空間目錄/u01/oradata/archive_sid
?
?? b.對于有外接存儲(/u02…)情況下:
ORACLE目錄標準:ORACLE_HOME=/dba/app/oracle/product/10.2.0.4(按版本指定)
????? ORACLE_BASE=/u01? (dump目錄為/u01/admin/sid/)
????? Datafile目錄為/u02/oradata/sid??
????? 歸檔空間目錄/u01/oradata/archive_sid
?
c.ORACLE建庫采用CUSTOMER方式,直接更改初始UNDO和TEMP空間8GB(或者4GB,或者通過增加文件數目到更大,根據業務系統),system空間512MB(或者1GB)。Redolog為100MB,單個數據文件大小以8GB為宜(因EXT3文件系統特性使然),建議數據文件一次性劃分到8G, 以保證數據文件的連續性。
?
3.參數及服務配置:
? 方法一:建立NTP時間同步服務,/etc/ntp.conf中加入server 10.0.30.172,執行# ntpdate 10.0.30.172,# service ntpd start ,# chkconfig --level 235 ntpd on
?
? 方法二: 時間同步配置(編輯crontab)
? 輸入命令:ntpdate 10.0.30.172
? crontab –e(編輯crontab)
? 按i進入輸入狀態,輸入以下一行:
? 01 01 * * * root /usr/sbin/ntpdate 10.0.30.172 >/dev/null 2>&1(每天01:01與時間服務器10.0.30.172同步時間)
? :wq!(保存退出)
?
更多信息參考我的Blog: Linux 時間同步配置
http://blog.csdn.net/tianlesoftware/archive/2010/02/22/5315587.aspx
?
?
4. Linux 內核參數修改
? 4.1 修改內核參數/etc/sysctl.conf,對于8GB-16GB內存機器
????? kernel.shmall = 2097152 à 4194304 ( 4KB單位,總內存大小)
kernel.shmmax = ?à8589934592(實際物理內存的2/3)
kernel.shmmni = 4096
???? 對于16GB內存以上機器
????? kernel.shmall = 2097152 à 8388608? ( 4KB單位,總內存大小)
kernel.shmmax = ?à10179869184(比實際物理內存的2/3)
kernel.shmmni = 4096 –>8192
? net.ipv4.ip_local_port_range = 9000 65500
? net.core.rmem_default = 262144
? net.core.rmem_max = 4194304
? net.core.wmem_default = 262144
? net.core.wmem_max = 1048586
?
?以前也整理的相關的資料,詳見blog: Linux 內核參數及Oracle相關參數調整
http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4668741.aspx
?
??
?4.2.根據應用情況修改進程數限制 /etc/security/limits.conf
???? *?????????????? soft??????????? nproc?????????? 2047
*?????????????? hard?????????? nproc?????????? 16384
*?????????????? soft??????????? nofile????????? 1024 ->2048
*?????????????? hard??????????? nofile????????? 65536
?
?
注:關于內核參數的修改,在Oracle 官方的安裝文檔里也有相關說明:
http://download.oracle.com/docs/cd/B28359_01/install.111/b32002/pre_install.htm#BABFDGHJ
在連接中的第 2.7 Configure Oracle Installation Owner Shell Limits 節。也有詳細介紹。
?
?
?
二. Oracle 配置
?
安裝實例之前,記得修改db_files , maxdatafiles 和MAXLOGHISTORY 參數。? 這2個參數是放在控制文件里的,如果在安裝實例的時候沒有設置成合適的值,以后調整起來會很麻煩。
?
具體參考:
Oracle db_files 和 maxdatafiles 說明
http://blog.csdn.net/tianlesoftware/archive/2011/06/07/6530421.aspx
?
?
1. 創建pfile 參數
Oracle 默認只會創建spfile,但這是個二進制文件,無法進行修改。 為了保險期間。我們要在開始就創建一個pfile 文件,語句很簡單,但作用不可忽略。
SQL>Create pfile from spfile;
?
Windows 下生成的pfile 文件默認在$ORACLE_HOME/database 下
Linux 默認位置在$ORACLE_HOME/dbs 下
?
2. SGA, PGA 設置
?
先來看幾個SQL
SQL> show parameter sga
NAME????????????????? TYPE??????? VALUE
------------------------------------ ----------- -------
lock_sga??????????????? boolean???? FALSE
pre_page_sga??????????? boolean???? FALSE
sga_max_size?????????? ?big integer ?584M
sga_target?????????????? big integer ?584M
SQL> show parameter pga
NAME??????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------
pga_aggregate_target??????? big integer ???194M
SQL> select name,value ,ISSYS_MODIFIABLE from v$parameter where name like 'sga%';
NAME??????????? VALUE?????????? ISSYS_MOD
--------------- --------------- ---------
sga_max_size??? 612368384?????? FALSE
sga_target????? 612368384?????? IMMEDIATE
SQL> select name,value,issys_modifiable from v$parameter where name like 'pga%';
NAME??????? ??????VALUE??? ISSYS_MOD
-------------------- ?????---------- ???---------
pga_aggregate_target ?203423744? ?IMMEDIATE
如果ISSYS_MODIFIABLE 返回的是false,說明該參數無法用alter system語句動態修改,需要重啟數據庫。
所以sga_max_size 是不可以動態調整的。
?
在安裝之后我們要對PGA 和 SGA 進行設置。 因為sga_max_size 是非動態的,修改后需要重啟,所以我們在開始設置的時候可以把sga_max_size設大一點。 sga_target 是動態的,我們可以根絕需要進行調整。這個調整主要根據命中率來。這里就不多說。當指定SGA_TARGET小于SGA_MAX_SIZE,實例重啟后,SGA_MAX_SIZE就自動變為和SGA_TARGET一樣的值了。
?
對于OLTP系統,一般的建議是將SGA_MAX_SIZE 設為物理內存的60%,PGA 設為20%。
?
下表是一個參考值:
| 系統內存 | SGA_MAX_SIZE值 |
| 1G | 400-500M |
| 2G | 1G |
| 4G | 2500M |
| 8G | 5G |
?
?
這個參數修改可以在pfile里修改,也可以通過命令直接來:
SQL> alter system set pga_aggregate_target=150m scope=spfile;
系統已更改。
SQL> alter system set sga_target=500m scope=spfile;
系統已更改。
SQL> alter system set sga_max_size=510m scope=spfile;? --要是參數生效,需要重啟
系統已更改。
SQL> alter system set sga_max_size=510m scope=both;
alter system set sga_max_size=510m scope=both
???????????????? *
第 1 行出現錯誤:
ORA-02095: 無法修改指定的初始化參數
SQL> alter system set sga_target=550m scope=both;
系統已更改。
SQL> show parameter sga
NAME?????????????? TYPE??????? VALUE
------------------------------------ ----------- --------
lock_sga????????????? boolean???? FALSE
pre_page_sga????????? boolean???? FALSE
sga_max_size????????? big integer ?584M
sga_target???????????? big integer ?550M
?
以上都是針對Oracle 10g 版本的。 如果是9i的話,還需要對每個參數進行配置,如Share Pool,DB buffer,Java Pool,redo log buffer等。
?
Oracle 內存詳細分析請參考CSDN blog:Oracle 內存 架構 詳解
http://blog.csdn.net/tianlesoftware/archive/2010/05/16/5594080.aspx
?
?
3. UNDO, TEMP 表空間設置
?
3.1 UNDO
undo 表空間放的是數據的前鏡像,當做某個記錄多修改時,原記錄就會放到undo 中。所以Undo 表空間的大小影響數據的恢復能力。 對它的配置要用點心思。
SQL> show parameter undo
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- -----------
undo_management????????????????????? string????? AUTO
undo_retention?????????????????????? integer???? 900
undo_tablespace????????????????????? string????? UNDOTBS1
?
undo_retention 只是指定undo 數據的過期時間,默認是900s,15分鐘。建議改成10800s,即3個小時。
?
SQL> alter system set undo_retention=10800 scope=both;
系統已更改。
?
至于undo 表空間的大小,如果磁盤空間允許,就將表空間設為32G,分成4個數據文件,單個數據文件8G。 如果空間有限,就設為8G或者16G(8*2)。
不過現在的服務器硬盤都是比較大,如果放在存儲上,那空間更大,所以32G。相對而言就就是一個很小的空間了。
?
ALTER DATABASE DATAFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DBF' RESIZE 50M;
?
ALTER TABLESPACE UNDOTBS1 ADD DATAFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS02.DBF' SIZE 5M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;
?
大量的DML 操作會產生大量的undo,尤其是update,delete。 當Undo 特別大的時候,我們可以把undo 刪了重建。
?
具體參考我的blog:Oracle undo 回滾段管理
http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx
?
3.2 Temp
臨時表空間主要用途是在數據庫進行排序運算、管理索引、訪問視圖等操作時提供臨時的運算空間,當運算完成之后系統會自動清理。當oracle里需要用到sort的時候,PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間里進行排序,同時如果有異常情況的話,也會被放入臨時表空間,正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作后,Oracle是會自動釋放掉臨時段的。但有些有侯我們則會遇到臨時段沒有被釋放,TEMP表空間幾乎滿的狀況,甚至是我們重啟了數據庫仍沒有解決問題。
?
ALTER DATABASE TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TEMP01.DBF' RESIZE 30M;
?
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TEMP02.DBF' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
?
和UNDO 一樣,可以設為32G (4*8G)或者16G(2*8G),具體情況具體對待。如果遇到temp tablespace 滿了的話,我們也可以重建其表空間。 具體操作方法,參考blog:Oracle Temp 臨時表空間
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4697417.aspx
?
4. 修改sessions 和 processes 參數
?? 數據庫默認的sessions 是170,Processes 是150. 這2個數值肯定是不能滿足系統需要的。我們需要把這2個參數調大一點。 方法還是一樣,可以直接修改pfile,也可以用SQL. 建議把processes改成1000.sessions 改成2000. 當然具體情況具體對待。
SQL> select name,value,issys_modifiable from v$parameter where name='sessions';
NAME??????? VALUE????? ISSYS_MOD
-------------------- ---------- ---------
sessions?????? 170??????? FALSE
SQL> select name,value,issys_modifiable from v$parameter where name='processes';
NAME???????? VALUE????? ISSYS_MOD
-------------------- ---------- ---------
processes?????? 150??????? FALSE
?
從上面的結果我們可以知道,修改這2個參數必須重啟數據庫。
SQL> alter system set sessions=2000 scope=spfile;
系統已更改。
SQL> alter system set processes=1000 scope=spfile;
系統已更改。
?
?
5. 啟動歸檔模式,并部署定期刪除歸檔文件腳本.
生產庫必定運行在歸檔模式下,因為通過歸檔,我們對數據進行恢復。我們RMAN 備份,Data Guard也需要歸檔文件。
數據庫歸檔非歸檔的切換比較簡單。
SQL> alter system set log_archive_dest_1='location=/u01/newccs_archive';
SQL> shutdown immediate
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
Database log mode????????????? Archive Mode
Automatic archival???????????? Enabled
Archive destination??????????? /u01/newccs_archive
Oldest online log sequence???? 27622
Next log sequence to archive?? 0
Current log sequence?????????? 27624
?
Oracle 歸檔與非歸檔的切換
http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4693470.aspx
?
要強調的一點,在切換為歸檔之前一定要指定歸檔目錄,即log_archive_dest_1。 這個目錄用來指定歸檔文件存放的位置,如果不指定,就會放到閃回區。 閃回區默認只有2G,一但滿了之后就會出現問題,如導致數據庫hang或者不能啟動。 這個也是初學者容易犯的問題。 要是遇到這種問題,處理方法參考我的blog:
?
ORA-16014: log string sequence# string not archived, no available destinations Flash Recovery Area 空間不足
http://blog.csdn.net/tianlesoftware/archive/2010/04/29/5537550.aspx
?
刪除歸檔日志的腳本,請參考BLog:
http://blog.csdn.net/tianlesoftware/archive/2010/01/20/5211659.aspx
?
6. 開啟Flashback
Flashback 技術是以Undo segment中的內容為基礎的, 因此受限于UNDO_RETENTON參數。要使用flashback 的特性,必須啟用自動撤銷管理表空間。
在Oracle 10g中, Flash back家族分為以下成員: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三種) 和Flashback Table。
Flashback 是不完全恢復的一種補充,它很靈活。但是Flashback Database默認是關閉的,所以我們要啟動它。
?
要注意的是:啟動它必須在mount 狀態
SQL> startup mount
SQL> select name, current_scn, flashback_on from v$database;
NAME????? CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL??????????????? 0 NO
SQL> alter database flashback on;
數據庫已更改。
SQL> select name, current_scn, flashback_on from v$database;
NAME????? CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL??????????????? 0 YES
?
?
Oracle Flashback 技術 總結
http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx
?
7. 檢查redo
Redo 里記錄的是數據庫的操作。 在相關事務操作的時候,都會是先寫redo,等redo 寫完會再去修改相應的數據。 這也Oracle的一種機制。如果出現問題,也可以通過這些記錄進行恢復。
Redo 默認有3個組,每個組有一個文件,每個文件50M。
?
?????? 將redo log 的文件大小改成100M一個。 每組創建2個成員。 最好將每組的2個成員放在不同的磁盤上。 因為寫redo 的時候是并行的,放在一起,可能會出現等待事件:Log file parallel write。
?????? 關于等待事件,參考:
?????? ?????? Oracle 常見的33個等待事件
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
?
與控制文件一樣,如果每組具有多個成員(事實也應當如此),那么仍然不必擔心保持這些成員同步的問題。LGWR能夠確保對所有成員進行并行寫操作,從而使這些成員完全相同。如果丟失某個組的一個成員,只要還存在其他成員,數據庫仍然能夠繼續運行。
?
Redo 空間的不足還會導致一種警告: checkpoint not complete. 具體參考Blog:
?
Redo Log 和Checkpoint not complete
http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4908066.aspx
?
RedoLog Checkpoint 和 SCN關系
http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx
?
?
?
顯示當前歸檔日志組和成員:
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ---------------------------------------------------
? 3 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG
? 2 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
? 1 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
??
添加redo log組:
SQL> alter database add logfile group 4 ('D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO04.LOG') size 10m;
SQL> select group#,member from v$logfile;
??? GROUP# MEMBER
---------- ----------------------------------------------------
???????? 3 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG
???????? 2 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
???????? 1 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
???????? 4 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO04.LOG
檢查新加入的log狀態
SQL> select group#,sequence#,bytes,members,status from v$log;
?
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 1 CURRENT
???????? 4????????? 0?? 10485760????????? 1 UNUSED
???????? 3???????? 16?? 52428800????????? 1 INACTIVE
???????? 2???????? 15?? 52428800????????? 1 INACTIVE
??? (雖然這里是UNUSED的狀態,但是通過切換日志文件或者數據庫自動切換,該文件會被改為active狀態)
??
添加新的文件到group 1
??? SQL> alter database add logfile member 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG' to group 1;
?????? SQL> select group#,sequence#,bytes,members,status from v$log;
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 2 CURRENT
???????? 4????????? 0?? 10485760????????? 1 UNUSED
???????? 3???????? 16?? 52428800????????? 1 INACTIVE
???????? 2???????? 15?? 52428800????????? 1 INACTIVE
??? 這里的group組中的member就變為2;
?????? SQL> select member from v$logfile where group#=1;
MEMBER
-------------------------------------------------------
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG
刪除新增的group 4
??? SQL> alter database drop logfile group 4;
刪除新增的group 1的logfile;
??? SQL> alter database drop logfile member 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG';
清空logfile:
??? SQL> alter database clear logfile 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG';
??
?????? SQL> select group#,sequence#,bytes,members,status from v$log;
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 1 ACTIVE
???????? 2???????? 18?? 52428800????????? 1 CURRENT
???????? 3????????? 0?? 52428800????????? 1 UNUSED
8. 設置CONTROL_FILE_RECORD_KEEP_TIME 參數
?????? 該參數設置控制文件中存儲備份記錄的時間,在用RMAN的時候會涉及到這個參數。 備份記錄包括完全的數據庫備份記錄,以及指定的數據文件,控制文件,參數文件和歸檔目錄的備份記錄。數據庫參數CONTROL_FILE_RECORD_KEEP_TIME以天為單位(默認值為7天),因此在默認情況下,Oracle 會將RMAN備份和恢復記錄保存7天。 可以將該參數設置為0到365之間的任意值。
?????? CONTROL_FILE_RECORD_KEEP_TIME參數會影響一系列的數據庫操作。 首先,產生RMAN備份時,由于與這些備份相關的記錄存儲在控制文件中,所以該參數直接影響數據庫控制文件的大小。 備份記錄將不斷的保存在控制文件中,控制文件將耗盡空間。 這時,Oracle 會擴展控制文件來調整備份記錄所需的存儲空間。 此外,設置為0時,將禁止擴展控制文件,并且會使得RMAN備份的保存周期不穩定。
?????? 建議將CONTROL_FILE_RECORD_KEEP_TIME 參數設置為不小于選中數據庫的備份保存周期,否則就可能在備份介質上有數據庫備份,但是控制文件不存在與備份相關的備份記錄,在這種情況下,將無法恢復這些較早的文件。這個參數根據自己的本份策略來決定。
??????
SQL> select name,value from v$parameter where name='control_file_record_keep_time';
NAME?????????????????????????? VALUE
------------------------------ -------------------------------------------------
control_file_record_keep_time?? 7
SQL> alter system set control_file_record_keep_time=20;
系統已更改。
SQL> show parameter control_file_record_keep_time
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time?????? ?integer???? 20
SQL>
?
關于RMAN與control_file_record_keep_time的內容參考:
?????? RMAN 系列(二) ---- RMAN 設置和配置
?????? http://blog.csdn.net/tianlesoftware/archive/2010/06/16/5674309.aspx
?
9. 設置open_links_per_instance 和 open_links 參數
?????? 關于這2個參數的說明,參考Blog:
?????? open_links_per_instance 和 open_links 參數說明
?????? http://blog.csdn.net/tianlesoftware/archive/2010/12/22/6090729.aspx
??????
?????? 這2個參數修改之后,需要重啟才能生效,所以,在安裝DB的時候,就把這個參數修改了。 默認值是4,如果用到話就太小了。 所以在安裝的時候,就給修改了。 修改建議值:100。
?
?????? SQL> alter system set open_links=100 scope=spfile;
?????? 系統已更改。
10.修改用戶的profile 參數
SQL>alter profile PROFILE_PERSONAL limit FAILED_LOGIN_ATTEMPTS UNLIMITED;
?
11. 部署statistic Job
?????? Oracle 10g statistic數據統計,Oracle會根據這些統計信息來決定是走RBO(Rule-BasedOptimization),還是走CBO(Cost-BasedOptimization),會去選擇哪種執行計劃更劃算,影響是否走相關的索引等.如果是CBO的話,它依靠準確的(或者說比較準確的)統計信息來產生優化的執行路徑,如果沒有做過統計,CBO也就沒有做cost評估的依據,所以雖然是CBO,但是實際上還是用RBO了,而且如果不常做統計的話,由于CBO是以統計為依據的,所以這時CBO的依據信息有問題,CBO也會不準。 所以 DBA 需要確保定期收集統計信息,創建另一個執行核對清單。
?????? 更多內容,參考:
?????? ?????? Oracle 10g Statistic數據統計
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4668723.aspx
?
11.1 創建存儲過程:
CREATE OR REPLACE PROCEDURE USER."ANALYZEDB"
IS
?? CURSOR get_ownertable
?? IS
????? SELECT table_name
??????? FROM user_tables;
?? ownertable?? get_ownertable%ROWTYPE;
BEGIN
?? OPEN get_ownertable;
?? LOOP
????? FETCH get_ownertable
?????? INTO ownertable;
????? EXIT WHEN get_ownertable%NOTFOUND;
????? EXECUTE IMMEDIATE??? 'analyze table '
??????????????????????? || ownertable.table_name
??????????????????????? || ' compute statistics for table for all indexes for all indexed columns ';
?? END LOOP;
EXCEPTION
?? WHEN OTHERS
?? THEN
????? RAISE;
END;
?
11.2. 將存儲過程寫進JOB
DECLARE
? X NUMBER;
BEGIN
? SYS.DBMS_JOB.SUBMIT
? ( job?????? => X
?? ,what????? => 'ANALYZEDB;'
?? ,next_date => to_date('14-10-2009 06:00:00','dd/mm/yyyy hh24:mi:ss')
?? ,interval? => 'trunc(sysdate + 7) + 6/24'
?? ,no_parse? => FALSE
? );
? SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
?
?????? 具體多長時間執行一次,根據自己的業務來決定, 這個Job 對DB的影響是比較大的,找個業務不忙的時候來執行。
?
12. 注意對索引的維護
??????
?????? 這塊具體參考Blog:
?????? ?????? Oracle 索引的維護
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/06/19/5680706.aspx
?
?
13. 部署監控系統
這里的監控系統包括磁盤空間,alert log日志等。 以前整理的一篇blog里有8個DBA 常用的腳本。 可以參考:
?
8個DBA最常用的監控Oracle數據庫的常用shell腳本
http://blog.csdn.net/tianlesoftware/archive/2009/11/11/4792798.aspx
?
在補充幾個腳本,很簡單。
?
13.1 監控磁盤空間并發送到郵箱:
?
Checkdisk.sh
df -k >/data/app/scripts/monitor/DiskSpace.log
/usr/bin/mailx -s "Whitney(Disk Space)" tianlesoftware@vip.qq.com < /data/app/scripts/monitor/DiskSpace.log
?
13.2 Windows 下,如果alert 的日志文件日志文件如果太大,查看起來非常麻煩,所以每天進行一次備份,這樣只需要查看一天的即可.
back_log_file.bat
rem 復制日志文件并改名,請根據各區SID情況修改腳本
set year=%DATE:~0,4%
set month=%DATE:~5,2%
set day=%DATE:~8,2%
copy D:/oracle/admin/wbi/bdump/alert_wbi.log D:/oracle/admin/wbi/bdump/alert_wbi"%year%%month%%day%".log
rem 清空日志文件
rem 下面一句是用來清空alert_wbi.log的
cd. >D:/oracle/admin/wbi/bdump/alert_wbi.log
?
?
14. 制定備份策略
主要指制定RMAN 備份策略。 RMAN 備份的東西,細講起來也很多。 具體參考:
?????? ?????? 如何 搭建 RMAN 備份平臺
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/07/16/5740896.aspx
?
?
14. 做DG,RAC等高可用性并對相關環境進行監控
?
?????? 這塊的東西暫時還沒有整理全,等以后整理全了在補充。
?
DG,RAC 的安裝請參考我的Blog:
Oracle Data Gurad -- Logical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/07/5564208.aspx
?
Oracle Data Gurad Physical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/05/5557410.aspx
?
RAC 的一些概念性和原理性的知識
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5331067.aspx
?
RAW+ASM 的RAC 安裝文檔
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5332909.aspx
?
OCFS2+ASM 的RAC安裝文檔
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5331074.aspx
?
刪除歸檔日志的腳本,請參考BLog:
http://blog.csdn.net/tianlesoftware/archive/2010/01/20/5211659.aspx
?
補充一個腳本:
對DG 系統的監控還有一個小腳本。批處理格式的。比較方便:
?
Check.sql
conn sys/PWD@SID as sysdba
host title 數據庫日常檢查
column dest_name format a30
column destination format a20
column MEMBER format a45
column 歸檔地 format a20
column TABLESPACE_NAME format a10
column FREE_RATE format a10
host cls
prompt **************************** 實 例 狀 態 ************************************;
select instance_name 實例名,version 版本,status 狀態,database_status 數據庫狀態 from v$instance;
prompt **************************** 數據庫狀態 *************************************;
select name,log_mode 歸檔模式,open_mode 打開模式 from v$database;
prompt **************************** 控制文件狀態 ***********************************;
column name format a40
select status,name from v$controlfile;
prompt **************************** 日志文件狀態 ***********************************;
select GROUP#,status,type,member from v$logfile;
prompt***************************** 歸檔目的地狀態 *********************************;
select dest_name ,status 狀態,database_mode 數據庫模式,destination 歸檔地 from v$archive_dest_status where dest_id in? ('1','2');
set heading off;
select '************數據庫已連續運行 '|| round(a.atime-b.startup_time)||' 天 '||'*******************************************' from(select sysdate atime from dual) a,v$instance b;
set heading on;
prompt***************************** 會? 話? 數 *************************************;
select sessions_current 當前會話數,sessions_highwater 實例最高值 from v$license;
prompt********************** 表空間監控(FREE_RATE小于10%為異常) ********************;
select a.tablespace_name, round(a.total_size) "total_size(MB)",
round(a.total_size)-round(b.free_size,3) "used_size(MB)",
round(b.free_size,3) "free_size(MB)", round(b.free_size/total_size*100,2)||'%' free_rate
from ( select tablespace_name, sum(bytes)/1024/1024 total_size
?????? from dba_data_files
?????? group by tablespace_name ) a,
?????? ( select tablespace_name, sum(bytes)/1024/1024 free_size
???????? from dba_free_space
???????? group by tablespace_name ) b
?????? where a.tablespace_name = b.tablespace_name(+);
?
prompt **************************** 表空間OFFLINE(顯示為空正常) ********************;
select tablespace_name 表空間名,status 狀態 from dba_tablespaces where status='OFFLINE';
prompt **************************** SEQUENCE同步數 *********************************;
select max(sequence#)from v$log_history;
?
CONN sys/PWD@SID_ST as sysdba;
prompt **************************** 備庫SEQUENCE同步數 *****************************;
select max(sequence#)from v$log_history;
prompt **************************** 備庫日志未應用(顯示為空正常) *******************;
select sequence#,applied from v$archived_log where applied='NO' and sequence#>2453;
prompt **************************** 備庫日志應用(顯示最近十個日志) *****************;
select * from(select sequence#,applied from v$archived_log order by sequence# desc) where rownum<=10;
set time on
disconnect
?
Check.bat
sqlplus /nolog @check.sql
?
?
8. 定期的做AWR,statspack 分析
Oracle AWR 介紹
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682300.aspx
?
statspack安裝使用 和 report 分析
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682329.aspx
?
?
小結:
?????? 作為一個DBA,我們要考慮的是如何保證系統7*24的正常運行,如何保證系統高效的運行,還有就是保證數據的安全性。 所有的監控都是輔助的,關鍵還得靠DBA,需要DBA的經驗來處理各種異常情況。就像電視劇《士兵突擊》里老A 袁朗 講的一句話:戰爭的最后, 還是人與人之間的較量,同樣對數據庫的維護最終還是要靠DBA,用存儲也罷,高性能的服務器也罷,使用更健壯的監控的系統也罷。但這些都是機器,誰也不能保證這些硬件或者軟件100% 不出問題,這些只是我們的工具,就像士兵使用的搶一樣,保養的好,就好使,但也不能保證它不出問題。 指不定哪天就出先故障或者出現bug。所以經驗對一個DBA來說,是一筆財富。
?
最后強調一點,要養成做備份的習慣,慎用RM 命令。 只要有備份, 就還有挽回的余地。 不經想起去年幫一個朋友恢復過的一個數據庫。 當時的情況是: 數據庫除了半年前的一次冷備外,沒有其他的備份,也沒有歸檔。然后有一天出了問題,朋友折騰了半天,實在搞不定。 拿到這樣的庫,我也沒辦法,最后用了最近一次的冷備還原了下。 數據丟失了半年。教訓也是深刻的。
?
這也是中國很多小公司或者企業的現狀,不注重數據庫的維護,只要能運行就可以了。對與這種情況,我也只能說祈求老天,不讓數據庫庫出問題,因為出問題就是災難。
?
我也是剛踏上DBA的路,希望能在這條路上能走的更遠,借用網友的吉言:成為明日之eygle(Oracle ACE,OCM).
玩Oracle 2年多了,從接觸Oracle 到現在,一直沒有停止過學習。 要學的東西太多,剛入門的時候是這樣的感覺,現在還是這樣的感覺。 有時候也在想,還要學多長時間才能感覺自我良好了,有十足的自信心了。 很多朋友都想做DBA, 因為他們覺得這一個高薪的行業。 但是并不是所有都明白為什么DBA是個高薪的行業。 高薪意味著壓力大,責任大。
?
現代化的程度越高,對數據庫的依賴性越大。 數據安全性和系統的安全性也就越大。比如公司業務系統。 數據庫是直接的存儲地方的,他的重要性是不言而喻的,宕機帶來的損失可能是按分鐘或者秒算的。 而誰對這些數據庫負責--DBA。 所以很多公司,企業都是找有經驗的DBA ,他們也是在為他們的系統買保險。 這也是為什么企業不愿意招一個沒有實戰經驗的DBA來管理自己的數據庫。
?
試想某個省移動的數據庫出了問題,造成數據丟失,在比如銀行數據庫掛了。 他們帶來的損失不光是影響正常的業務運行,還有可能是數據錯誤。假如你在銀行存了100萬,結果銀行一不小心,在數據庫里少了幾個0. 這個是誰也不愿意看到的。 當然以上都是假設的情況。 因為像這些數據重要性極高的單位,他們都有一整套數據的保護機制。 是不會發生這種情況的。
?
下面就來總結一下如何的來搭建一個數據庫平臺。 主要從參數和一些特性的配置上來說明。當然我玩Oracle也才2年,經驗不足,可能對與這些參數的設置也不是很合理。
?
從網上看到過一句話:每個DBA心中對重要的參數都有一個標準。 我想這也是經驗的價值。
?
?
?
一. Linux 系統
?
說明,在安裝操作系統之前,現在服務器上做個RAID。一般都用RAID5.
?
1.LINUX磁盤劃分:
?? a.對于內置2塊磁盤(146GB)的系統,/目錄20GB,SWAP與內存大小相當(8GB以下內存機器SWAP配置8GB),/boot 100MB。如果作為應用服務器,那么其余空間建立/apps文件系統,mke2fs –j 命令;如果作為數據庫平臺,那么建立/dba文件系統20GB,其余建立/u01文件系統。
?? b.對于內置4-6塊磁盤的系統,/目錄60GB,SWAP與內存大小相當(8GB以下內存機器SWAP配置8GB),/boot 100MB。如果作為應用服務器,那么其余空間建立/apps文件系統,mke2fs –j 命令;如果作為數據庫平臺,那么建立/dba文件系統40GB,其余建立/u01文件系統。
?? c.對于oracle數據文件目錄文件系統使用mke2fs –j –T largefiles命令建立
?
2.對于非外接存儲情況下:
a.ORACLE目錄標準:ORACLE_HOME=/dba/app/oracle/product/10.2.0.4(按版本指定)
???? ORACLE_BASE=/dba? (dump目錄為/dba/admin/sid/)
???? Datafile目錄為/u01/oradata/sid
???? 歸檔空間目錄/u01/oradata/archive_sid
?
?? b.對于有外接存儲(/u02…)情況下:
ORACLE目錄標準:ORACLE_HOME=/dba/app/oracle/product/10.2.0.4(按版本指定)
????? ORACLE_BASE=/u01? (dump目錄為/u01/admin/sid/)
????? Datafile目錄為/u02/oradata/sid??
????? 歸檔空間目錄/u01/oradata/archive_sid
?
c.ORACLE建庫采用CUSTOMER方式,直接更改初始UNDO和TEMP空間8GB(或者4GB,或者通過增加文件數目到更大,根據業務系統),system空間512MB(或者1GB)。Redolog為100MB,單個數據文件大小以8GB為宜(因EXT3文件系統特性使然),建議數據文件一次性劃分到8G, 以保證數據文件的連續性。
?
3.參數及服務配置:
? 方法一:建立NTP時間同步服務,/etc/ntp.conf中加入server 10.0.30.172,執行# ntpdate 10.0.30.172,# service ntpd start ,# chkconfig --level 235 ntpd on
?
? 方法二: 時間同步配置(編輯crontab)
? 輸入命令:ntpdate 10.0.30.172
? crontab –e(編輯crontab)
? 按i進入輸入狀態,輸入以下一行:
? 01 01 * * * root /usr/sbin/ntpdate 10.0.30.172 >/dev/null 2>&1(每天01:01與時間服務器10.0.30.172同步時間)
? :wq!(保存退出)
?
更多信息參考我的Blog: Linux 時間同步配置
http://blog.csdn.net/tianlesoftware/archive/2010/02/22/5315587.aspx
?
?
4. Linux 內核參數修改
? 4.1 修改內核參數/etc/sysctl.conf,對于8GB-16GB內存機器
????? kernel.shmall = 2097152 à 4194304 ( 4KB單位,總內存大小)
kernel.shmmax = ?à8589934592(實際物理內存的2/3)
kernel.shmmni = 4096
???? 對于16GB內存以上機器
????? kernel.shmall = 2097152 à 8388608? ( 4KB單位,總內存大小)
kernel.shmmax = ?à10179869184(比實際物理內存的2/3)
kernel.shmmni = 4096 –>8192
? net.ipv4.ip_local_port_range = 9000 65500
? net.core.rmem_default = 262144
? net.core.rmem_max = 4194304
? net.core.wmem_default = 262144
? net.core.wmem_max = 1048586
?
?以前也整理的相關的資料,詳見blog: Linux 內核參數及Oracle相關參數調整
http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4668741.aspx
?
??
?4.2.根據應用情況修改進程數限制 /etc/security/limits.conf
???? *?????????????? soft??????????? nproc?????????? 2047
*?????????????? hard?????????? nproc?????????? 16384
*?????????????? soft??????????? nofile????????? 1024 ->2048
*?????????????? hard??????????? nofile????????? 65536
?
?
注:關于內核參數的修改,在Oracle 官方的安裝文檔里也有相關說明:
http://download.oracle.com/docs/cd/B28359_01/install.111/b32002/pre_install.htm#BABFDGHJ
在連接中的第 2.7 Configure Oracle Installation Owner Shell Limits 節。也有詳細介紹。
?
?
?
二. Oracle 配置
?
安裝實例之前,記得修改db_files , maxdatafiles 和MAXLOGHISTORY 參數。? 這2個參數是放在控制文件里的,如果在安裝實例的時候沒有設置成合適的值,以后調整起來會很麻煩。
?
具體參考:
Oracle db_files 和 maxdatafiles 說明
http://blog.csdn.net/tianlesoftware/archive/2011/06/07/6530421.aspx
?
?
1. 創建pfile 參數
Oracle 默認只會創建spfile,但這是個二進制文件,無法進行修改。 為了保險期間。我們要在開始就創建一個pfile 文件,語句很簡單,但作用不可忽略。
SQL>Create pfile from spfile;
?
Windows 下生成的pfile 文件默認在$ORACLE_HOME/database 下
Linux 默認位置在$ORACLE_HOME/dbs 下
?
2. SGA, PGA 設置
?
先來看幾個SQL
SQL> show parameter sga
NAME????????????????? TYPE??????? VALUE
------------------------------------ ----------- -------
lock_sga??????????????? boolean???? FALSE
pre_page_sga??????????? boolean???? FALSE
sga_max_size?????????? ?big integer ?584M
sga_target?????????????? big integer ?584M
SQL> show parameter pga
NAME??????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------
pga_aggregate_target??????? big integer ???194M
SQL> select name,value ,ISSYS_MODIFIABLE from v$parameter where name like 'sga%';
NAME??????????? VALUE?????????? ISSYS_MOD
--------------- --------------- ---------
sga_max_size??? 612368384?????? FALSE
sga_target????? 612368384?????? IMMEDIATE
SQL> select name,value,issys_modifiable from v$parameter where name like 'pga%';
NAME??????? ??????VALUE??? ISSYS_MOD
-------------------- ?????---------- ???---------
pga_aggregate_target ?203423744? ?IMMEDIATE
如果ISSYS_MODIFIABLE 返回的是false,說明該參數無法用alter system語句動態修改,需要重啟數據庫。
所以sga_max_size 是不可以動態調整的。
?
在安裝之后我們要對PGA 和 SGA 進行設置。 因為sga_max_size 是非動態的,修改后需要重啟,所以我們在開始設置的時候可以把sga_max_size設大一點。 sga_target 是動態的,我們可以根絕需要進行調整。這個調整主要根據命中率來。這里就不多說。當指定SGA_TARGET小于SGA_MAX_SIZE,實例重啟后,SGA_MAX_SIZE就自動變為和SGA_TARGET一樣的值了。
?
對于OLTP系統,一般的建議是將SGA_MAX_SIZE 設為物理內存的60%,PGA 設為20%。
?
下表是一個參考值:
| 系統內存 | SGA_MAX_SIZE值 |
| 1G | 400-500M |
| 2G | 1G |
| 4G | 2500M |
| 8G | 5G |
?
?
這個參數修改可以在pfile里修改,也可以通過命令直接來:
SQL> alter system set pga_aggregate_target=150m scope=spfile;
系統已更改。
SQL> alter system set sga_target=500m scope=spfile;
系統已更改。
SQL> alter system set sga_max_size=510m scope=spfile;? --要是參數生效,需要重啟
系統已更改。
SQL> alter system set sga_max_size=510m scope=both;
alter system set sga_max_size=510m scope=both
???????????????? *
第 1 行出現錯誤:
ORA-02095: 無法修改指定的初始化參數
SQL> alter system set sga_target=550m scope=both;
系統已更改。
SQL> show parameter sga
NAME?????????????? TYPE??????? VALUE
------------------------------------ ----------- --------
lock_sga????????????? boolean???? FALSE
pre_page_sga????????? boolean???? FALSE
sga_max_size????????? big integer ?584M
sga_target???????????? big integer ?550M
?
以上都是針對Oracle 10g 版本的。 如果是9i的話,還需要對每個參數進行配置,如Share Pool,DB buffer,Java Pool,redo log buffer等。
?
Oracle 內存詳細分析請參考CSDN blog:Oracle 內存 架構 詳解
http://blog.csdn.net/tianlesoftware/archive/2010/05/16/5594080.aspx
?
?
3. UNDO, TEMP 表空間設置
?
3.1 UNDO
undo 表空間放的是數據的前鏡像,當做某個記錄多修改時,原記錄就會放到undo 中。所以Undo 表空間的大小影響數據的恢復能力。 對它的配置要用點心思。
SQL> show parameter undo
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- -----------
undo_management????????????????????? string????? AUTO
undo_retention?????????????????????? integer???? 900
undo_tablespace????????????????????? string????? UNDOTBS1
?
undo_retention 只是指定undo 數據的過期時間,默認是900s,15分鐘。建議改成10800s,即3個小時。
?
SQL> alter system set undo_retention=10800 scope=both;
系統已更改。
?
至于undo 表空間的大小,如果磁盤空間允許,就將表空間設為32G,分成4個數據文件,單個數據文件8G。 如果空間有限,就設為8G或者16G(8*2)。
不過現在的服務器硬盤都是比較大,如果放在存儲上,那空間更大,所以32G。相對而言就就是一個很小的空間了。
?
ALTER DATABASE DATAFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DBF' RESIZE 50M;
?
ALTER TABLESPACE UNDOTBS1 ADD DATAFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS02.DBF' SIZE 5M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;
?
大量的DML 操作會產生大量的undo,尤其是update,delete。 當Undo 特別大的時候,我們可以把undo 刪了重建。
?
具體參考我的blog:Oracle undo 回滾段管理
http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx
?
3.2 Temp
臨時表空間主要用途是在數據庫進行排序運算、管理索引、訪問視圖等操作時提供臨時的運算空間,當運算完成之后系統會自動清理。當oracle里需要用到sort的時候,PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間里進行排序,同時如果有異常情況的話,也會被放入臨時表空間,正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作后,Oracle是會自動釋放掉臨時段的。但有些有侯我們則會遇到臨時段沒有被釋放,TEMP表空間幾乎滿的狀況,甚至是我們重啟了數據庫仍沒有解決問題。
?
ALTER DATABASE TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TEMP01.DBF' RESIZE 30M;
?
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TEMP02.DBF' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
?
和UNDO 一樣,可以設為32G (4*8G)或者16G(2*8G),具體情況具體對待。如果遇到temp tablespace 滿了的話,我們也可以重建其表空間。 具體操作方法,參考blog:Oracle Temp 臨時表空間
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4697417.aspx
?
4. 修改sessions 和 processes 參數
?? 數據庫默認的sessions 是170,Processes 是150. 這2個數值肯定是不能滿足系統需要的。我們需要把這2個參數調大一點。 方法還是一樣,可以直接修改pfile,也可以用SQL. 建議把processes改成1000.sessions 改成2000. 當然具體情況具體對待。
SQL> select name,value,issys_modifiable from v$parameter where name='sessions';
NAME??????? VALUE????? ISSYS_MOD
-------------------- ---------- ---------
sessions?????? 170??????? FALSE
SQL> select name,value,issys_modifiable from v$parameter where name='processes';
NAME???????? VALUE????? ISSYS_MOD
-------------------- ---------- ---------
processes?????? 150??????? FALSE
?
從上面的結果我們可以知道,修改這2個參數必須重啟數據庫。
SQL> alter system set sessions=2000 scope=spfile;
系統已更改。
SQL> alter system set processes=1000 scope=spfile;
系統已更改。
?
?
5. 啟動歸檔模式,并部署定期刪除歸檔文件腳本.
生產庫必定運行在歸檔模式下,因為通過歸檔,我們對數據進行恢復。我們RMAN 備份,Data Guard也需要歸檔文件。
數據庫歸檔非歸檔的切換比較簡單。
SQL> alter system set log_archive_dest_1='location=/u01/newccs_archive';
SQL> shutdown immediate
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
Database log mode????????????? Archive Mode
Automatic archival???????????? Enabled
Archive destination??????????? /u01/newccs_archive
Oldest online log sequence???? 27622
Next log sequence to archive?? 0
Current log sequence?????????? 27624
?
Oracle 歸檔與非歸檔的切換
http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4693470.aspx
?
要強調的一點,在切換為歸檔之前一定要指定歸檔目錄,即log_archive_dest_1。 這個目錄用來指定歸檔文件存放的位置,如果不指定,就會放到閃回區。 閃回區默認只有2G,一但滿了之后就會出現問題,如導致數據庫hang或者不能啟動。 這個也是初學者容易犯的問題。 要是遇到這種問題,處理方法參考我的blog:
?
ORA-16014: log string sequence# string not archived, no available destinations Flash Recovery Area 空間不足
http://blog.csdn.net/tianlesoftware/archive/2010/04/29/5537550.aspx
?
刪除歸檔日志的腳本,請參考BLog:
http://blog.csdn.net/tianlesoftware/archive/2010/01/20/5211659.aspx
?
6. 開啟Flashback
Flashback 技術是以Undo segment中的內容為基礎的, 因此受限于UNDO_RETENTON參數。要使用flashback 的特性,必須啟用自動撤銷管理表空間。
在Oracle 10g中, Flash back家族分為以下成員: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三種) 和Flashback Table。
Flashback 是不完全恢復的一種補充,它很靈活。但是Flashback Database默認是關閉的,所以我們要啟動它。
?
要注意的是:啟動它必須在mount 狀態
SQL> startup mount
SQL> select name, current_scn, flashback_on from v$database;
NAME????? CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL??????????????? 0 NO
SQL> alter database flashback on;
數據庫已更改。
SQL> select name, current_scn, flashback_on from v$database;
NAME????? CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
ORCL??????????????? 0 YES
?
?
Oracle Flashback 技術 總結
http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx
?
7. 檢查redo
Redo 里記錄的是數據庫的操作。 在相關事務操作的時候,都會是先寫redo,等redo 寫完會再去修改相應的數據。 這也Oracle的一種機制。如果出現問題,也可以通過這些記錄進行恢復。
Redo 默認有3個組,每個組有一個文件,每個文件50M。
?
?????? 將redo log 的文件大小改成100M一個。 每組創建2個成員。 最好將每組的2個成員放在不同的磁盤上。 因為寫redo 的時候是并行的,放在一起,可能會出現等待事件:Log file parallel write。
?????? 關于等待事件,參考:
?????? ?????? Oracle 常見的33個等待事件
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
?
與控制文件一樣,如果每組具有多個成員(事實也應當如此),那么仍然不必擔心保持這些成員同步的問題。LGWR能夠確保對所有成員進行并行寫操作,從而使這些成員完全相同。如果丟失某個組的一個成員,只要還存在其他成員,數據庫仍然能夠繼續運行。
?
Redo 空間的不足還會導致一種警告: checkpoint not complete. 具體參考Blog:
?
Redo Log 和Checkpoint not complete
http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4908066.aspx
?
RedoLog Checkpoint 和 SCN關系
http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx
?
?
?
顯示當前歸檔日志組和成員:
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ---------------------------------------------------
? 3 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG
? 2 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
? 1 ?????? ?????? D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
??
添加redo log組:
SQL> alter database add logfile group 4 ('D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO04.LOG') size 10m;
SQL> select group#,member from v$logfile;
??? GROUP# MEMBER
---------- ----------------------------------------------------
???????? 3 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG
???????? 2 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
???????? 1 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
???????? 4 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO04.LOG
檢查新加入的log狀態
SQL> select group#,sequence#,bytes,members,status from v$log;
?
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 1 CURRENT
???????? 4????????? 0?? 10485760????????? 1 UNUSED
???????? 3???????? 16?? 52428800????????? 1 INACTIVE
???????? 2???????? 15?? 52428800????????? 1 INACTIVE
??? (雖然這里是UNUSED的狀態,但是通過切換日志文件或者數據庫自動切換,該文件會被改為active狀態)
??
添加新的文件到group 1
??? SQL> alter database add logfile member 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG' to group 1;
?????? SQL> select group#,sequence#,bytes,members,status from v$log;
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 2 CURRENT
???????? 4????????? 0?? 10485760????????? 1 UNUSED
???????? 3???????? 16?? 52428800????????? 1 INACTIVE
???????? 2???????? 15?? 52428800????????? 1 INACTIVE
??? 這里的group組中的member就變為2;
?????? SQL> select member from v$logfile where group#=1;
MEMBER
-------------------------------------------------------
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG
刪除新增的group 4
??? SQL> alter database drop logfile group 4;
刪除新增的group 1的logfile;
??? SQL> alter database drop logfile member 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO05.LOG';
清空logfile:
??? SQL> alter database clear logfile 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG';
??
?????? SQL> select group#,sequence#,bytes,members,status from v$log;
??? GROUP#? SEQUENCE#????? BYTES??? MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
???????? 1???????? 17?? 52428800????????? 1 ACTIVE
???????? 2???????? 18?? 52428800????????? 1 CURRENT
???????? 3????????? 0?? 52428800????????? 1 UNUSED
8. 設置CONTROL_FILE_RECORD_KEEP_TIME 參數
?????? 該參數設置控制文件中存儲備份記錄的時間,在用RMAN的時候會涉及到這個參數。 備份記錄包括完全的數據庫備份記錄,以及指定的數據文件,控制文件,參數文件和歸檔目錄的備份記錄。數據庫參數CONTROL_FILE_RECORD_KEEP_TIME以天為單位(默認值為7天),因此在默認情況下,Oracle 會將RMAN備份和恢復記錄保存7天。 可以將該參數設置為0到365之間的任意值。
?????? CONTROL_FILE_RECORD_KEEP_TIME參數會影響一系列的數據庫操作。 首先,產生RMAN備份時,由于與這些備份相關的記錄存儲在控制文件中,所以該參數直接影響數據庫控制文件的大小。 備份記錄將不斷的保存在控制文件中,控制文件將耗盡空間。 這時,Oracle 會擴展控制文件來調整備份記錄所需的存儲空間。 此外,設置為0時,將禁止擴展控制文件,并且會使得RMAN備份的保存周期不穩定。
?????? 建議將CONTROL_FILE_RECORD_KEEP_TIME 參數設置為不小于選中數據庫的備份保存周期,否則就可能在備份介質上有數據庫備份,但是控制文件不存在與備份相關的備份記錄,在這種情況下,將無法恢復這些較早的文件。這個參數根據自己的本份策略來決定。
??????
SQL> select name,value from v$parameter where name='control_file_record_keep_time';
NAME?????????????????????????? VALUE
------------------------------ -------------------------------------------------
control_file_record_keep_time?? 7
SQL> alter system set control_file_record_keep_time=20;
系統已更改。
SQL> show parameter control_file_record_keep_time
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time?????? ?integer???? 20
SQL>
?
關于RMAN與control_file_record_keep_time的內容參考:
?????? RMAN 系列(二) ---- RMAN 設置和配置
?????? http://blog.csdn.net/tianlesoftware/archive/2010/06/16/5674309.aspx
?
9. 設置open_links_per_instance 和 open_links 參數
?????? 關于這2個參數的說明,參考Blog:
?????? open_links_per_instance 和 open_links 參數說明
?????? http://blog.csdn.net/tianlesoftware/archive/2010/12/22/6090729.aspx
??????
?????? 這2個參數修改之后,需要重啟才能生效,所以,在安裝DB的時候,就把這個參數修改了。 默認值是4,如果用到話就太小了。 所以在安裝的時候,就給修改了。 修改建議值:100。
?
?????? SQL> alter system set open_links=100 scope=spfile;
?????? 系統已更改。
10.修改用戶的profile 參數
SQL>alter profile PROFILE_PERSONAL limit FAILED_LOGIN_ATTEMPTS UNLIMITED;
?
11. 部署statistic Job
?????? Oracle 10g statistic數據統計,Oracle會根據這些統計信息來決定是走RBO(Rule-BasedOptimization),還是走CBO(Cost-BasedOptimization),會去選擇哪種執行計劃更劃算,影響是否走相關的索引等.如果是CBO的話,它依靠準確的(或者說比較準確的)統計信息來產生優化的執行路徑,如果沒有做過統計,CBO也就沒有做cost評估的依據,所以雖然是CBO,但是實際上還是用RBO了,而且如果不常做統計的話,由于CBO是以統計為依據的,所以這時CBO的依據信息有問題,CBO也會不準。 所以 DBA 需要確保定期收集統計信息,創建另一個執行核對清單。
?????? 更多內容,參考:
?????? ?????? Oracle 10g Statistic數據統計
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4668723.aspx
?
11.1 創建存儲過程:
CREATE OR REPLACE PROCEDURE USER."ANALYZEDB"
IS
?? CURSOR get_ownertable
?? IS
????? SELECT table_name
??????? FROM user_tables;
?? ownertable?? get_ownertable%ROWTYPE;
BEGIN
?? OPEN get_ownertable;
?? LOOP
????? FETCH get_ownertable
?????? INTO ownertable;
????? EXIT WHEN get_ownertable%NOTFOUND;
????? EXECUTE IMMEDIATE??? 'analyze table '
??????????????????????? || ownertable.table_name
??????????????????????? || ' compute statistics for table for all indexes for all indexed columns ';
?? END LOOP;
EXCEPTION
?? WHEN OTHERS
?? THEN
????? RAISE;
END;
?
11.2. 將存儲過程寫進JOB
DECLARE
? X NUMBER;
BEGIN
? SYS.DBMS_JOB.SUBMIT
? ( job?????? => X
?? ,what????? => 'ANALYZEDB;'
?? ,next_date => to_date('14-10-2009 06:00:00','dd/mm/yyyy hh24:mi:ss')
?? ,interval? => 'trunc(sysdate + 7) + 6/24'
?? ,no_parse? => FALSE
? );
? SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
?
?????? 具體多長時間執行一次,根據自己的業務來決定, 這個Job 對DB的影響是比較大的,找個業務不忙的時候來執行。
?
12. 注意對索引的維護
??????
?????? 這塊具體參考Blog:
?????? ?????? Oracle 索引的維護
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/06/19/5680706.aspx
?
?
13. 部署監控系統
這里的監控系統包括磁盤空間,alert log日志等。 以前整理的一篇blog里有8個DBA 常用的腳本。 可以參考:
?
8個DBA最常用的監控Oracle數據庫的常用shell腳本
http://blog.csdn.net/tianlesoftware/archive/2009/11/11/4792798.aspx
?
在補充幾個腳本,很簡單。
?
13.1 監控磁盤空間并發送到郵箱:
?
Checkdisk.sh
df -k >/data/app/scripts/monitor/DiskSpace.log
/usr/bin/mailx -s "Whitney(Disk Space)" tianlesoftware@vip.qq.com < /data/app/scripts/monitor/DiskSpace.log
?
13.2 Windows 下,如果alert 的日志文件日志文件如果太大,查看起來非常麻煩,所以每天進行一次備份,這樣只需要查看一天的即可.
back_log_file.bat
rem 復制日志文件并改名,請根據各區SID情況修改腳本
set year=%DATE:~0,4%
set month=%DATE:~5,2%
set day=%DATE:~8,2%
copy D:/oracle/admin/wbi/bdump/alert_wbi.log D:/oracle/admin/wbi/bdump/alert_wbi"%year%%month%%day%".log
rem 清空日志文件
rem 下面一句是用來清空alert_wbi.log的
cd. >D:/oracle/admin/wbi/bdump/alert_wbi.log
?
?
14. 制定備份策略
主要指制定RMAN 備份策略。 RMAN 備份的東西,細講起來也很多。 具體參考:
?????? ?????? 如何 搭建 RMAN 備份平臺
?????? ?????? http://blog.csdn.net/tianlesoftware/archive/2010/07/16/5740896.aspx
?
?
14. 做DG,RAC等高可用性并對相關環境進行監控
?
?????? 這塊的東西暫時還沒有整理全,等以后整理全了在補充。
?
DG,RAC 的安裝請參考我的Blog:
Oracle Data Gurad -- Logical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/07/5564208.aspx
?
Oracle Data Gurad Physical Standby 相關說明
http://blog.csdn.net/tianlesoftware/archive/2010/05/05/5557410.aspx
?
RAC 的一些概念性和原理性的知識
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5331067.aspx
?
RAW+ASM 的RAC 安裝文檔
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5332909.aspx
?
OCFS2+ASM 的RAC安裝文檔
http://blog.csdn.net/tianlesoftware/archive/2010/02/28/5331074.aspx
?
刪除歸檔日志的腳本,請參考BLog:
http://blog.csdn.net/tianlesoftware/archive/2010/01/20/5211659.aspx
?
補充一個腳本:
對DG 系統的監控還有一個小腳本。批處理格式的。比較方便:
?
Check.sql
conn sys/PWD@SID as sysdba
host title 數據庫日常檢查
column dest_name format a30
column destination format a20
column MEMBER format a45
column 歸檔地 format a20
column TABLESPACE_NAME format a10
column FREE_RATE format a10
host cls
prompt **************************** 實 例 狀 態 ************************************;
select instance_name 實例名,version 版本,status 狀態,database_status 數據庫狀態 from v$instance;
prompt **************************** 數據庫狀態 *************************************;
select name,log_mode 歸檔模式,open_mode 打開模式 from v$database;
prompt **************************** 控制文件狀態 ***********************************;
column name format a40
select status,name from v$controlfile;
prompt **************************** 日志文件狀態 ***********************************;
select GROUP#,status,type,member from v$logfile;
prompt***************************** 歸檔目的地狀態 *********************************;
select dest_name ,status 狀態,database_mode 數據庫模式,destination 歸檔地 from v$archive_dest_status where dest_id in? ('1','2');
set heading off;
select '************數據庫已連續運行 '|| round(a.atime-b.startup_time)||' 天 '||'*******************************************' from(select sysdate atime from dual) a,v$instance b;
set heading on;
prompt***************************** 會? 話? 數 *************************************;
select sessions_current 當前會話數,sessions_highwater 實例最高值 from v$license;
prompt********************** 表空間監控(FREE_RATE小于10%為異常) ********************;
select a.tablespace_name, round(a.total_size) "total_size(MB)",
round(a.total_size)-round(b.free_size,3) "used_size(MB)",
round(b.free_size,3) "free_size(MB)", round(b.free_size/total_size*100,2)||'%' free_rate
from ( select tablespace_name, sum(bytes)/1024/1024 total_size
?????? from dba_data_files
?????? group by tablespace_name ) a,
?????? ( select tablespace_name, sum(bytes)/1024/1024 free_size
???????? from dba_free_space
???????? group by tablespace_name ) b
?????? where a.tablespace_name = b.tablespace_name(+);
?
prompt **************************** 表空間OFFLINE(顯示為空正常) ********************;
select tablespace_name 表空間名,status 狀態 from dba_tablespaces where status='OFFLINE';
prompt **************************** SEQUENCE同步數 *********************************;
select max(sequence#)from v$log_history;
?
CONN sys/PWD@SID_ST as sysdba;
prompt **************************** 備庫SEQUENCE同步數 *****************************;
select max(sequence#)from v$log_history;
prompt **************************** 備庫日志未應用(顯示為空正常) *******************;
select sequence#,applied from v$archived_log where applied='NO' and sequence#>2453;
prompt **************************** 備庫日志應用(顯示最近十個日志) *****************;
select * from(select sequence#,applied from v$archived_log order by sequence# desc) where rownum<=10;
set time on
disconnect
?
Check.bat
sqlplus /nolog @check.sql
?
?
8. 定期的做AWR,statspack 分析
Oracle AWR 介紹
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682300.aspx
?
statspack安裝使用 和 report 分析
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682329.aspx
?
?
小結:
?????? 作為一個DBA,我們要考慮的是如何保證系統7*24的正常運行,如何保證系統高效的運行,還有就是保證數據的安全性。 所有的監控都是輔助的,關鍵還得靠DBA,需要DBA的經驗來處理各種異常情況。就像電視劇《士兵突擊》里老A 袁朗 講的一句話:戰爭的最后, 還是人與人之間的較量,同樣對數據庫的維護最終還是要靠DBA,用存儲也罷,高性能的服務器也罷,使用更健壯的監控的系統也罷。但這些都是機器,誰也不能保證這些硬件或者軟件100% 不出問題,這些只是我們的工具,就像士兵使用的搶一樣,保養的好,就好使,但也不能保證它不出問題。 指不定哪天就出先故障或者出現bug。所以經驗對一個DBA來說,是一筆財富。
?
最后強調一點,要養成做備份的習慣,慎用RM 命令。 只要有備份, 就還有挽回的余地。 不經想起去年幫一個朋友恢復過的一個數據庫。 當時的情況是: 數據庫除了半年前的一次冷備外,沒有其他的備份,也沒有歸檔。然后有一天出了問題,朋友折騰了半天,實在搞不定。 拿到這樣的庫,我也沒辦法,最后用了最近一次的冷備還原了下。 數據丟失了半年。教訓也是深刻的。
?
這也是中國很多小公司或者企業的現狀,不注重數據庫的維護,只要能運行就可以了。對與這種情況,我也只能說祈求老天,不讓數據庫庫出問題,因為出問題就是災難。
?
我也是剛踏上DBA的路,希望能在這條路上能走的更遠,借用網友的吉言:成為明日之eygle(Oracle ACE,OCM).
-------------------------------------------------------------------------------------------------------------------------------------------------------
轉載來源戴明明的博客
http://blog.csdn.net/tianlesoftware/article/details/5602291
總結
以上是生活随笔為你收集整理的如何搭建一个数据库服务器平台 .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 后台进程(backgrou
- 下一篇: Oracle SQL Trace 和 1