測試oracle數據庫的脫機備份和恢復

環境: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應用下面的配置文件就有數據庫用戶名和密碼。

相關文章
相關標籤/搜索