歡迎光臨
每天分享高質量文章

手把手教你搭建資料庫伺服器平臺 | DBA VS 自動化運維,究竟誰與爭鋒?

現代化的程度越高,對資料庫的依賴性越大。資料安全性和系統的安全性也就越大,比如公司業務系統。資料庫是直接的儲存地方,宕機帶來的損失可能是按分鐘或者秒算的。而誰對這些資料庫負責–DBA。所以很多公司,企業都是找有經驗的DBA ,他們也是在為他們的系統買保險。這也是為什麼企業不願意招一個沒有實戰經驗的DBA來管理自己的資料庫。

 

 

試想某個省移動的資料庫出了問題,造成資料丟失,在比如銀行資料庫掛了。他們帶來的損失不光是影響正常的業務執行,還有可能是資料錯誤。假如你在銀行存了100萬,結果銀行一不小心,在資料庫裡少了幾個0. 這個是誰也不願意看到的。當然以上都是假設的情況。因為像這些資料重要性極高的單位,他們都有一整套資料的保護機制,是基本不會發生這種情況的。

 

下麵就來總結一下如何的來搭建一個資料庫平臺。主要從引數和一些特性的配置上來說明。

 

一、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.對於非外接儲存情況下:

  • 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

 

  • 對於有外接儲存(/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

 

  • 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!(儲存退出)

 

4. Linux 核心引數修改

  •   修改核心引數/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

  

  • 根據應用情況修改行程數限制 /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/xujinyang/article/details/6829233

 

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 sgaNAME                  TYPE        VALUE------------------------------------ ----------- -------lock_sga                boolean     FALSEpre_page_sga            boolean     FALSEsga_max_size            big integer  584Msga_target               big integer  584MSQL> show parameter pgaNAME                    TYPE        VALUE------------------------------------ ----------- ------pga_aggregate_target        big integer    194MSQL> select name,value ,ISSYS_MODIFIABLE from v$parameter where name like 'sga%';NAME            VALUE           ISSYS_MOD--------------- --------------- ---------sga_max_size    612368384       FALSEsga_target      612368384       IMMEDIATESQL> 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 sgaNAME               TYPE        VALUE------------------------------------ ----------- --------lock_sga              boolean     FALSEpre_page_sga          boolean     FALSEsga_max_size          big integer  584Msga_target             big integer  550M

 

以上都是針對Oracle 10g 版本的。如果是9i的話,還需要對每個引數進行配置,如Share Pool,DB buffer,Java Pool,redo log buffer等。

 

3. UNDO, TEMP 表空間設定


 

3.1 UNDO

undo 表空間放的是資料的前映象,當做某個記錄多修改時,原記錄就會放到undo 中。所以Undo 表空間的大小影響資料的恢復能力。對它的配置要用點心思。

SQL> show parameter undoNAME                                 TYPE        VALUE------------------------------------ ----------- -----------undo_management                      string      AUTOundo_retention                       integer     900undo_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 刪了重建。

 

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 滿了的話,我們也可以重建其表空間。

 

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        FALSESQL> 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 immediateSQL> startup mount;SQL> alter database archivelog;SQL> alter database open;SQL> archive log list;Database log mode              Archive ModeAutomatic archival             EnabledArchive destination            /u01/newccs_archiveOldest online log sequence     27622Next log sequence to archive   0Current log sequence           27624

 

 

要強調的一點,在切換為歸檔之前一定要指定歸檔目錄,即log_archive_dest_1。這個目錄用來指定歸檔檔案存放的位置,如果不指定,就會放到閃回區。閃回區預設只有2G,一但滿了之後就會出現問題,如導致資料庫hang或者不能啟動。

ORA-16014log string sequence# string not archived, no available destinations Flash Recovery Area 空間不足http://blog.csdn.net/xujinyang/article/details/6924330

 

 

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 mountSQL> select name, current_scn, flashback_on from v$database;NAME      CURRENT_SCN FLASHBACK_ON--------- ----------- ------------------ORCL                0 NOSQL> alter database flashback on;資料庫已更改。SQL> select name, current_scn, flashback_on from v$database;NAME      CURRENT_SCN FLASHBACK_ON--------- ----------- ------------------ORCL                0 YES

 

 

7. 檢查redo

Redo 裡記錄的是資料庫的操作。在相關事務操作的時候,都會是先寫redo,等redo 寫完會再去修改相應的資料。這也Oracle的一種機制。如果出現問題,也可以透過這些記錄進行恢復。

 

Redo 預設有3個組,每個組有一個檔案,每個檔案50M。

 

將redo log 的檔案大小改成100M一個。每組建立2個成員。最好將每組的2個成員放在不同的磁碟上。因為寫redo 的時候是並行的,放在一起,可能會出現等待事件:Log file parallel write。

 

 

與控制檔案一樣,如果每組具有多個成員(事實也應當如此),那麼仍然不必擔心保持這些成員同步的問題。LGWR能夠確保對所有成員進行並行寫操作,從而使這些成員完全相同。如果丟失某個組的一個成員,只要還存在其他成員,資料庫仍然能夠繼續執行。

 

顯示當前歸檔日誌組和成員:

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

 

新增新的檔案到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   7SQL> alter system set control_file_record_keep_time=20;系統已更改。SQL> show parameter control_file_record_keep_timeNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------control_file_record_keep_time        integer     20SQL>

 

  

9. 設定open_links_per_instance 和 open_links 引數

 

      

這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 需要確保定期收集統計資訊,建立另一個執行核對清單。

 

 

建立儲存過程:

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;

 

 

將儲存過程寫進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的影響是比較大的,找個業務不忙的時候來執行。

 

 

三、小結


 

作為一個DBA,我們要考慮的是如何保證系統7*24的正常執行,如何保證系統高效的執行,還有就是保證資料的安全性。所有的監控都是輔助的,關鍵還得靠DBA,需要DBA的經驗來處理各種異常情況。就像電視劇《士兵突擊》里老A袁朗講的一句話:戰爭的最後,還是人與人之間的較量,同樣對資料庫的維護最終還是要靠DBA,用儲存也罷,高效能的伺服器也罷,使用更健壯的監控的系統也罷。但這些都是機器,誰也不能保證這些硬體或者軟體100% 不出問題,這些只是我們的工具,就像士兵使用的搶一樣,保養的好,就好使,但也不能保證它不出問題。指不定哪天就出先故障或者出現bug。所以經驗對一個DBA來說,是一筆財富。

 

最後強調一點,要養成做備份的習慣,(關於備份,我們發過很多文章,請看下方“相關推薦”)慎用RM命令。只要有備份, 就還有輓回的餘地。不經想起去年幫一個朋友恢復過的一個資料庫。當時的情況是:資料庫除了半年前的一次冷備外,沒有其他的備份,也沒有歸檔。然後有一天出了問題,朋友折騰了半天,實在搞不定。拿到這樣的庫,我也沒辦法,最後用了最近一次的冷備還原了下。資料丟失了半年。教訓也是深刻的。

 

    已同步到看一看
    贊(0)

    分享創造快樂