因為是本地數據庫沒有重要資料,所以可以隨便自己折騰。
出現問題原因:從生產數據庫導入一個表到本地庫測試,因數據量過大,在導入4-5個小時后,手動中斷導入。是否異常關機不能確定。
之后再打開數據庫出現一點問題,說是C盤空間小,就擅自刪了幾個大的數據庫文件和所有日志文件。
--以下是具體操作,先是對數據庫文件的恢復,之后恢復日志文件:
-----------------------------------------------------1、數據文件物理刪除后,數據庫無法打開的解決--------------------------
C:\Users\Administrator>lsnrctl start
LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 12-2月 -2015 09:4
1:05
Copyright (c) 1991, 2010, Oracle. All rights reserved.
啟動tnslsnr: 請稍候...
TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Production
系統參數文件為C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listene
r.ora
寫入c:\app\administrator\diag\tnslsnr\Sandice-PC\listener\alert\log.xml的日志信
息
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Sandice-PC)(PORT=1521)))
正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=Sandice-PC)(PORT=1521)))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
啟動日期 12-2月 -2015 09:41:09
正常運行時間 0 天 0 小時 0 分 3 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程序參數文件 C:\app\Administrator\product\11.2.0\dbhome_1\network\a
dmin\listener.ora
監聽程序日志文件 c:\app\administrator\diag\tnslsnr\Sandice-PC\listener\
alert\log.xml
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Sandice-PC)(PORT=1521)))
服務摘要..
服務 "ORCL" 包含 1 個實例。
實例 "ORCL", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
命令執行成功
C:\Users\Administrator>net start OracleServiceorcl
OracleServiceORCL 服務正在啟動 ......
OracleServiceORCL 服務已經啟動成功。
C:\Users\Administrator>sqlplus
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 11 10:25:37 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
請輸入用戶名: sys as sysdba
輸入口令:
連接到:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
--說明:A表是庫中原來建的表
SQL> select * from A
2 ;
select * from A
*
第 1 行出現錯誤:
ORA-01219: 數據庫未打開: 僅允許在固定表/視圖中查詢
--說明:查看數據庫實例啟動狀態,目前啟動狀態為mounted
SQL> select status from v$instance;
STATUS
------------
MOUNTED
--說明:查看控制文件位置
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL
C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL
--說明:使用oracle命令把控制文件的內容顯示在Trace(蹤跡)中,查看控制文件內容
SQL> alter database backup controlfile to trace as 'D:\ctl.trc';
alter database backup controlfile to trace as 'D:\ctl.trc'
*
第 1 行出現錯誤:
ORA-01277: 文件 'D:\CTL.TRC' 已存在
SQL> alter database backup controlfile to trace as 'D:\ctl.trc';
數據庫已更改。
--說明:直接打開'D:\ctl.trc'文件,查看控制文件內容,找到數據庫文件存放位置,發現確實數據庫文件已被刪除
SQL> SELECT count(1) FROM user_tables
2 ;
SELECT count(1) FROM user_tables
*
第 1 行出現錯誤:
ORA-01219: 數據庫未打開: 僅允許在固定表/視圖中查詢
--說明:更改數據庫實例狀態到open ,出現以下錯誤
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01157: 無法標識/鎖定數據文件 2 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 2: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF'
--說明 數據庫沒找到這個數據文件,因為數據文件在沒有被offline的情況下物理刪除了,導致oracle的數據不一致,因此啟動失敗.
通過以下方法即可解決,依次操作幾個數據文件
C:\Users\Administrator>sqlplus sys/orcl@orcl as sysdba;
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 11 11:10:25 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
SQL> alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF' of
fline drop;
數據庫已更改。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01157: 無法標識/鎖定數據文件 5 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 5: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF'
SQL> alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF' o
ffline drop;
數據庫已更改。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01157: 無法標識/鎖定數據文件 6 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 6: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM02.DBF'
SQL> alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM02.DBF' of
fline drop;
數據庫已更改。
-----------------------------------------------------------2、日志文件物理刪除后,重做日志文件恢復--------------------------------------------------
--說明:所有數據文件物理刪除解決后,繼續打開數據庫open狀態,出現以下錯誤:
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-03113: 通信通道的文件結尾
進程 ID: 4308
會話 ID: 191 序列號: 5
--查看進程文件或alert_orcl.log 文件位置
SQL> show parameter background_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string c:\app\administrator\diag\rdbm
s\orcl\orcl\trace
--說明:找到alert_orcl.log,或Trace file c:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_4308.trc ,注意4308 是進程ID
trc 文件內容:
DDE: Problem Key 'ORA 312' was flood controlled (0x1) (no incident)
ORA-00312: 聯機日志 1 線程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
DDE: Problem Key 'ORA 313' was flood controlled (0x1) (no incident)
ORA-00313: 無法打開日志組 1 (用於線程 ) 的成員
ORA-00312: 聯機日志 1 線程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
ORA-00313: 無法打開日志組 1 (用於線程 ) 的成員
ORA-00312: 聯機日志 1 線程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
--查詢 select * from v$log;
可以看到group 1,2 文件狀態,是INACTIVE,group 3 的狀態是CURRENT,猜測一下,可能當時的log日志已經記錄到了REDO03.LOG,所以狀態顯示CURRENT
--INACTIVE狀態的重做日志組恢復
alter database clear unarchived logfile group 1;或 alter database clear logfile group 1;
我的是重做日志1、2 已經被物理刪除,使用的是 alter database clear logfile group 1;
依次恢復REDO01、REDO02,REDO03的狀態是CURRENT,因此暫時不知道怎么恢復。
繼續連接數據庫,出現以下錯誤:
SQL> alter database open;
ERROR:
ORA-03114: 未連接到 ORACLE
說明:重新連接
C:\Users\Administrator>sqlplus sys/orcl@orcl as sysdba;
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 11 11:19:23 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
已連接到空閑例程。
SQL> SELECT count(1) FROM user_tables
2 ;
SELECT count(1) FROM user_tables
*
第 1 行出現錯誤:
ORA-01034: ORACLE not available
進程 ID: 0
會話 ID: 0 序列號: 0
SQL> Select instance_name,status from v$instance;
Select instance_name,status from v$instance
*
第 1 行出現錯誤:
ORA-01034: ORACLE not available
進程 ID: 0
會話 ID: 0 序列號: 0
--說明:不管是檢查表或實例,都顯示 ORA-01034: ORACLE not available
--在此,將實例關閉,使用命令啟動到mount 狀態
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area 1670221824 bytes
Fixed Size 2176328 bytes
Variable Size 1056967352 bytes
Database Buffers 603979776 bytes
Redo Buffers 7098368 bytes
數據庫裝載完畢。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------------- ------------- -------------- ------------ --------------
1 1 0 52428800 512 1 YES
UNUSED 3.4393E+11 29-12月-14 3.4393E+11 29-12月-14
3 1 135 52428800 512 1 NO
CURRENT 3.4393E+11 29-12月-14 2.8147E+14
2 1 0 52428800 512 1 YES
UNUSED 3.4393E+11 29-12月-14 3.4393E+11 29-12月-14
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出現錯誤:
ORA-01139: RESETLOGS 選項僅在不完全數據庫恢復后有效
--說明:在此恢復的是'2014-11-01 12:12:12'
SQL> recover database until time '2014-11-01 12:12:12';
完成介質恢復。
SQL> alter database open resetlogs;
數據庫已更改。
SQL> shutdown
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 1670221824 bytes
Fixed Size 2176328 bytes
Variable Size 1056967352 bytes
Database Buffers 603979776 bytes
Redo Buffers 7098368 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL>
SQL> SELECT count(1) FROM user_tables;
COUNT(1)
----------
960
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------------- ------------- -------------- ------------ --------------
1 1 1 52428800 512 1 NO
CURRENT 3.4393E+11 12-2月 -15 2.8147E+14
2 1 0 52428800 512 1 YES
UNUSED 0 0
3 1 0 52428800 512 1 YES
UNUSED 0 0
這里注意,GROUP#1變成了CURRENT,GROUP#2、3 變成了UNUSED,雖然不知道具體原因,但是也把自己的目的達到了,數據庫可以正常使用,但是已經刪除掉的數據文件對應表空間的數據應該已經沒有了。
最后發現了一個問題,操作完成后,C:\app\Administrator\oradata\orcl 目錄,重做日志文件和數據文件的時間發生了變化,但是臨時數據文件沒有改變,不懂,以后繼續研究。