程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 的一些維護命令

Oracle 的一些維護命令

編輯:Oracle數據庫基礎
查詢發生死鎖的select語句 select sql_text from v$sql where hash_value in  (select sql_hash_value from v$session where sid in (select session_id from v$locked_object))
通過檢查數據庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。 1)用dba用戶執行以下語句 select username,lockwait,status,Machine,program from v$session where sid in (select session_id from v$locked_object) 如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一台。字段說明: Username:死鎖語句所用的數據庫用戶; Lockwait:死鎖的狀態,如果有內容表示被死鎖。 Status: 狀態,active表示被死鎖 Machine: 死鎖語句所在的機器。 Program: 產生死鎖的語句主要來自哪個應用程序。 2)用dba用戶執行以下語句,可以查看到被死鎖的語句。 select sql_text from v$sql where hash_value in  (select sql_hash_value from v$session where sid in (select session_id from v$locked_object))
死鎖的解決方法      一般情況下,只要將產生死鎖的語句提交就可以了,但是在實際的執行過程中。用戶可能不知道產生死鎖的語句是哪一句。可以將程序關閉並重新啟動就可以了。 經常在Oracle的使用過程中碰到這個問題,所以也總結了一點解決方法。  1)查找死鎖的進程: sqlplus "/as sysdba" (sys/change_on_install) SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#, l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS  FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;   2)kill掉這個死鎖的進程:  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)  3)如果還不能解決: select pro.spid from v$session ses, v$process pro where ses.sid=XX and  ses.paddr=pro.addr;   其中sid用死鎖的sid替換: exit ps -ef|grep spid   其中spid是這個進程的進程號,kill掉這個Oracle進程。
檢查數據庫文件的狀態
  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 # )   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.如果表上存在索引,則要重建表上的索引
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved