【Oracle】Oracle備份的幾種方式

這里使用Oracle 12C來(lái)大概演示說(shuō)明一下rman的基本用法,這里不會(huì)深入討論,因?yàn)楸救艘仓皇莿倓偛沤佑|,只是結(jié)合了網(wǎng)上的一些文章以及自己的實(shí)踐來(lái)總結(jié)并拿出來(lái)大家學(xué)習(xí),謝謝

目錄

  • 一、關(guān)于備份與恢復(fù)
  • 二、邏輯備份(expdp和impdp)
  • 三、物理備份
  • 四、數(shù)據(jù)庫(kù)日常備份計(jì)劃及腳本參考

一、關(guān)于備份與恢復(fù)

1、備份定義

備份就是把數(shù)據(jù)庫(kù)復(fù)制到轉(zhuǎn)儲(chǔ)設(shè)備的過(guò)程。其中,轉(zhuǎn)儲(chǔ)設(shè)備是指用于放置數(shù)據(jù)庫(kù)副本的磁帶或磁盤(pán)。通常也將存放于轉(zhuǎn)儲(chǔ)設(shè)備中的數(shù)據(jù)庫(kù)的副本稱(chēng)為原數(shù)據(jù)庫(kù)的備份或轉(zhuǎn)儲(chǔ)。備份是一份數(shù)據(jù)副本

2、備份分類(lèi)

從物理與邏輯的角度來(lái)分類(lèi):
從物理與邏輯的,備份可以分為物理備份和邏輯備份。
物理備份:對(duì)數(shù)據(jù)庫(kù)操作系統(tǒng)的物理文件(數(shù)據(jù)文件,控制文件和日志文件)的備份。物理備份又可以分為脫機(jī)備份(冷備份)和聯(lián)機(jī)備份(熱備份),前者是在關(guān)閉數(shù)據(jù)庫(kù)的時(shí)候進(jìn)行的,后者是以歸檔日志的方式對(duì)運(yùn)行的數(shù)據(jù)庫(kù)進(jìn)行備份。可以使用oracle的恢復(fù)管理器(RMAN)或操作系統(tǒng)命令進(jìn)行數(shù)據(jù)庫(kù)的物理備份。
邏輯備份:對(duì)數(shù)據(jù)庫(kù)邏輯組件(如表和存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象)的備份。邏輯備份的手段很多,如傳統(tǒng)的EXP,數(shù)據(jù)泵(EXPDP),數(shù)據(jù)庫(kù)閃回技術(shù)等第三方工具,都可以進(jìn)行數(shù)據(jù)庫(kù)的邏輯備份。

從數(shù)據(jù)庫(kù)的備份角度分類(lèi):
從數(shù)據(jù)庫(kù)的備份角度,備份可以分為完全備份和增量備份和差異備份
完全備份:每次對(duì)數(shù)據(jù)庫(kù)進(jìn)行完整備份,當(dāng)發(fā)生數(shù)據(jù)丟失的災(zāi)難時(shí),完全備份無(wú)需依賴(lài)其他信息即可實(shí)現(xiàn)100%的數(shù)據(jù)恢復(fù),其恢復(fù)時(shí)間最短且操作最方便。
增量備份:只有那些在上次完全備份或增量備份后被修改的文件才會(huì)被備份。優(yōu)點(diǎn)是備份數(shù)據(jù)量小,需要的時(shí)間短,缺點(diǎn)是恢復(fù)的時(shí)候需要依賴(lài)以前備份記錄,出問(wèn)題的風(fēng)險(xiǎn)較大。
差異備份:備份那些自從上次完全備份之后被修改過(guò)的文件。從差異備份中恢復(fù)數(shù)據(jù)的時(shí)間較短,因此只需要兩份數(shù)據(jù)---最后一次完整備份和最后一次差異備份,缺點(diǎn)是每次備份需要的時(shí)間較長(zhǎng)。

3、恢復(fù)定義

恢復(fù)就是發(fā)生故障后,利用已備份的數(shù)據(jù)文件或控制文件,重新建立一個(gè)完整的數(shù)據(jù)庫(kù)

4、恢復(fù)分類(lèi)

實(shí)例恢復(fù):當(dāng)oracle實(shí)例出現(xiàn)失敗后,oracle自動(dòng)進(jìn)行的恢復(fù)
介質(zhì)恢復(fù):當(dāng)存放數(shù)據(jù)庫(kù)的介質(zhì)出現(xiàn)故障時(shí)所作的恢復(fù)。介質(zhì)恢復(fù)又分為完全恢復(fù)和不完全恢復(fù)
完全恢復(fù):將數(shù)據(jù)庫(kù)恢復(fù)到數(shù)據(jù)庫(kù)失敗時(shí)的狀態(tài)。這種恢復(fù)是通過(guò)裝載數(shù)據(jù)庫(kù)備份并應(yīng)用全部的重做日志做到的。
不完全恢復(fù):將數(shù)據(jù)庫(kù)恢復(fù)到數(shù)據(jù)庫(kù)失敗前的某一時(shí)刻的狀態(tài)。這種恢復(fù)是通過(guò)裝載數(shù)據(jù)庫(kù)備份并應(yīng)用部分的重做日志做到的。進(jìn)行不完全恢復(fù)后,必須在啟動(dòng)數(shù)據(jù)庫(kù)時(shí)用resetlogs選項(xiàng)重設(shè)聯(lián)機(jī)重做日志。

二、邏輯備份(expdp和impdp)

1、expdp/impdp和exp/imp的區(qū)別
  1. exp和imp是客戶端工具程序,它們既可以在客戶端使用,也可以在服務(wù)端使用。
  2. expdp和impdp是服務(wù)端的工具程序,他們只能在oracle服務(wù)端使用,不能在客戶端使用。
  3. imp只適用于exp導(dǎo)出的文件,不適用于expdp導(dǎo)出文件;impdp只適用于expdp導(dǎo)出的文件,而不適用于exp導(dǎo)出文件。
  4. 對(duì)于10g以上的服務(wù)器,使用exp通常不能導(dǎo)出0行數(shù)據(jù)的空表,而此時(shí)必須使用expdp導(dǎo)出。

本節(jié)主要講解的是expdp/impdp的用法,不涉及到exp和imp

2、導(dǎo)出數(shù)據(jù)

在準(zhǔn)備要備份的數(shù)據(jù)庫(kù)服務(wù)器上創(chuàng)建備份目錄(在后面使用sql命令創(chuàng)建的邏輯目錄并不是在OS上創(chuàng)建目錄,所以我們先要在服務(wù)器上創(chuàng)建一個(gè)目錄)

# su oracle
$ mkdir /home/oracle/oracle_bak

用管理員身份登錄到sqlplus

$ sqlplys /nolog
SQL> conn sys/oracle as sysdba

創(chuàng)建邏輯目錄

SQL> create directory data_dir as '/home/oracle/oracle_bak';

查看管理員目錄是否存在

SQL> select * from dba_direcories;

使用管理員用戶給指定的用戶賦予在該目錄的操作權(quán)限(比如該用戶需要備份自己的數(shù)據(jù))

SQL> grant read,write on directory data_dir to C##BAK_TEST_USER;

導(dǎo)出可有五種方式
1、“full=y”,全量導(dǎo)出數(shù)據(jù)庫(kù)

$ expdp sys/oracle@orcl dumpfile=expdp.dmp directory=data_dir full=y logfile=expdp.log

2、schemas按用戶導(dǎo)出

$ expdp user/passwd@orcl schemas=user dumpfile=expdp.dmp directory=data_dir logfile=expdp.log

3、按表空間導(dǎo)出

$ expdp sys/passwd@orcl tablespace=tbs1,tbs2 dumpfile=expdp.dmp directory=data_dir logfile=expdp.log

4、導(dǎo)出表

$ expdp user/passwd@orcl tables=table1,table2 dumpfile=expdp.dmp directory=data_dir logfile=expdp.log

5、按查詢(xún)條件導(dǎo)出

$ expdp user/passwd@orcl tables=table1='where number=1234' dumpfile=expdp.dmp directory=data_dir logfile=expdp.log
2、導(dǎo)入數(shù)據(jù)

首先將需要導(dǎo)入的數(shù)據(jù)文件存放導(dǎo)需要導(dǎo)入的數(shù)據(jù)庫(kù)服務(wù)器上

參照導(dǎo)出的時(shí)候的建立目錄方式建立物理目錄和邏輯目錄(只是建目錄即可,如果需要給用戶權(quán)限則加上給用戶權(quán)限的那步)

使用命令導(dǎo)入,同時(shí),導(dǎo)入方式也可以分為五種,分別對(duì)應(yīng)著導(dǎo)出的五種方式

1、“full=y”,全量導(dǎo)入數(shù)據(jù)庫(kù);

impdp user/passwd directory=data_dir dumpfile=expdp.dmp full=y

2、同名用戶導(dǎo)入,從用戶A導(dǎo)入到用戶A;

impdp A/passwd schemas=A directory=data_dir dumpfile=expdp.dmp logfile=impdp.log;

3、
①?gòu)腁用戶中把表table1和table2導(dǎo)入到B用戶中;

impdp B/passwdtables=A.table1,A.table2 remap_schema=A:B directory=data_dir dumpfile=expdp.dmp logfile=impdp.log;

②將表空間TBS01、TBS02、TBS03導(dǎo)入到表空間A_TBS,將用戶B的數(shù)據(jù)導(dǎo)入到A,并生成新的oid防止沖突;

impdp A/passwd remap_tablespace=TBS01:A_TBS,TBS02:A_TBS,TBS03:A_TBS remap_schema=B:A FULL=Y transform=oid:n 
directory=data_dir dumpfile=expdp.dmp logfile=impdp.log

4、導(dǎo)入表空間;

impdp sys/passwd tablespaces=tbs1 directory=data_dir dumpfile=expdp.dmp logfile=impdp.log

5、追加數(shù)據(jù);

impdp sys/passwd directory=data_dir dumpfile=expdp.dmp schemas=system table_exists_action=replace logfile=impdp.log; 
--table_exists_action:導(dǎo)入對(duì)象已存在時(shí)執(zhí)行的操作。有效關(guān)鍵字:SKIP,APPEND,REPLACE和TRUNCATE
3、并行操作

可以通過(guò) PARALLEL 參數(shù)為導(dǎo)出使用一個(gè)以上的線程來(lái)顯著地加速作業(yè)。每個(gè)線程創(chuàng)建一個(gè)單獨(dú)的轉(zhuǎn)儲(chǔ)文件,因此參數(shù) dumpfile 應(yīng)當(dāng)擁有和并行度一樣多的項(xiàng)目。您可以指定通配符作為文件名,而不是顯式地輸入各個(gè)文件名,例如:

expdp ananda/abc123 tables=CASES directory=DPDATA1 dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export 

注意:dumpfile 參數(shù)擁有一個(gè)通配符 %U,它指示文件將按需要?jiǎng)?chuàng)建,格式將為expCASES_nn.dmp,其中nn 從 01 開(kāi)始,然后按需要向上增加。

在并行模式下,狀態(tài)屏幕將顯示四個(gè)工作進(jìn)程。(在默認(rèn)模式下,只有一個(gè)進(jìn)程是可見(jiàn)的)所有的工作進(jìn)程同步取出數(shù)據(jù),并在狀態(tài)屏幕上顯示它們的進(jìn)度。
分離訪問(wèn)數(shù)據(jù)文件和轉(zhuǎn)儲(chǔ)目錄文件系統(tǒng)的輸入/輸出通道是很重要的。否則,與維護(hù) Data Pump 作業(yè)相關(guān)的開(kāi)銷(xiāo)可能超過(guò)并行線程的效益,并因此而降低性能。并行方式只有在表的數(shù)量多于并行值并且表很大時(shí)才是有效的。

數(shù)據(jù)庫(kù)監(jiān)控
您還可以從數(shù)據(jù)庫(kù)視圖獲得關(guān)于運(yùn)行的 Data Pump 作業(yè)的更多信息。監(jiān)控作業(yè)的主視圖是 DBA_DATAPUMP_JOBS,它將告訴您在作業(yè)上有多少個(gè)工作進(jìn)程(列 DEGREE)在工作。

另一個(gè)重要的視圖是 DBA_DATAPUMP_SESSIONS,當(dāng)它與上述視圖和 V$SESSION 結(jié)合時(shí)將給出主前臺(tái)進(jìn)程的會(huì)話 SID。

select sid, serial# from v$session s, dba_datapump_sessions d where s.saddr = d.saddr;    

這條指令顯示前臺(tái)進(jìn)程的會(huì)話。更多有用的信息可以從警報(bào)日志中獲得。當(dāng)進(jìn)程啟動(dòng)時(shí),MCP 和工作進(jìn)程在警報(bào)日志中顯示如下:

kupprdp:master process DM00 started with pid=23, OS id=20530 to execute - SYS.KUPM$MCP.MAIN('CASES_EXPORT', 'ANANDA'); kupprdp:worker process DW01 started with worker id=1, pid=24, OS id=20532 to execute - SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA'); kupprdp:worker process DW03 started with worker id=2, pid=25, OS id=20534 to execute - SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA'); 

它顯示為數(shù)據(jù)泵操作啟動(dòng)的會(huì)話的 PID。您可以用以下查詢(xún)找到實(shí)際的 SID:

select sid, program from v$session where paddr in (select addr from v$process where pid in (23,24,25)); 

PROGRAM 列將對(duì)應(yīng)警報(bào)日志文件中的名稱(chēng)顯示進(jìn)程 DM (為主進(jìn)程)或 DW (為工作進(jìn)程)。如果一個(gè)工作進(jìn)程使用了并行查詢(xún),比如說(shuō) SID 23,您可以在視圖 V$PX_SESSION 中看到它,并把它找出來(lái)。它將為您顯示從 SID 23 代表的工作進(jìn)程中運(yùn)行的所有并行查詢(xún)會(huì)話:

select sid from v$px_session where qcsid = 23; 

從視圖 V$SESSION_LONGOPS
中可以獲得其它的有用信息來(lái)預(yù)測(cè)完成作業(yè)將花費(fèi)的時(shí)間。

select sid, serial#, sofar, totalwork from v$session_longops where opname = 'CASES_EXPORT' and sofar != totalwork; 

列 totalwork 顯示總工作量,該列的 sofar 數(shù)量被加和到當(dāng)前的時(shí)刻 — 因而您可以用它來(lái)估計(jì)還要花多長(zhǎng)時(shí)間。

4、不同版本數(shù)據(jù)庫(kù)之間數(shù)據(jù)互導(dǎo)

如將11g數(shù)據(jù)庫(kù)的數(shù)據(jù)導(dǎo)入導(dǎo)10g數(shù)據(jù)庫(kù)的服務(wù)器上
首先在11g服務(wù)器上導(dǎo)出

EXPDP USERID='SYS/cuc2009@cuc as sysdba' schemas=sybj directory=DATA_PUMP_DIR dumpfile=aa.dmp logfile=aa.log version=10.2.0.1.0

然后在10g數(shù)據(jù)庫(kù)服務(wù)器上導(dǎo)入

IMPDP USERID='SYS/cuc2009@cucf as sysdba' schemas=sybj directory=DATA_PUMP_DIR dumpfile=aa.dmp logfile=aa.log version=10.2.0.1.0

三、物理備份

1、使用rman工具備份及恢復(fù)

說(shuō)明:
  1. RMAN是 ORACLE提供的一個(gè)備份與恢復(fù)的工具,可以用來(lái)執(zhí)行完全或不完全的數(shù)據(jù)庫(kù)恢復(fù)。
  2. RMAN不能用于備份初始化參數(shù)文件和口令文件。
  3. 與傳統(tǒng)工具相比,RMAN具有獨(dú)特的優(yōu)勢(shì):跳過(guò)未使用的數(shù)據(jù)塊。當(dāng)備份一個(gè)RMAN備份集時(shí),RMAN不會(huì)備份從未被寫(xiě)入的數(shù)據(jù)塊,而傳統(tǒng)的方式無(wú)法獲知那些是未被使用的數(shù)據(jù)塊。
  4. RMAN可以進(jìn)行增量備份(增量備份是針對(duì)于上一次備份(無(wú)論是哪種備份):備份上一次備份后,所有發(fā)生變化的文件)

1、首先需要在將要備份的數(shù)據(jù)庫(kù)服務(wù)器上切換服務(wù)器的歸檔模式,如果已經(jīng)是歸檔模式了,那么可以跳過(guò)此步
# su oracle //切換到oracle用戶
$ sqlplus /nolog //啟動(dòng)sqlplus
SQL> conn / as sysdba //以DBA的身份連接數(shù)據(jù)庫(kù)
SQL> shutdown immediate; //立即關(guān)閉數(shù)據(jù)庫(kù)
SQL> startup mount //啟動(dòng)實(shí)例并加載數(shù)據(jù)庫(kù),但不打開(kāi)
SQL> alter database archivelog; //更改數(shù)據(jù)庫(kù)為歸檔模式
SQL> alter database open; //打開(kāi)數(shù)據(jù)庫(kù)
SQL> alter system archive log start; //啟用自動(dòng)歸檔
SQL> exit //退出

2、啟動(dòng)并連接到rman(恢復(fù)管理器)

可以開(kāi)個(gè)專(zhuān)門(mén)用于備份的用戶,不過(guò)這里使用了sys用戶

$ rman target=sys/oracle@orcl
3、基本設(shè)置

具體路徑可自己安裝需求改,但是登錄的用戶需要對(duì)備份的目錄有讀寫(xiě)權(quán)限,目錄建立方法可參考上面邏輯備份的備份目錄建立

RMAN> configure default device type to disk; //設(shè)置默認(rèn)的備份設(shè)備為磁盤(pán)
RMAN> configure device type disk parallelism 2; //設(shè)置備份的并行級(jí)別,通道數(shù)
RMAN> configure channel 1 device type disk format '/home/oracle/oracle_bak/bakup_%U'; //設(shè)置備份的文件格式,只適用于磁盤(pán)設(shè)備
RMAN> configure channel 2 device type disk format '/home/oracle/oracle_bak/bakup2_%U'; //設(shè)置備份的文件格式,只適用于磁盤(pán)設(shè)備
RMAN> configure controlfile autobackup on; //打開(kāi)控制文件與服務(wù)器參數(shù)文件的自動(dòng)備份
RMAN> configure controlfile autobackup format for device type disk to '/home/oracle/oracle_bak/ctl_%F'; //設(shè)置控制文件與服務(wù)器參數(shù)文件自動(dòng)備份的文件格式

說(shuō)明:
format:
%c:備份片的拷貝數(shù)(從1開(kāi)始編號(hào));
%d:數(shù)據(jù)庫(kù)名稱(chēng);
%D:位于該月中的天數(shù)(DD);
%M:位于該年中的月份(MM);
%F:一個(gè)基于DBID唯一的名稱(chēng),這個(gè)格式的形式為c-xxx-YYYYMMDD-QQ,其中xxx位該數(shù)據(jù)庫(kù)的DBID,YYYYMMDD為日期,QQ是一個(gè)1-256的序列;
%n:數(shù)據(jù)庫(kù)名稱(chēng),并且會(huì)在右側(cè)用x字符進(jìn)行填充,使其保持長(zhǎng)度為8;
%u:是一個(gè)由備份集編號(hào)和建立時(shí)間壓縮后組成的8字符名稱(chēng)。利用%u可以為每個(gè)備份集產(chǎn)生一個(gè)唯一的名稱(chēng);
%p:表示備份集中的備份片的編號(hào),從1開(kāi)始編號(hào);
%U:是%u_%p_%c的簡(jiǎn)寫(xiě)形式,利用它可以為每一個(gè)備份片段(既磁盤(pán)文件)生成一個(gè)唯一的名稱(chēng),這是最常用的命名方式;
%t:備份集時(shí)間戳;
%T:年月日格式(YYYYMMDD);

channel的概念:一個(gè)channel是rman于目標(biāo)數(shù)據(jù)庫(kù)之間的一個(gè)連接,"allocate channel"命令在目標(biāo)數(shù)據(jù)庫(kù)啟動(dòng)一個(gè)服務(wù)器進(jìn)程,同時(shí)必須定義服務(wù)器進(jìn)程執(zhí)行備份和恢復(fù)操作使用的I/O類(lèi)型

通道控制命令可以用來(lái):

  • 控制rman使用的OS資源
  • 影響并行度
  • 指定I/O帶寬的限制值(設(shè)置 limit read rate 參數(shù))
  • 指定備份片大小的限制(設(shè)置 limit kbytes)
  • 指定當(dāng)前打開(kāi)文件的限制值(設(shè)置 limit maxopenfiles)
4、查看所有配置
RMAN> show all;
5、查看數(shù)據(jù)庫(kù)方案報(bào)表
RMAN> report schema;
6、全量備份數(shù)據(jù)庫(kù)及全量恢復(fù)

1、全量備份全庫(kù)

RMAN> backup database plus archivelog delete input; //備份全庫(kù)及控制文件、服務(wù)器參數(shù)文件與所有歸檔的重做日志,并刪除舊的歸檔日志





2、備份表空間
這里也可以改為備份某個(gè)表空間,比如 back tablespace users;就是備份users的表空間

RMAN> backup tablespace system plus archivelog delete input; //備份指定表空間及歸檔的重做日志,并刪除舊的歸檔日志


3、備份歸檔日志

RMAN> backup archivelog all delete input;

4、復(fù)制數(shù)據(jù)文件

RMAN> copy datafile 1 to '/home/oracle/oracle_bak/bak/system.copy';

說(shuō)明一下,這里的數(shù)字1對(duì)應(yīng)著命令report schema結(jié)果中的1



5、查看備份和文件副本

RMAN> list backup;



查看復(fù)制文件

RMAN> list copy

6、驗(yàn)證備份

RMAN> validate backupset 3;

這里說(shuō)明一下,3這個(gè)數(shù)字代表的是備份集的編號(hào),可以在list backup命令的結(jié)果中查看

7、從自動(dòng)備份中恢復(fù)表空間
如果只丟失了特定的表空間的數(shù)據(jù)文件,那么可以選擇只恢復(fù)這個(gè)表空間,而不是恢復(fù)整個(gè)數(shù)據(jù)庫(kù),表空間恢復(fù)可以在不關(guān)閉數(shù)據(jù)庫(kù)的情況下進(jìn)行,只需要將需要恢復(fù)的表空間offline

現(xiàn)在模擬某個(gè)表空間丟失或損壞

$ cd /database/oracle/oracle/oradata/orcl
$ mv users01.dbf users01_bak.dbf

現(xiàn)在開(kāi)始恢復(fù)表空間users01
進(jìn)入到rman

$ rman target=sys/oracle@orcl

