Oracle數據庫平常維護

在Oracle數據庫運行期間,DBA應該對數據庫的運行日誌及表空間的使用狀況進行監控,及早發現數據庫中存在的問題。  數據庫

1、Oracle警告日誌文件監控  安全

Oracle在運行過程當中,會在警告日誌文件(alert_SID.log)中記錄數據庫的一些運行狀況: 
●● 數據庫的啓動、關閉,啓動時的非缺省參數; 
●● 數據庫的重作日誌切換狀況,記錄每次切換的時間,及若是由於檢查點(checkpoint)操做沒有執行完成形成不能切換,會記錄不能切換的緣由; 
●● 對數據庫進行的某些操做,如建立或刪除表空間、增長數據文件; 
●● 數據庫發生的錯誤,如表空間不夠、出現壞塊、數據庫內部錯誤(ORA-600) 
DBA應該按期檢查日誌文件,根據日誌中發現的問題及時進行處理 
問題 處理 
啓動參數不對檢查初始化參數文件 
由於檢查點操做或歸檔操做沒有完成形成重作日誌不能切換 若是常常發生這樣的狀況,能夠考慮增長重作日誌文件組;想辦法提升檢查點或歸檔操做的效率; 
有人未經受權刪除了表空間 
檢查數據庫的安全問題,是否密碼太簡單;若有必要,撤消某些用戶的系統權限 
出現壞塊 
檢查是不是硬件問題(如磁盤本生有壞塊),若是不是,檢查是那個數據庫對象出現了壞塊,對這個對象進行重建 
表空間不夠 
增長數據文件到相應的表空間 
出現ORA-600 

根據日誌文件的內容查看相應的TRC文件,若是是Oracle的bug,要及時打上相應的補丁  服務器


2、數據庫表空間使用狀況監控(字典管理表空間)  網絡

數據庫運行了一段時間後,因爲不斷的在表空間上建立和刪除對象,會在表空間上產生大量的碎片,DBA應該及時瞭解表空間的碎片和可用空間狀況,以決定是否要對碎片進行整理或爲表空間增長數據文件。 
select tablespace_name, 
count(*) chunks , 
max(bytes/1024/1024) max_chunk 
from dba_free_space 
group by tablespace_name; 
上面的SQL列出了數據庫中每一個表空間的空閒塊狀況,以下所示: 
TABLESPACE_NAME CHUNKS MAX_CHUNK 
-------------------- ---------- ---------- 
INDX 1 57.9921875 
RBS 3 490.992188 
RMAN_TS 1 16.515625 
SYSTEM 1 207.296875 
TEMP 20 70.8046875 
TOOLS 1 11.8359375 
USERS 67 71.3671875 
其中,CHUNKS列表示表空間中有多少可用的空閒塊(每一個空閒塊是由一些連續的Oracle數據塊組成),若是這樣的空閒塊過多,好比平均到每一個數據文件上超過了100個,那麼該表空間的碎片情況就比較嚴重了,能夠嘗試用以 
下的SQL命令進行表空間相鄰碎片的接合: 
alter tablespace 表空間名 coalesce; 
而後再執行查看錶空間碎片的SQL語句,看錶空間的碎片有沒有減小。若是沒有效果,而且表空間的碎片已經嚴重影響到了數據庫的運行,則考慮對該表空間進行重建。 
MAX_CHUNK列的結果是表空間上最大的可用塊大小,若是該表空間上的對象所需分配的空間(NEXT值)大於可用塊的大小的話,就會提示ORA-165二、ORA-165三、ORA-1654的錯誤信息,DBA應該及時對錶空間的空間進行擴充,以免這些錯誤發生。 

對錶空間的擴充對錶空間的數據文件大小進行擴展,或向表空間增長數據文件,具體操做見「存儲管理」部份。  session


3、查看數據庫的鏈接狀況  oracle

DBA要定時對數據庫的鏈接狀況進行檢查,看與數據庫創建的會話數目是否是正常,若是創建了過多的鏈接,會消耗數據庫的資源。同時,對一些「掛死」的鏈接,可能會須要DBA手工進行清理。 
如下的SQL語句列出當前數據庫創建的會話狀況: 
select sid,serial#,username,program,machine,status 
from v$session; 
輸出結果爲: 
SID SERIAL# USERNAME PROGRAM MACHINE STATUS 
---- ------- ---------- ----------- --------------- -------- 
1 1 ORACLE.EXE WORK3 ACTIVE 
2 1 ORACLE.EXE WORK3 ACTIVE 
3 1 ORACLE.EXE WORK3 ACTIVE 
4 1 ORACLE.EXE WORK3 ACTIVE 
5 3 ORACLE.EXE WORK3 ACTIVE 
6 1 ORACLE.EXE WORK3 ACTIVE 
7 1 ORACLE.EXE WORK3 ACTIVE 
8 27 SYS SQLPLUS.EXE WORKGROUP\WORK3 ACTIVE 
11 5 DBSNMP dbsnmp.exe WORKGROUP\WORK3 INACTIVE 
其中, 
SID 會話(session)的ID號; 
SERIAL# 會話的序列號,和SID一塊兒用來惟一標識一個會話; 
USERNAME 創建該會話的用戶名; 
PROGRAM 這個會話是用什麼工具鏈接到數據庫的; 
STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操做; 
若是DBA要手工斷開某個會話,則執行: 
alter system kill session 'SID,SERIAL#'; 

注意,上例中SID爲1到7(USERNAME列爲空)的會話,是Oracle的後臺進程,不要對這些會話進行任何操做。  工具


4、控制文件的備份  spa

在數據庫結構發生變化時,如增長了表空間,增長了數據文件或重作日誌文件這些操做,都會形成Oracle數據庫控制文件的變化,DBA應及進行控制文件的備份,備份方法是: 
執行SQL語句: 
alter database 
backup controlfile to '/home/backup/control.bak'; 
或: 
alter database 
backup controlfile to trace; 

這樣,會在USER_DUMP_DEST(初始化參數文件中指定)目錄下生成建立控制文件的SQL命令。  操作系統


5、檢查數據庫文件的狀態  日誌

DBA要及時查看數據庫中數據文件的狀態(如被誤刪除),根據實際狀況決定如何進行處理,檢查數據文件的狀態的SQL以下: 
select file_name,status 
from dba_data_files; 

若是數據文件的STATUS列不是AVAILABLE,那麼就要採起相應的措施,如對該數據文件進行恢復操做,或重建該數據文件所在的表空間。 


6、檢查數據庫定時做業的完成狀況 

若是數據庫使用了Oracle的JOB來完成一些定時做業,要對這些JOB的運行狀況進行檢查: 
select job,log_user,last_date,failures 
from dba_jobs; 

若是FAILURES列是一個大於0的數的話,說明JOB運行失敗,要進一步的檢查。 


7、數據庫壞塊的處理 

當Oracle數據庫出現壞塊時,Oracle會在警告日誌文件(alert_SID.log)中記錄壞塊的信息: 
ORA-01578: ORACLE data block corrupted (file # 7, block # <BLOCK>) 
ORA-01110: data file <AFN>: '/oracle1/oradata/V920/oradata/V816/users01.dbf' 
其中,<AFN>表明壞塊所在數據文件的絕對文件號,<BLOCK>表明壞塊是數據文件上的第幾個數據塊 
出現這種狀況時,應該首先檢查是不是硬件及操做系統上的故障致使Oracle數據庫出現壞塊。在排除了數據庫之外的緣由後,再對發生壞塊的數據庫對象進行處理。 
1.肯定發生壞塊的數據庫對象 
SELECT tablespace_name, 
segment_type, 
owner, 
segment_name 
FROM dba_extents 
WHERE file_id = <AFN> 
AND <BLOCK> between block_id AND block_id+blocks-1; 
2.決定修復方法 
若是發生壞塊的對象是一個索引,那麼能夠直接把索引DROP掉後,再根據表裏的記錄進行重建; 
若是發生壞塊的表的記錄能夠根據其它表的記錄生成的話,那麼能夠直接把這個表DROP掉後重建; 
若是有數據庫的備份,則恢復數據庫的方法來進行修復; 
若是表裏的記錄沒有其它辦法恢復,那麼壞塊上的記錄就丟失了,只能把表中其它數據塊上的記錄取出來,而後對這個表進行重建。 
3.用Oracle提供的DBMS_REPAIR包標記出壞塊 
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('<schema>','<tablename>'); 
4.使用Create table as select命令將表中其它塊上的記錄保存到另外一張表上 
create table corrupt_table_bak 
as 
select * from corrupt_table; 
5.用DROP TABLE命令刪除有壞塊的表 
drop table corrupt_table; 
6.用alter table rename命令恢復原來的表 
alter table corrupt_table_bak 
rename to corrupt_table; 

7.若是表上存在索引,則要重建表上的索引 


8、操做系統相關維護 

DBA要注意對操做系統的監控: 
●● 文件系統的空間使用狀況(df -k),必要時對Oracle的警告日誌及TRC文件進行清理 
●● 若是Oracle提供網絡服務,檢查網絡鏈接是否正常 
●● 檢查操做系統的資源使用狀況是否正常 

●● 檢查數據庫服務器有沒有硬件故障,如磁盤、內存報錯 

相關文章
相關標籤/搜索