Oracle 數據庫備份實戰


最近公司的客戶希望使用oracle數據庫,所以我們只好將數據從mysql數據庫遷移到oracle數據庫,並對oracle數據庫制定了一個備份策略,之前雖然對oracle很熟悉,但做備份策略還是第一次,所以詳細記錄下來並分享,歡迎大家指教。我們使用rman進行熱備份,並啟用了閃回表。平時在操作重要數據前,還會通過數據泵(expdp/impdp)進行一次邏輯備份。

備份模式

物理備份與邏輯備份

物理備份: 物理備份是磁盤塊為基本單位將數據從主機復制到備機。

邏輯備份: 邏輯備份是以文件為基本單位將數據從主機復制到備機,通過sql或者flatfile文件為中轉進行遷移。

高效性:

物理備份是位於文件系統之下和硬件磁盤驅動之上。增加了一個軟驅動,它忽略了文件和結構,處理過程簡潔,因此在執行過程中所花費在搜索操作上的開銷較少,備份的性能很高。

邏輯備份是基於文件級別的備份,由於每個文件都是由不同的邏輯塊組成。每一個邏輯的文件塊存儲在連續的物理磁盤塊上,但組成一個文件的不同邏輯塊極有可能存儲在分散的磁盤塊上。邏輯備份在對非連續存儲磁盤上的文件進行備份時需要額外的查找操作。這些額外的操作增加了磁盤的開銷,降低了磁盤的吞吐率。所以,跟物理備份相比較,備份性能較差。

物理備份避免了當文件出現一個小的改動的時候,就需要對整個文件做備份,只是會去做改動部分的備份,有效的提高了備份效率,節省了備份時間。

邏輯備份模式下,文件即使一個很小的改變,也需將整個文件備份。這樣如果一個文件很大的情況下,就會大幅度的降低備份效率,增加磁盤開銷和備份時間。

實時性:

物理備份可以做到高效的實時備份,因為在每次主機往磁盤寫數據的時候,都需要同時將數據寫入到備機,這種寫入操作都是基於磁盤扇區的,所以,很快就能被識別。只有在備機完成之后,才會返回給上層的應用系統來繼續下一步工作。

邏輯備份是很難做到實時備份的,因為它的每次修改都是基於文件的,而文件的哪部分被修改,系統很難實時捕獲到,所以備份的時候需要把整個文件讀一遍再發到備機 ,實時的效率不是很高。

支持度:

物理備份是在文件系統之下對數據進行復制,所以它不受文件系統限制,可以支持各種文件系統包括RAW分區。

邏輯備份是以單個文件為單位對數據進行復制,所以它受文件系統限制,僅能對部分支持的文件系統做備份,不支持RAW分區。

