環境:windows七、Oracle11g
1、脫機備份
脫機備份是指在數據庫關閉狀況下的數據備份,也稱爲冷備份。
在書上學到的備份步驟:
一、記錄所要備份數據庫文件所在的操做系統路徑;
二、關閉數據庫,不要使用shutdown abort這種關閉方式;
三、拷貝數據庫文件到備份目錄中;
四、重啓數據庫,完成備份。
瞭解到這些步驟後,作了一個備份測試,要備份的數據庫爲testdb。
一、記錄所要備份數據庫文件所在的操做系統路徑
(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
二、關閉數據庫
SQL> conn system/Oracle123456@testdb as sysdba
已鏈接。
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
三、拷貝數據庫文件到備份目錄中;
若是在sqlplus下可使用host copy拷貝,也能夠直接選擇文件拷貝,把第1步的全部文件拷貝到D:\dbbackup中。
四、啓動數據庫。
SQL> startup
ORACLE 例程已經啓動。
......
2、數據庫恢復
爲了模擬數據庫恢復,在DBCA工具中把testdb刪除掉,刪除成功後,執行下面恢復步驟。
一、把D:\dbbackup中的文件拷貝到原來的D:\APP\LC\ORADATA\TESTDB等目錄下。
二、新建一個實例
用管理員權限,在cmd窗口執行下面語句,其中testdb名稱要與備份的名字同樣
oradim -new -sid testdb
三、查看oracle服務和監聽是否啓動,若是沒啓動,則到控制面板的服務或cmd下運行命令啓動。
啓動服務 net start OracleServicetestdb
啓動監聽 lsnrctl start
四、啓動數據庫
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這個文件。sql
-------------------------------------------------------數據庫
網上搜索了下,解決方法基本和下面大同小異:
windows
解決方法:將$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)
)
)
3、總結
經過上面例子,知道除了備份數據文件、控制文件、重作日誌文件,還要備份參數文件。
因而從新創建一個數據庫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目錄彷佛恢復沒用到,但最好也是還原下。
oracle
附,恢復時候執行的命令行:app
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>ide
---------------------------------------------------工具
20190110 補充:測試
今天和同事用上面這種脫機方式恢復數據庫,電腦A是外來的,對方人員不知道數據庫帳戶,如今打算在電腦B上恢復數據庫。spa
操做過程:操作系統
一、電腦A數據庫已經脫機,把上面數據庫相關文件複製到電腦B上;
二、電腦B數據庫shutdown immediate,替換第1步的文件,以前已經建了數據庫實例,替換後直接startup;
三、不知道電腦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='表名';
四、肯定是哪一個用戶後,從新設置密碼
alter user 用戶名 identified by 密碼;
搞完以後過不久才發現,原來電腦A的某個WEB應用下面的配置文件就有數據庫用戶名和密碼。