使表空間脫機(jī)

RMAN> sql 'alter tablespace users offline immediate';

還原表空間

RMAN> restore tablespace users;

恢復(fù)表空間

RMAN> recover tablespace users;

將表空間聯(lián)機(jī)

RMAN> sql 'alter tablespace users online';

8、恢復(fù)和復(fù)原全數(shù)據(jù)庫(kù)

模擬數(shù)據(jù)文件丟失或損壞

$ cd /database/oracle/oracle/oradata/orcl
$ mv system01.dbf system01_bak.dbf

現(xiàn)在重新啟動(dòng)實(shí)例會(huì)報(bào)錯(cuò)



查看數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)

SQL> select status from v$instance;

登錄到rman

$ rman target=sys/oracle@orcl

還原數(shù)據(jù)庫(kù)

RMAN> restore database;

恢復(fù)數(shù)據(jù)庫(kù)

RMAN> recover database;

打開(kāi)數(shù)據(jù)庫(kù)并登錄數(shù)據(jù)庫(kù)查看狀態(tài)

RMAN> alter database open; 
SQL> select status from v$instance;

此時(shí)數(shù)據(jù)文件已恢復(fù)了

9、某一個(gè)數(shù)據(jù)文件恢復(fù)
查看系統(tǒng)當(dāng)前的數(shù)據(jù)文件

SQL> col file_name for a50
SQL> select file_id,file_name,status from dba_data_files;

查看文件狀態(tài)

SQL> select file#,status from v$datafile;

模擬刪除文件

$ mv sysaux01.dbf sysaux01_bak.dbf

將數(shù)據(jù)文件設(shè)置未offline狀態(tài)

SQL> alter database datafile 3 offline;

此時(shí)數(shù)據(jù)文件狀態(tài)未recover


現(xiàn)在來(lái)恢復(fù)數(shù)據(jù)文件
進(jìn)入到rman

$ rman target=sys/oracle@orcl

還原和恢復(fù)數(shù)據(jù)文件

RMAN> restore datafile 3;
RMAN> recover datafile 3;

將數(shù)據(jù)文件設(shè)置為online并查看狀態(tài)

SQL> alter database datafile 2 online;
SQL> select file#,status form v$datafile;
7、增量備份數(shù)據(jù)庫(kù)及增量恢復(fù)

本節(jié)從一個(gè)例子來(lái)說(shuō)明增量恢復(fù),首先在數(shù)據(jù)庫(kù)表中插入一條數(shù)據(jù)



接著用rman做一次全量備份(設(shè)置的參數(shù)可參考上面的設(shè)置)

RMAN> backup incremental level 0 database;

然后對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)作更改,這里添加了一條數(shù)據(jù)



然后再做一次差異增量備份

RMAN> backup incremental level 1 database;

這里再添加一條數(shù)據(jù)



然后再進(jìn)行一次備份
然后再做一次差異增量備份

RMAN> backup incremental level 1 database;

這里使用了scn的恢復(fù)方式
查看當(dāng)前scn

SQL> select dbms_flashback.get_system_change_number from dual;

然后對(duì)數(shù)據(jù)進(jìn)行刪除


還有一種常用的獲取到scn的方式就是執(zhí)行下面語(yǔ)句,將刪除的時(shí)間轉(zhuǎn)換為scn

SQL> select timestamp_to_scn(to_timestamp('2011-08-03 10:00:00','YYYY-MM-DD HH:MI:SS')) from dual;

然后我們現(xiàn)在來(lái)進(jìn)行恢復(fù)
關(guān)閉數(shù)據(jù)庫(kù)實(shí)例,然后開(kāi)啟實(shí)例,單不打開(kāi)數(shù)據(jù)庫(kù)

SQL> shutdown immediate;
SQL> startup mount;

還原數(shù)據(jù)到指定scn的位置

RMAN> restore database until scn 2092046;

恢復(fù)數(shù)據(jù)到指定scn的位置

RMAN> recover database until scn 2092046;

因?yàn)槭遣煌耆謴?fù)(指定了某個(gè)位置),所以在打開(kāi)數(shù)據(jù)庫(kù)的命令要加上resetlogs

SQL> alter database open resetlogs;

然后再看看數(shù)據(jù)庫(kù),發(fā)現(xiàn)數(shù)據(jù)已經(jīng)恢復(fù)了


如果需要基于時(shí)間點(diǎn)的恢復(fù),可以參考一下(參考網(wǎng)上資料,沒(méi)實(shí)踐過(guò))

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SQL> shutdown immediate;
SQL> startup mount;
RMAN> restore database until time "to_date('2019-7-19 13:19:00','YYYY-MM-DD HH24:MI:SS')";
RMAN> recover database until time "to_date('2019-7-19 13:19:00','YYYY-MM-DD HH24:MI:SS')";
SQL> alter database open resetlogs;