(原文摘自:https://yq.aliyun.com/articles/167057?utm_content=m_28176

 

備份方式

數據泵備份、熱備份和冷備份

數據泵備份

屬於邏輯備份,以文件為備份單位,expdb的導出模式有:

1、表模式:導出用戶所有表或者指定的表。

2、用戶模式:導出用戶所有對象以及對象中的數據。

3、導出表空間:導出數據庫中特定的表空間。

4、整個數據庫:導出數據庫中所有對象。

 

我們以用戶模式為例:

1、創建邏輯目錄,該命令不會在操作系統創建真正的目錄(要先創建真正的目錄),最好以system等管理員創建邏輯目錄。

SQL> sqlplus root/root@orcl

SQL> conn as sysdba;(輸入sys用戶名、密碼)

SQL> create directory dump_dir as '/data/exp+imp';

2、查看管理員目錄(操作系統下該目錄必須存在,假如不存在,則出錯)

SQL>select * from dba_directories;

3、給root用戶賦予在指定目錄的操作權限,最好以system等管理員賦予。

SQL>grant read,write on directory dump_dir to root;

4、導出數據

expdp root/root@orcl schemas=root dumpfile=expdp201810291556.dmp log=expdp201810291556.log directory=dump_dir;

5、導入數據

在另一台主機需要建相同的文件夾dump_dir,從用戶root導入到用戶root,不同用戶使用REMAP_SCHEMA=orcldev:orcltwo。

impdp root/root@orcl directory=dump_dir dumpfile=expdp201810291556.dmp schemas=root table_exists_action=replace

 

實際在使用expdb/impdb時有很多參數可以選擇,這里不多講述,大家自行參考oracle相關資料。

(參考博客:http://lizhiyu.iteye.com/blog/2203081

 

熱備份和冷備份

冷備份指在數據庫系統shutdown之后,使用操作系統的命令對表空間進行拷貝進行備份。冷備份只能恢復到之前的某一備份點,而該備份點到出現問題之間這段時間的數據是無法恢復的。

熱備份指在數據庫系統不停機的情況下進行備份。熱備份只能在歸檔模式下進行。熱備份可以在數據庫系統崩潰時根據歸檔日志恢復到之前的任一時間點。熱備份通常用於數據的重要性較高、數據庫系統為7 X 24不間歇工作模式時。

 

我們使用RMAN來實現熱備份。RMAN可以用來備份和還原數據庫文件、歸檔日志和控制文件。它也可以用來執行完全或不完全的數據庫恢復。但RMAN不能用於備份初始化參數文件和口令文件。RMAN備份和還原的實質是去啟動oracle中的進程,使用驅動進程去備份和還原數據。

       在進行熱備份時我們會同時備份控制文件、數據文件、重做日志。

數據文件:

每一個Oracle數據庫都要有一個或者多個物理的數據文件,這些數據文件里存儲的就是Oracle數據庫里的數據。就好比你有一個文件夾,里面有幾個txt的文本文件,文本文件里記錄的你這個月的每一筆花銷。如果把文件夾看做是數據庫,那么txt文件就是數據文件,而txt文件里面記錄的每一筆花銷就是數據了。

然而表、索引等等其實都是數據庫的邏輯結構,這些表、索引都被物理的存儲在了數據文件里面。

數據文件有三個特性:

1、一個數據文件只能屬於一個數據庫。

2、數據庫中的數據文件可以被設置成自動的增長。

3、一個或者多個數據文件就組成了數據庫的一個邏輯單元叫做---表空間。

數據文件里的數據,在需要的時候就會被讀取到內容Oracle的緩沖區中,比如當我們想查看一天數據時,而這條數據恰好又不在Oracle的緩沖區中,那么Oracle就會把這條數據從數據文件中讀取到Oracle的緩沖區中來。

當更改或者新增一天數據時,也不是馬上就寫到數據文件里面,這么做是為了減少對磁盤的訪問,提高效率,數據先存儲在緩沖區,然后在一次都寫入數據文件,這個過程有一個dbwn后台進程來控制。

控制文件:

每一個數據庫都擁有控制文件,它和數據文件一樣重要。控制文件里記錄的是對數據庫物理結構的詳細信息,例如它包括如下三個信息:

1、數據庫的名稱

2、數據文件的名字和存在位置,重做日志文件的名字和存儲位置

3、數據庫創建的時間標識

Oracle可以使用多重的控制文件,也就是說它可以同時維護多個完全一樣的控制文件,這么做就是為了防止數據文件損壞而造成的數據庫故障。比如Oracle同時維護3個控制文件,當其中有1個控制文件出問題了,就比較好解決,把出問題的刪了,在復制一份沒有問題的就可以了。

每當Oracle數據庫的實例啟動的時候,它就會通過控制文件來識別,要想執行數據庫的一些操作,必須需要哪些數據文件和重做日志文件,以及這些數據文件和重做日志文件都存在在什么位置。當數據庫的物理構成發生改變的時候,比如新增加了一個數據文件或者重做日志文件,那么控制文件就會自動的更新來記錄這些變化。另外在數據庫恢復的時候也會用到控制文件。

重做日志文件:

每個Oracle數據庫都擁有一組文件,其中包括2個或者多個重做日志文件(其實也可以擁有多組,用途跟多個控制文件一樣)。這組文件整體被稱為數據庫的重做日志,而重做日志又是由一條一條的重做記錄組成的,所有也被稱為重做記錄。

重做日志的主要作用就是記錄所有的數據變化,當一個故障導致被修改過的數據沒有從內存中永久的寫到數據文件里,那么數據的變化是可以從重做日志中獲得的,從而保證了對數據修改的不丟失。

為了防止重做日志自身的問題導致故障,所以Oracle擁有多重重做日志功能,也就是可以同時保存多組完全相同的重做日志在不同的磁盤上。

重做日志里的信息只是用於恢復由於系統或者介質故障所引起的數據沒法寫入數據文件的數據。比如突然斷電導致數據庫的關閉,那么內存中的數據就不能寫入到數據文件中,內存中的數據就會丟失。但當數據庫重新啟動時丟失的數據是可以被恢復的,可以從最近的重做日志中讀取丟失信息然后應用到數據文件中,這樣就把數據庫恢復到斷電前的狀態。

在恢復操作中恢復重做日志信息的過程叫做回滾。

 

熱備步驟

--show parameter db_name;
--sqlplus以sysdba身份連接orcl
conn /@orcl as sysdba;
--重啟監聽:lsnrctl stop/lsnrctl start 

--1、開啟歸檔模式(sqlplus工具,sys用戶)
    --查看閃回恢復區的信息。
    show parameter db_recover
    --增大閃回恢復區
    alter system set db_recovery_file_dest_size=3G;
    --修改歸檔日志的存放路徑
    alter system set log_archive_dest_1='location=/data/oracleArchive';
    
    
    --查看當前日志操作模式
    SELECT log_mode from v$database;
    --啟用歸檔日志前要先停止數據庫
    shutdown immediate;
    --數據庫以mount方式啟動
    startup mount;
    --啟用數據庫歸檔
    alter database archivelog;
    --打開數據庫
    alter database open;
    --查看歸檔日志信息
    archive log list;

--2、開啟補充日志
    --查看當前數據庫中補充日志狀態
    select SUPPLEMENTAL_LOG_DATA_MIN min,
       SUPPLEMENTAL_LOG_DATA_PK  pk,
       SUPPLEMENTAL_LOG_DATA_UI  ui,
       SUPPLEMENTAL_LOG_DATA_FK  fk,
       SUPPLEMENTAL_LOG_DATA_ALL "all"
    from v$database;
    --最小補充日志是最基本的一種數據庫級補充日志,
    --啟用最小補充日志
    alter database add supplemental log data ;
    --關閉最小補充日志
    --alter database drop supplemental log data ;
    --主鍵補充日志
    alter database add supplemental log data (primary key) columns ;
    --唯一索引補充日志
    alter database add supplemental log data (unique) columns ;
    --外鍵補充日志
    alter database add supplemental log data (foreign key) columns ;
    --全體字段補充日志
    alter database add supplemental log data (all) columns;

--3、數據庫備份,方式為全庫方式
  --文件結構:
  /data/oracleArchive
  /data/rmanbak/rman_ts
  /data/rmanbak/log
  /data/oracleBackup
  /data/oracleBackup/backup1
  /data/oracleBackup/backup2
  --a.開啟歸檔模式
  --b.創建恢復目錄的表空間rman_ts(sys用戶):
    create tablespace rman_ts datafile '/data/rmanbak/rman_ts.dbf' size 20G;
  --c.創建rman用戶並授權
    create user rman identified by root default tablespace rman_ts temporary tablespace temp;
    grant connect, recovery_catalog_owner, resource to rman;
  --d.創建恢復目錄
    rman catalog rman/root target orcl
    create catalog tablespace rman_ts
  --e.注冊目標數據庫
    register database;
  --f.使用rman進行完全數據庫備份:
  --自動備份需要寫腳本且定時執行,參見文件oracle_rman_backup.sh:

--g.使用rman進行恢復 --歸檔日志: run{ allocate channel dev1 type disk; restore archivelog all; release channel dev1; } --恢復數據庫,需要將數據庫mount或將數據文件offline --rman target sys/root@orcl --rman> shutdown immediate --rman> startup mount --RMAN> restore database; --恢復到某一備份 --RMAN> recover database; --從某一備份根據重做日志恢復到指定時間點 --RMAN> alter database open; run{ allocate channel dev1 type disk; set until time "to_date('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss')";--可以設置恢復到某一時間點 restore database; recover database; release channel dev1; } --select * from equ as of timestamp to_timestamp('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss'); --flashback table equ to timestamp(to_date('2018-09-26 14:45:50','yyyy-mm-dd hh24:mi:ss')); --根據閃回表恢復指定表的數據到指定時間點
oracle_rman_backup.sh
#在node1每晚進行全量備份,同時刪除過期備份和歸檔日志文件
#!/bin/bash
ORACLE_SID=ORCL
ORACLE_HOME=/data/oracle/product/11.2.0/db_1
ORACLE_BASE=/data/oracle
export ORACLE_SID
export ORACLE_HOME
export ORACLE_BASE
backtime=`date +%Y%m%d`
echo $backtime
$ORACLE_HOME/bin/rman target sys/root@orcl log=/data/rmanbak/log/node1_backupall_$backtime.log<<EOF
run{
    configure default device type to disk;
    configure device type disk parallelism 2;
    configure channel 1 device type disk format '/data/oracleBackup/back1/backup_%U';
    configure channel 2 device type disk format '/data/oracleBackup/back2/backup_%U';
    configure controlfile autobackup on;
    configure controlfile autobackup format for device type disk to '/data/oracleBackup/back1/ctl_%F';
    configure retention policy to recovery window of 7 days;
}
run{ 
    backup database ;
    backup archivelog all  delete input;
    report obsolete; 
    delete noprompt  obsolete; 
    crosscheck backup;
    crosscheck archivelog all;
    delete noprompt expired backup;
}
EOF
echo "backup complete!"
#當有多個節點進行備份時相互copy日志
#scp /oracle/rmanbak/log/node1_backupall_$backtime.log oracle@OracleNode2:/oracle/rmanbak/log/
exit



#RAC rman backup scripts
#每晚1點開始備份
##crontab -e
##0 1 * * * /data/rmanbak/oracle_rman_backup.sh >> /data/rmanbak/log/oracle_rman_backup.log

 

 

參考:

博客:http://lizhiyu.iteye.com/blog/2203081

https://yq.aliyun.com/articles/167057?utm_content=m_28176


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM