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

來源:互聯網
上載者:User

首先要說的是,不同版本資料庫提供的系統資料表會有不同,你可以根據資料字典查看該版本資料庫所提供的表
like   this:
select   *   from   dict   where   table_name   like   '%SESSION% ';
就可以查出一些表,然後根據這些表就可以獲得會話資訊。

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

SELECT   SID, SERIAL#, STATUS,   USERNAME,  SCHEMANAME, OSUSER,TERMINAL, MACHINE,  
              PROGRAM,   A.NAME  FROM       V$SESSION   S,   AUDIT_ACTIONS   A                                    WHERE     S.COMMAND   =   A.ACTION;

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

DBA要定時對資料庫的串連情況進行檢查,看與資料庫建立的會話數目是不是正常,如果建立了過多的串連,會消耗資料庫的資源。同時,對一些“掛死”的串連,可能會需要DBA手工進行清理。

以下的SQL語句列出當前資料庫建立的會話情況:

select sid,serial#,username,program,machine,status

from v$session;

其中,
SID                           會話(session)的ID號;
SERIAL#                  會話的序號,和SID一起用來唯一標識一個會話;
USERNAME            建立該會話的使用者名稱;
PROGRAM              這個會話是用什麼工具串連到資料庫的;
STATUS                   當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操作;
 

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

alter system kill session 'SID,SERIAL#';

注意,上例中SID為1到7(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;重啟資料庫   #修改串連

1:oracle中怎樣查看總共有哪些使用者
select * from all_users;

 2:查看oracle當前串連數
怎樣查看oracle當前的串連數呢?只需要用下面的SQL語句查詢一下就可以了。
select * from v$session where username is not null

select username,count(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 sid,serial#,username,program,machine,status from v$session;

 

三、 Oracle警告記錄檔監控
Oracle在運行過程中,會在警告記錄檔(alert_SID.log)中記錄資料庫的一些運行情況:
 資料庫的啟動、關閉,啟動時的非預設參數;
 資料庫的重做日誌切換情況,記錄每次切換的時間,及如果因為檢查點(checkpoint)操作沒有執行完成造成不能切換,會記錄不能切換的原因;
 對資料庫進行的某些操作,如建立或刪除資料表空間、增加資料檔案;
 資料庫發生的錯誤,如資料表空間不夠、出現壞塊、資料庫內部錯誤(ORA-600)

DBA應該定期檢查記錄檔,根據日誌中發現的問題及時進行處理
問題 處理
啟動參數不對 檢查初始化參數檔案
因為檢查點操作或歸檔操作沒有完成造成重做日誌不能切換 如果經常發生這樣的情況,可以考慮增加重做記錄檔組;想辦法提高檢查點或歸檔操作的效率;
有人未經授權刪除了資料表空間 檢查資料庫的安全問題,是否密碼太簡單;如有必要,撤消某些使用者的系統許可權
出現壞塊 檢查是否是硬體問題(如磁碟本生有壞塊),如果不是,檢查是那個資料庫物件出現了壞塊,對這個對象進行重建
資料表空間不夠 增加資料檔案到相應的資料表空間
出現ORA-600 根據記錄檔的內容查看相應的TRC檔案,如果是Oracle的bug,要及時打上相應的補丁

四、 資料庫資料表空間使用方式監控(字典管理資料表空間)
資料庫運行了一段時間後,由於不斷的在資料表空間上建立和刪除對象,會在資料表空間上產生大量的片段,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-1652、ORA-1653、ORA-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_name,status
from dba_data_files;
如果資料檔案的STATUS列不是AVAILABLE,那麼就要採取相應的措施,如對該資料檔案進行恢複操作,或重建該資料檔案所在的資料表空間。

七、 檢查資料庫定時作業的完成情況
如果資料庫使用了Oracle的JOB來完成一些定時作業,要對這些JOB的運行情況進行檢查:
select job,log_user,last_date,failures
from dba_jobs;
如果FAILURES列是一個大於0的數的話,說明JOB運行失敗,要進一步的檢查。

八、 資料庫壞塊的處理
當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. 如果表上存在索引,則要重建表上的索引

九、 作業系統相關維護
DBA要注意對作業系統的監控:
&#61548; 檔案系統的空間使用方式(df -k),必要時對Oracle的警告日誌及TRC檔案進行清理
&#61548; 如果Oracle提供網路服務,檢查網路連接是否正常
&#61548; 檢查作業系統的資源使用方式是否正常
&#61548; 檢查資料庫伺服器有沒有硬體故障,如磁碟、記憶體報錯

說明:此篇文章標題為總結,即有一些是前輩的真知灼見,在此複用,因為來源很零碎,顧不標明出處和原作者,

   敬請諒解!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.