search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

ORACLE資料庫日常維護知識匯總

首先要說的是,不同版本資料庫提供的系統表會有不同,可以根據數據字典查看該版本資料庫所提供的表 like this:

select * from dict where table_name like '%SESSION% ';

就可以查出一些表,然後根據這些表就可以獲得會話信息。

像這樣就是 查詢當前正在操作的會話:

SELECT SID SERIAL# STATUS USERNAME SCHEMANAME OSUSERTERMINAL

MACHINE

PROGRAM A.NAME FROM V$SESSION S AUDIT_ACTIONS A WHERE S.COMMAND =

A.ACTION;

一、查看資料庫的連接情況

DBA要定時對資料庫的連接情況進行檢查,看與資料庫建立的會話數目是不是正常,如果建立了過多的連接,會消耗資料庫的資源。同時,對一些「掛死」的連接,可能會需要DBA手工進行清理。以下的SQL語句列出當前資料庫建立的會話情況:

select sidserial#usernameprogrammachinestatus

from v$session;

其中,

SID 會話(session)ID;

SERIAL# 會話的序列號,和SID一起用來唯一標識一個會話;

USERNAME 建立該會話的用戶名;

PROGRAM 這個會話是用什麼工具連接到資料庫的;

STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操作;

如果DBA要手工斷開某個會話,則執行:

alter system kill session 'SIDSERIAL#';

注意,上例中SID17(USERNAME列為空)的會話,是Oracle的後台進程,不要對這些會話進行任何操作。

二、常用命令

select count(*) from v$session #連接數

Select count(*) from v$session where status='ACTIVE'#併發連接數

show parameter processes #最大連接

alter system set processes = value scope = spfile;重啟資料庫 #修改連接

1oracle中怎樣查看總共有哪些用戶

select * from all_users;

2:查看oracle當前連接數

怎樣查看oracle當前的連接數呢?只需要用下面的SQL語句查詢一下就可以了。

select * from v$session where username is not null

select usernamecount(username) from v$session where username is not null

group by username #查看不同用戶的連接數

select count(*) from v$session #連接數

Select count(*) from v$session where status='ACTIVE'#併發連接數

show parameter processes #最大連接

alter system set process

3:列出當前資料庫建立的會話情況:

select sidserial#usernameprogrammachinestatus from v$session;

三、 Oracle警告日誌文件監控

Oracle在運行過程中,會在警告日誌文件(alert_SID.log)中記錄資料庫的一些運行情況:

資料庫的啟動、關閉,啟動時的非預設參數;

資料庫的重做日誌切換情況,記錄每次切換的時間,及如果因為檢查點(checkpoint)操作沒有執行完成造成不能切換,會記錄不能切換的原因;

對資料庫進行的某些操作,如創建或刪除表空間、增加數據文件;

資料庫發生的錯誤,如表空間不夠、出現壞塊、資料庫內部錯誤(ORA-600)

DBA應該定期檢查日誌文件,根據日誌中發現的問題及時進行處理

問題處理

啟動參數不對:檢查初始化參數文件,因為檢查點操作或歸檔操作沒有完成造成重做日誌不能切換

如果經常發生這樣的情況,可以考慮增加重做日誌文件組;想辦法提高檢查點或歸檔操作的效率;

有人未經授權刪除了表空間:檢查資料庫的安全問題,是否密碼太簡單;如有必要,撤消某些用戶的系統許可權出現壞塊

檢查是否是硬體問題(如磁碟本生有壞塊),如果不是,檢查是那個資料庫對象出現了壞塊,對這個對象進行重建

表空間不夠:增加數據文件到相應的表空間

出現ORA-600:根據日誌文件的內容查看相應的TRC文件,如果是Oraclebug,要及時打上相應的補丁

四、 資料庫表空間使用情況監控(字典管理表空間)

資料庫運行了一段時間后,由於不斷的在表空間上創建和刪除對象,會在表空間上產生大量的碎片,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-1652ORA-1653ORA-1654的錯誤信息,DBA應該及時對錶空間的空間進行擴充,以避免這些錯誤發生。

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

五、 控制文件的備份

在資料庫結構發生變化時,如增加了表空間,增加了數據文件或重做日誌文件這些操作,都會造成Oracle資料庫控制文件的變化,DBA應及進行控制文件的備份,備份方法是:

執行SQL語句:

alter database

backup controlfile to '/home/backup/control.bak';

或:

alter database

backup controlfile to trace;

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

六、 檢查資料庫文件的狀態

DBA要及時查看資料庫中數據文件的狀態(如被誤刪除),根據實際情況決定如何進行處理,檢查數據文件的狀態的SQL如下:

select file_namestatus

from dba_data_files;

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

七、 檢查資料庫定時作業的完成情況

如果資料庫使用了OracleJOB來完成一些定時作業,要對這些JOB的運行情況進行檢查:

select joblog_userlast_datefailures

from dba_jobs;

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

八、 資料庫壞塊的處理

Oracle資料庫出現壞塊時,Oracle會在警告日誌文件(alert_SID.log)中記錄壞塊的信息:

ORA-01578: ORACLE data block corrupted (file # 7 block # )

ORA-01110: data file :

'/oracle1/oradata/V920/oradata/V816/users01.dbf'

其中,代表壞塊所在數據文件的絕對文件號,代表壞塊是數據文件上的第幾個數據塊。

出現這種情況時,應該首先檢查是否是硬體及操作系統上的故障導致Oracle資料庫出現壞塊。在排除了資料庫以外的原因后,再對發生壞塊的資料庫對象進行處理。

1. 確定發生壞塊的資料庫對象

SELECT tablespace_name

segment_type

owner

segment_name

FROM dba_extents

WHERE file_id =

AND between block_id AND block_id+blocks-1;

2. 決定修復方法

如果發生壞塊的對象是一個索引,那麼可以直接把索引DROP掉后,再根據表裡的記錄進行重建;

如果發生壞塊的表的記錄可以根據其它表的記錄生成的話,那麼可以直接把這個表DROP掉后重建;

如果有資料庫的備份,則恢復資料庫的方法來進行修復;

如果表裡的記錄沒有其它辦法恢復,那麼壞塊上的記錄就丟失了,只能把表中其它數據塊上的記錄取出來,然後對這個表進行重建。

3. Oracle提供的DBMS_REPAIR包標記出壞塊

exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('''');

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. 如果表上存在索引,則要重建表上的索引

九、 操作系統相關維護

DBA要注意對操作系統的監控:文件系統的空間使用情況(df -k),必要時對Oracle的警告日誌及TRC文件進行清理

#61548;如果Oracle提供網路服務,檢查網路連接是否正常

#61548;檢查操作系統的資源使用情況是否正常

#61548; 檢查資料庫伺服器有沒有硬體故障,如磁碟、內存報錯

了解更多相關信息,登錄IT培訓官網:www.cnitedu.cn,請在線諮詢QQ3158895217,或者關注微號(hntedu),與達內老師互動。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