Oracle 數據庫備份實戰

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

備份模式

物理備份與邏輯備份mysql

物理備份: 物理備份是磁盤塊爲基本單位將數據從主機複製到備機。sql

邏輯備份: 邏輯備份是以文件爲基本單位將數據從主機複製到備機,經過sql或者flatfile文件爲中轉進行遷移。數據庫

高效性:bash

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

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

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

邏輯備份模式下,文件即便一個很小的改變,也需將整個文件備份。這樣若是一個文件很大的狀況下,就會大幅度的下降備份效率,增長磁盤開銷和備份時間。性能

實時性:ui

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

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

支持度:

物理備份是在文件系統之下對數據進行復制,因此它不受文件系統限制,能夠支持各類文件系統包括RAW分區。

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

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

 

備份方式

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

數據泵備份

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

一、表模式:導出用戶全部表或者指定的表。

二、用戶模式:導出用戶全部對象以及對象中的數據。

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

四、整個數據庫:導出數據庫中全部對象。

 

咱們以用戶模式爲例:

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

SQL> sqlplus root/root@orcl

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

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

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

SQL>select * from dba_directories;

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

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

四、導出數據

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

五、導入數據

在另外一臺主機須要建相同的文件夾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文件裏面記錄的每一筆花銷就是數據了。

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

數據文件有三個特性:

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

二、數據庫中的數據文件能夠被設置成自動的增加。

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

數據文件裏的數據,在須要的時候就會被讀取到內容Oracle的緩衝區中,好比當咱們想查看一天數據時,而這條數據剛好又不在Oracle的緩衝區中,那麼Oracle就會把這條數據從數據文件中讀取到Oracle的緩衝區中來。

當更改或者新增一天數據時,也不是立刻就寫到數據文件裏面,這麼作是爲了減小對磁盤的訪問,提升效率,數據先存儲在緩衝區,而後在一次都寫入數據文件,這個過程有一個dbwn後臺進程來控制。

控制文件:

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

一、數據庫的名稱

二、數據文件的名字和存在位置,重作日誌文件的名字和存儲位置

三、數據庫建立的時間標識

Oracle可使用多重的控制文件,也就是說它能夠同時維護多個徹底同樣的控制文件,這麼作就是爲了防止數據文件損壞而形成的數據庫故障。好比Oracle同時維護3個控制文件,當其中有1個控制文件出問題了,就比較好解決,把出問題的刪了,在複製一份沒有問題的就能夠了。

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

重作日誌文件:

每一個Oracle數據庫都擁有一組文件,其中包括2個或者多個重作日誌文件(其實也能夠擁有多組,用途跟多個控制文件同樣)。這組文件總體被稱爲數據庫的重作日誌,而重作日誌又是由一條一條的重作記錄組成的,全部也被稱爲重作記錄。

重作日誌的主要做用就是記錄全部的數據變化,當一個故障致使被修改過的數據沒有從內存中永久的寫到數據文件裏,那麼數據的變化是能夠從重作日誌中得到的,從而保證了對數據修改的不丟失。

爲了防止重作日誌自身的問題致使故障,因此Oracle擁有多重重作日誌功能,也就是能夠同時保存多組徹底相同的重作日誌在不一樣的磁盤上。

重作日誌裏的信息只是用於恢復因爲系統或者介質故障所引發的數據無法寫入數據文件的數據。好比忽然斷電致使數據庫的關閉,那麼內存中的數據就不能寫入到數據文件中,內存中的數據就會丟失。但當數據庫從新啓動時丟失的數據是能夠被恢復的,能夠從最近的重作日誌中讀取丟失信息而後應用到數據文件中,這樣就把數據庫恢復到斷電前的狀態。

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

 

熱備步驟

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

--一、開啓歸檔模式(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;

--二、開啓補充日誌
    --查看當前數據庫中補充日誌狀態
    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;

--三、數據庫備份,方式爲全庫方式
  --文件結構:
  /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

相關文章
相關標籤/搜索