查詢發生死鎖的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.如果表上存在索引,則要重建表上的索引