基于日志序列的恢復(fù)(參考網(wǎng)上資料,沒(méi)實(shí)踐過(guò)):

SQL> shutdown immediate;
SQL> startup mount;
RMAN> restore database until SEQUENCE 100 thread 1; //100是日志序列
RMAN> recover database until SEQUENCE 100 thread 1;
SQL> alter database open resetlogs;

日志序列查看命令:

SQL>select * from v$log;

其中有一個(gè)sequence字段.resetlogs就會(huì)把sequence 置為1

8、刪除備份文件

刪除無(wú)效備份。首先執(zhí)行CROSSCHECK命令核對(duì)備份集,如果發(fā)現(xiàn)備份無(wú)效(比如備份對(duì)應(yīng)的數(shù)據(jù)文件損壞或丟失),RMAN會(huì)將該備份集標(biāo)記為 EXPIRED狀態(tài)。要?jiǎng)h除相應(yīng)的備份記錄,可以執(zhí)行DELETE EXPIRED BACKUP命令:

RMAN> DELETE EXPIRED BACKUP; 

刪除EXPIRED副本,如下所示:

RMAN> DELETE EXPIRED COPY; 

刪除特定備份集,如下所示:

RMAN> DELETE BACKUPSET 19; 

刪除特定備份片,如下所示:

RMAN> DELETE BACKUPPIECE 'd:/backup/DEMO_19.bak'; 

刪除所有備份集,如下所示:

RMAN> DELETE BACKUP; 

刪除特定映像副本,如下所示:

RMAN> DELETE DATAFILE COPY 'd:/backup/DEMO_19.bak'; 

刪除所有映像副本,如下所示:

RMAN> DELETE COPY; 
2、冷備

冷備相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,基本原來(lái)就是手動(dòng)將日志文件、數(shù)據(jù)文件、控制文件復(fù)制到備份的目錄
基本步驟是:shutdown數(shù)據(jù)庫(kù)---> copy文件---> start數(shù)據(jù)庫(kù)

$ sqlplus sys/ as sysdba
SQL> shutdown immediate;
SQL> exit;
$ cd /database/oracle/oracle/oradata/orcl //數(shù)據(jù)庫(kù)數(shù)據(jù)目錄
$ cp -p * /home/oracle/oracle_bak //復(fù)制所有文件及目錄到備份目錄下
$ sqlplus sys/ as sysdba
SQL> startup;

說(shuō)明:
*.dbf:數(shù)據(jù)文件
*.ctl:控制文件
*.log:日志文件

3、使用歸檔模式熱備

說(shuō)明:歸檔模式熱備份的數(shù)據(jù)庫(kù)是必須在歸檔模式下的(有點(diǎn)廢話,但oracle默認(rèn)安裝是在非歸檔模式下)
將數(shù)據(jù)庫(kù)轉(zhuǎn)換為歸檔模式(注意數(shù)據(jù)庫(kù)必須已裝載到此實(shí)例并且不在任何實(shí)例中打開(kāi)):

$ sqlplus / as sysdba //登錄數(shù)據(jù)庫(kù)
SQL> shutdown immediate;
SQL> startup mount;(startup nomount 啟動(dòng)實(shí)例;startup mount 啟動(dòng)實(shí)例加載數(shù)據(jù)庫(kù); startup 啟動(dòng)實(shí)例加載數(shù)據(jù)庫(kù)打開(kāi)數(shù)據(jù)庫(kù))
SQL> alter database archivelog;

一些歸檔的相關(guān)操作記錄:

SQL> archive log list;--查看是否出于歸檔模式;

SQL> select name from v$archived_log; --查詢(xún)歸檔日志

(10G之后)
SQL> alter database archivelog;
SQL> alter database noarchivelog;

(10G之前)
SQL> archive log stop;
SQL> archive log start;
SQL> alter system set log_archive_start =true scope =spfile;
SQL> alter system set log_achive_start=false scope=spfile;

熱備的步驟如下:

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

SQL> alter tablespace users begin backup; --設(shè)置備份模式;

$ cp -Rp oracle/ /home/oracle/oracle_bak/;--拷貝

SQL> alter tablespace users end backup ;--結(jié)束備份狀態(tài)

SQL> alter system switch logfile--切換日志,使用當(dāng)前日志歸檔

四、數(shù)據(jù)庫(kù)日常備份計(jì)劃及腳本參考

1、如果是使用RMAN

