環境:windows7、Oracle11g
一、脫機備份
脫機備份是指在數據庫關閉情況下的數據備份,也稱為冷備份。
在書上學到的備份步驟:
1、記錄所要備份數據庫文件所在的操作系統路徑;
2、關閉數據庫,不要使用shutdown abort這種關閉方式;
3、拷貝數據庫文件到備份目錄中;
4、重啟數據庫,完成備份。
了解到這些步驟后,做了一個備份測試,要備份的數據庫為testdb。
1、記錄所要備份數據庫文件所在的操作系統路徑
(1)查看數據文件的路徑(用管理員賬戶連接)
備注:可以在sqlplus命令行或者plsql執行下面sql語句
select file_name,tablespace_name from dba_data_files;
D:\APP\LC\ORADATA\TESTDB\USERS01.DBF USERS
D:\APP\LC\ORADATA\TESTDB\UNDOTBS01.DBF UNDOTBS1
D:\APP\LC\ORADATA\TESTDB\SYSAUX01.DBF SYSAUX
D:\APP\LC\ORADATA\TESTDB\SYSTEM01.DBF SYSTEM
(2)查看控制文件的路徑
select name from v$controlfile;
D:\APP\LC\ORADATA\TESTDB\CONTROL01.CTL
D:\APP\LC\FLASH_RECOVERY_AREA\TESTDB\CONTROL02.CTL
(3)查看重做日志文件的路徑
select member from v$logfile;
D:\APP\LC\ORADATA\TESTDB\REDO03.LOG
D:\APP\LC\ORADATA\TESTDB\REDO02.LOG
D:\APP\LC\ORADATA\TESTDB\REDO01.LOG
2、關閉數據庫
SQL> conn system/Oracle123456@testdb as sysdba
已連接。
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
3、拷貝數據庫文件到備份目錄中;
如果在sqlplus下可以使用host copy拷貝,也可以直接選擇文件拷貝,把第1步的所有文件拷貝到D:\dbbackup中。
4、啟動數據庫。
SQL> startup
ORACLE 例程已經啟動。
......
二、數據庫恢復
為了模擬數據庫恢復,在DBCA工具中把testdb刪除掉,刪除成功后,執行下面恢復步驟。
1、把D:\dbbackup中的文件拷貝到原來的D:\APP\LC\ORADATA\TESTDB等目錄下。
2、新建一個實例
用管理員權限,在cmd窗口執行下面語句,其中testdb名稱要與備份的名字一樣
oradim -new -sid testdb
3、查看oracle服務和監聽是否啟動,如果沒啟動,則到控制面板的服務或cmd下運行命令啟動。
啟動服務 net start OracleServicetestdb
啟動監聽 lsnrctl start
4、啟動數據庫
cmd命令窗口中
輸入 set oracle_sid=testdb回車
再輸入 sqlplus /nolog 回車
再輸入 conn / as sysdba 回車
再輸入startup 回車
這時卻出現了錯誤:
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file 'D:/app/LC/product/11.2.0/dbhome_1/database/inittestdb.ora'
檢查了這個路徑,沒有inittestdb.ora這個文件。
-------------------------------------------------------
網上搜索了下,解決方法基本和下面大同小異:
解決方法:將$ORACLE_BASE/admin/數據庫名稱/pfile目錄下的init.ora.012009233838形式的文件copy 到$ORACLE_HOME/database 目錄下
initoracle.ora即可。(注:initoracle.ora中的oracle為你的實例名 ORACLE_SID
------------------------------------------------------
在電腦找了下,在D:\app\LC\admin\orcl\pfile目錄下有一個init.ora.9182016154717文件,把它復制到
D:/app/LC/product/11.2.0/dbhome_1/database目錄下,把里面內容的所有“orcl”改為“testdb”,保存為inittestdb.ora。
在D:\app\LC\admin目錄下建立testdb及它的子目錄pfile。
這時候再回到cmd命令行窗口執行startup,終於成功啟動數據庫了。
這時候用plsql登錄卻提示ORA-12154: TNS: 無法解析指定的連接標識符。
解決方法:
打開 D:\app\LC\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora,模仿里面的ORCL代碼,手動添加下面語句
TESTDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testdb)
)
)
三、總結
通過上面例子,知道除了備份數據文件、控制文件、重做日志文件,還要備份參數文件。
於是重新建立一個數據庫tdb,這次備份除了數據文件、控制文件、重做日志文件,還備份了
(1)D:\app\LC\product\11.2.0\dbhome_1\database目錄下的3個文件:hc_tdb.dat、PWDtdb.ora、SPFILETDB.ORA
(2)D:\app\LC\admin\tdb整個目錄,里面有adump、dpdump、pfile共3個目錄,其中pfile下面有個init.ora.919201613321文件。
(3)D:\app\LC\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
恢復的時候把數據文件、控制文件、重做日志文件、SPFILETDB.ORA、tnsnames.ora內容還原。
終於成功恢復數據庫。
hc_tdb.dat、PWDtdb.ora、D:\app\LC\admin\tdb目錄似乎恢復沒用到,但最好也是還原下。
附,恢復時候執行的命令行:
C:\Windows\system32>oradim -new -sid tdb
實例已創建。
C:\Windows\system32>set oracle_sid=tdb
C:\Windows\system32>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 10月 19 15:25:45 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> conn /as sysdba
已連接到空閑例程。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 1686925312 bytes
Fixed Size 2176368 bytes
Variable Size 989858448 bytes
Database Buffers 687865856 bytes
Redo Buffers 7024640 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL>
---------------------------------------------------
20190110 補充:
今天和同事用上面這種脫機方式恢復數據庫,電腦A是外來的,對方人員不知道數據庫賬戶,現在打算在電腦B上恢復數據庫。
操作過程:
1、電腦A數據庫已經脫機,把上面數據庫相關文件復制到電腦B上;
2、電腦B數據庫shutdown immediate,替換第1步的文件,之前已經建了數據庫實例,替換后直接startup;
3、不知道電腦A數據庫的用戶名和密碼,只知道表名和大概表個數。在數據庫管理員賬戶下,通過下面sql語句一步步排查
--查詢非默認賬戶(沒有過濾掉SCOTT和HR用戶)
select t.username,t.account_status,t.created
from dba_users t
where t.username not in
('MDDATA', 'MDSYS', 'ORDSYS', 'CTXSYS', 'ANONYMOUS', 'EXFSYS',
'OUTLN', 'DIP', 'DMSYS', 'WMSYS','XDB', 'ORACLE_OCM', 'TSMSYS',
'ORDPLUGINS', 'SI_INFORMTN_SCHEMA','OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
'DBSNMP', 'PERFSTAT', 'PUBLIC','MGMT_VIEW','WK_TEST', 'WKPROXY', 'WKSYS');
--查詢所有用戶對應的表個數,通過這步基本可以確定了
select t.owner, count(*)
from all_tables t
where t.owner not in
('MDDATA', 'MDSYS', 'ORDSYS','CTXSYS', 'ANONYMOUS', 'EXFSYS',
'OUTLN', 'DIP', 'DMSYS', 'WMSYS','XDB', 'ORACLE_OCM', 'TSMSYS',
'ORDPLUGINS', 'SI_INFORMTN_SCHEMA','OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
'DBSNMP', 'PERFSTAT', 'PUBLIC','MGMT_VIEW','WK_TEST', 'WKPROXY', 'WKSYS')
group by t.owner;
--最后驗證是否正確:查詢指定用戶下面的表名
select t.table_name from all_tables t where t.owner='用戶名' and t.table_name='表名';
4、確定是哪個用戶后,重新設置密碼
alter user 用戶名 identified by 密碼;
搞完之后過不久才發現,原來電腦A的某個WEB應用下面的配置文件就有數據庫用戶名和密碼。