備份計(jì)劃可參考:
1.星期天晚上:全備份
2.星期一晚上:增量備份
3.星期二晚上:增量備份
4.星期三晚上:累積備份
5.星期四晚上:增量備份
6.星期五晚上:增量備份
7.星期六晚上:增量備份
如果星期二需要恢復(fù)的話,只需要1+2
如果星期四需要恢復(fù)的話,只需要1+4
如果星期五需要恢復(fù)的話,只需要1+4+5
如果星期六需要恢復(fù)的話,只需要1+4+5+6

如果需要自動(dòng)備份,可使用備份腳本+crontab的方式執(zhí)行
執(zhí)行腳本命令:

rman target / msglog=bakl0.log cmdfile=bakl0 (/表示需要連接的目標(biāo)數(shù)據(jù)庫(kù),msglog表示日志文件,cmdfile表示的是腳本文件)
如:rman target sys/oracle@orcl msglog=/home/oracle/oracle_bak/bakl1.log cmdfile=/home/oracle/oracle_bak

腳本內(nèi)容為:

run{
    allocate channel cha1 type disk;
    backup
    incremental level  0
    format '/u01/rmanbak/inc0_%u_%T'(u表示唯一的ID,大T是日期,小t是時(shí)間)
    tag monday_inc0 //標(biāo)簽可以順便起,沒(méi)關(guān)系
    database;
    release channel cha1;
    }

改動(dòng)以上的備份等級(jí)可弄出全量、增量、累積備份的腳本,然后使用crontab自動(dòng)執(zhí)行即可

2、如果是使用備份腳本

備份腳本內(nèi)容如下:

#!/bin/sh

export ORACLE_BASE=/data/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=orcl

export ORACLE_TERM=xterm

export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export LANG=C

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

#以上代碼為Oracle數(shù)據(jù)庫(kù)運(yùn)行賬號(hào)oracle的系統(tǒng)環(huán)境變量設(shè)置,必須添加,否則crontab任務(wù)計(jì)劃不能執(zhí)行。

# oracle用戶的系統(tǒng)環(huán)境變量路徑:/home/oracle/.bash_profile

date=date +%Y_%m_%d   #獲取系統(tǒng)當(dāng)前日期時(shí)間

days=7  #設(shè)置刪除7天之前的備份文件

orsid=192.168.0.198:1521/orcl  #Oracle數(shù)據(jù)庫(kù)服務(wù)器IP、端口、SID

orowner=OSYUNWEI  #備份此用戶下面的數(shù)據(jù)

bakuser=OSYUNWEI  #用此用戶來(lái)執(zhí)行備份,必須要有備份操作的權(quán)限

bakpass=OSYUNWEI  #執(zhí)行備注的用戶密碼

bakdir=/backup/oracledata  #備份文件路徑,需要提前創(chuàng)建好

bakdata=$orowner"_"$date.dmp #備份數(shù)據(jù)庫(kù)名稱(chēng)

baklog=$orowner"_"$date.log #備份執(zhí)行時(shí)候生成的日志文件名稱(chēng)

ordatabak=$orowner"_"$date.tar.gz #最后保存的Oracle數(shù)據(jù)庫(kù)備份文件

cd $bakdir #進(jìn)入備份目錄

mkdir -p $orowner #按需要備份的Oracle用戶創(chuàng)建目錄

cd $orowner #進(jìn)入目錄

exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog #執(zhí)行備份

tar -zcvf $ordatabak $bakdata  $baklog  #壓縮備份文件和日志文件

find $bakdir/$orowner  -type f -name "*.log" -exec rm {} \; #刪除備份文件

find $bakdir/$orowner  -type f -name "*.dmp" -exec rm {} \; #刪除日志文件

find $bakdir/$orowner  -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;  #刪除7天前的備份(注意:{} \中間有空格)

然后添加腳本執(zhí)行權(quán)限:

chmod +x /backup/oracledata/ordatabak.sh   #添加腳本執(zhí)行權(quán)限

然后將腳本添加至crontab執(zhí)行計(jì)劃即可

參考資料
邏輯備份:
https://www.cnblogs.com/promise-x/p/7477360.html(可作為expdp/impdp命令參考)
https://www.cnblogs.com/huacw/p/3888807.html
https://www.cnblogs.com/wishyouhappy/p/3700313.html
RMAN備份:
https://www.cnblogs.com/hllnj2008/p/4117792.html
https://www.cnblogs.com/wishyouhappy/p/3700313.html
https://blog.csdn.net/shudaqi2010/article/details/75300437
https://blog.csdn.net/weixin_41078837/article/details/80609077
https://blog.csdn.net/imliuqun123/article/details/79543378
備份腳本:
http://www.ttlsa.com/oracle/linux-auto-backup-oracle-database/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容