您好,登錄后才能下訂單哦!
1 備份恢復概述
DM7 數據庫中的數據存儲在數據庫的物理數據文件中,數據文件按照頁、簇和段的方式進行管理,數據頁是最小的數據存儲單元。任何一個對 DM7 數據庫的操作,歸根結底都是對某個數據文件頁的讀寫操作。
關于這些結構可以參考:
DM7 達夢數據庫 邏輯結構 說明
https://www.cndba.cn/dave/article/3568
DM7 備份的本質就是從數據庫文件中拷貝有效的數據頁保存到備份集中,這里的有效數據頁包括數據文件的描述頁和被分配使用的數據頁。而在備份的過程中,如果數據庫系統還在繼續運行,這期間的數據庫操作并不是都會立即體現到數據文件中,而是首先以日志的形式寫到歸檔日志中,因此,為了保證用戶可以通過備份集將數據恢復到備份結束時間點的狀態,就需要將備份過程中產生的歸檔日志也保存到備份集中。
還原與恢復是備份的反過程。還原是將備份集中的有效數據頁重新寫入目標數據文件的過程。恢復則是指通過重做歸檔日志,將數據庫狀態恢復到備份結束時的狀態;也可以恢復到指定時間點和指定 LSN。恢復結束以后,數據庫中可能存在處于未提交狀態的活動事務,這些活動事務在恢復結束后的第一次數據庫系統啟動時,會由 DM7 數據庫服務器自動進行回滾。
DM 數據庫的備份還原包括兩種類型:物理備份還原和邏輯備份還原。
物理備份還原是對數據庫的操作系統物理文件(如數據文件、控制文件和日志文件等)的備份還原。例如使用 RMAN 工具進行的備份還原。
邏輯備份還原是對數據庫邏輯組件(如表、視圖和存儲過程等數據庫對象)的備份還原。例如使用 dexp和 dimp 進行的備份還原。
2 表空間與數據文件
DM7 數據庫的表空間是一個邏輯概念,其目的主要是為了方便數據庫的管理,數據庫的所有對象在邏輯上都存放在某個表空間中,而物理上都存儲在所屬表空間的數據文件中。一個表空間由一個或多個數據文件組成。
數據文件是數據庫中最重要的文件類型,是真實數據存儲的地方。DM7 中數據文件的擴展名為.dbf,分為系統默認生成的數據文件和用戶自己創建的數據文件兩類。
在創建 DM7 數據庫時,系統會自動創建 5 個表空間:SYSTEM 表空間、ROLL 表空間、MAIN 表空間、TEMP 表空間和 HMAIN 表空間。DM7 自動為這幾個自動創建的表空間分別生成默認的數據文件:SYSTEM.DBF、ROLL.DBF、MAIN.DBF 和 TEMP.DBF,HMAIN 表空間沒有默認的數據文件。
關于表空間的說明也可以參考:
DM7 達夢數據庫 邏輯結構 說明
https://www.cndba.cn/dave/article/3568
注意:DM7 的物理備份還原不支持:
TEMP 表空間。
HUGE 表空間,即數據庫備份和還原不包括 HMAIN 和用戶創建的 HUGE表空間;也不支持對 HMAIN 和用戶創建的 HUGE 表空間進行表空間備份和還原。DM7 提供了 HUGE 表備份還原系統函數支持 HUGE 表的聯機備份還原。
關于HUGE 表空間的說明可以參考我的博客:
DM7 達夢數據庫 列存儲表 HUGE表 管理說明
https://www.cndba.cn/dave/article/3583
3 重做日志
重做日志,又叫 REDO 日志,記錄了所有物理頁的修改,基本信息包括操作類型、表空間號、文件號、頁號、頁內偏移、實際數據等。數據庫中 INSERT、DELETE、UPDATE等 DML 操作以及 CREATE TABLE 等 DDL 操作轉化為對某些數據文件、某些數據頁的修改。因此,在系統故障重啟時,通過重做 REDO 日志,可以將數據庫恢復到故障時的狀態。
DM7 數據庫默認包含兩個擴展名為 log 的日志文件,用來保存 REDO 日志,稱為聯機重做日志文件。這兩個文件循環使用。任何數據頁從內存緩沖區寫入磁盤之前,必須保證其對應的 REDO 日志已經寫入到聯機日志文件。
4 歸檔日志
DM7數據庫可以在歸檔和非歸檔兩種模式下運行。
DM7 支持多種歸檔方式,本文中若無特殊說明,均指本地歸檔。當數據庫處于歸檔模式下且配置了本地歸檔時,REDO 日志先寫入聯機日志文件,然后再異步寫入歸檔日志文件。歸檔日志文件以配置的歸檔名稱和文件創建時間命名,擴展名也是 log。
系統在歸檔模式下運行會更安全,當出現介質故障,如磁盤損壞導致數據文件丟失、異常時,利用歸檔日志,系統可以恢復至故障發生的前一刻。因此,建議將歸檔目錄與數據文件配置、保存到不同的物理磁盤上。
除了表備份還原,其他的聯機備份與還原必須運行在歸檔模式下。
關于重做日志和歸檔的更多內容可以參考:
DM7 達夢數據庫 物理結構 說明
https://www.cndba.cn/dave/article/3571
DM7 達夢數據庫 重做日志管理 及 歸檔模式切換
https://www.cndba.cn/dave/article/3575
5 檢查點
DM7 數據庫運行過程中,用戶的所有操作都在內存中進行。每修改一條記錄都必須先把記錄所在的數據頁加載到 BUFFER 緩沖區中,然后進行修改。事務運行時,會把生成的REDO 日志保留在日志緩沖區 RLOG_BUF 中,每條日志記錄對應一個 LSN,當事務提交或日志緩沖區滿或執行檢查點時會進行日志刷盤。
檢查點(checkpoint)是一個數據庫事件,它的功能是按照數據頁的修改順序,依次將 BUFFER 緩沖區中的臟頁寫入磁盤,并在這個過程中動態調整 CKPT_LSN 值,釋放日志空間。
DM7 的檢查點分為兩種:完全檢查點和部分檢查點:
1)完全檢查點:會將內存緩沖區中的所有臟頁寫入磁盤,并調整 CKPT_LSN,在數據庫正常關閉時會產生一個完全檢查點。
2)部分檢查點 :根據 dm.ini 配置文件中的參數 CKPT_FLUSH_RATE 和CKPT_FLUSH_PAGES,確定每次檢查點刷臟頁的數量。執行部分檢查點的過程中,DDL/DML操作都可以正常執行,DM7 系統中絕大多數情況下觸發的都是部分檢查點。
DM7 中幾個重要的 LSN 值如下:
1.LSN :LSN(Log Sequence Number)是由系統自動維護的 Bigint 類型數值,具有自動遞增、全局唯一特性,每一個 LSN 值代表著 DM 系統內部產生的一個物理事務。物理事務(Physical Transaction,簡稱 ptx)是數據庫內部一系列修改物理數據頁操作的集合,與數據庫管理系統中事務(Transaction)概念相對應,具有原子性、有序性、無法撤銷等特性。
2.CUR_LSN:系統當前 LSN,代表已經分配的最大 LSN 值。物理事務提交時,系統會為其分配一個唯一的 LSN 值(CUR_LSN + 1),同時修改 CUR_LSN 值為 CUR_LSN + 1。 ?
3.FILE_LSN :文件 LSN,已經寫入聯機重做日志文件的最大 LSN 值。每次將 RLOG_BUF 寫入聯機重做日志文件后,都會修改 FILE_LSN 值。
4.FLUSH_LSN:FLUSH_LSN 是已經發起日志刷盤請求,但還沒有真正寫入聯機,Redo 日志文件的最大 LSN 值。
5.CKPT_LSN :檢查點 LSN,所有 LSN <= CKPT_LSN 的物理事務修改的數據頁,都已經從 BUFFER緩沖區寫入磁盤。因此,數據庫故障重啟時,CKPT_LSN 之前的 REDO 日志不需要重做,只需要從 CKPT_LSN+1 開始重做 REDO 日志,就可以將系統恢復到故障前狀態。并且,在聯機重做日志文件中,LSN 值<=CKPT_LSN 的 REDO 日志都可以被覆蓋。
根據以上介紹的幾個 LSN 值,我們為確定備份范圍特別定義了兩個 LSN: ?
1)START_LSN :為了保證備份的完整性和有效性,必須包含的歸檔日志起始 LSN 值。START_LSN = 備份開始時 CKPT_LSN + 1。
2)END_LSN:為了保證備份的完整性和有效性,必須包含歸檔日志結束 LSN 值。END_LSN = 備份結束時 FILE_LSN。如果 START_LSN 等于 END_LSN + 1,則表明備份過程中,沒有任何數據被修改。
在做增量備份時,要求其 START_LSN 必須大于等于基準備份的 END_LSN 值,這個要求可以簡化還原過程,避免還原基準備份后必須先進行恢復再還原增量備份。
在聯機日志文件中,可以覆蓋寫入 REDO 日志的文件長度為可用日志空間;不能被覆蓋的 REDO 日志,系統故障重啟需要重做的 REDO 日志為有效日志,有效日志的 LSN 取值范圍是(CKPT_LSN,FILE_LSN]。
數據庫運行過程中產生的待寫入日志首先寫入日志緩沖區 RLOG_BUF,當日志刷盤時一起寫入聯機日志文件中。
6 備份集
備份集用來存放備份過程中產生的備份數據及備份信息。一個備份集對應了一次完整的備份。一般情況下,一個備份集就是一個目錄,備份集包含一個或多個備份片文件,以及一 個備份元數據文件。
6.1 備份片
備份片用來存儲備份數據的文件。備份時,目標數據文件內容或歸檔日志內容經過處理后,都會存放到各自的備份片文件中。備份片文件后綴為.bak,用來存放備份數據,備份集中存放數據頁的文件稱為數據備份片,存放 REDO 日志的備份片稱為日志備份片。 備份片的大小可以在備份時通過 MAXPIECESIZE 指定,一個備份集中可能生成多個備份片。
6.2 元數據
元數據文件用來存放備份信息,元數據文件的后綴為.meta。通過元數據文件,可以了解整個備份集信息。元數據文件中包含的備份信息包括:
1)? 備份集本身相關的信息,如是否聯機備份,備份的范圍,備份的加密信息,以及備份的壓縮信息等;
2)? 備份源庫的建庫參數信息,如 RAC 的節點數,是否大小寫敏感,PAGE_CHECK 屬性等;
3)? 數據文件信息,如備份了哪些數據文件,文件大小,以及文件相關的表空間信息等;
4)? 備份片的信息,如包含哪些備份片文件、備份片大小等信息;
5)? 備份庫的 dm.ini 參數信息 和 密 鑰 文件( dm_service.private 或 者dm_external.config,若指定 usbkey 加密,則不備份)。
6.3 備份集搜索目錄
備份集搜索目錄,用于搜集目標備份集的文件路徑。備份集搜索目錄包括 4 類:
1)數據庫的默認備份目錄;
2)WITH BACKUPDIR 子句指定的目錄;
3)還原時備份集所在的上級目錄;
4)增量備份時基備份集所在的上級目錄。
如果使用第三方備份(介質為 TAPE 類型),則只搜索 WITH BACKUPDIR 子句指定的備份集目錄,具體搜集方式由第三方備份程序決定。
7 備份
備份就是從源庫(備份庫)中讀取有效數據頁、歸檔日志等相關信息,經過加密、壓縮等處理后寫入備份片,并將相關備份信息寫入備份元數據文件的過程。
7.1 邏輯備份和物理備份
邏輯備份是指利用 dexp 導出工具,將指定對象(庫級、模式級、表級)的數據導出到文件的備份方式。邏輯備份針對的是數據內容,并不關心這些數據物理存儲在什么位置。
物理備份則直接掃描數據庫文件,找出那些已經分配、使用的數據頁,拷貝并保存到備份集中。物理備份過程中,不關心數據頁的具體內容是什么,也不關心數據頁屬于哪一張表,只是簡單的根據數據庫文件系統的描述,來挑選有效的數據頁。
7.2 聯機備份和脫機備份
數據庫處于運行狀態、并正常提供數據庫服務情況下進行的備份操作,我們稱為聯機備份。數據庫處于關閉狀態時進行的備份操作,被稱為脫機備份。
從 V2.0 版本開始,使用 DMRMAN 工具進行脫機備份,并且支持對異常關閉的數據庫進行脫機庫備份。備份異常關閉的數據庫,要求配置了本地歸檔,如果本地歸檔不完整,則需要先修復本地歸檔,再進行備份。
聯機備份則使用客戶端工具連接到服務器實例后,通過執行 SQL 語句進行;也可以通過配置作業,定時完成自動備份。聯機備份不影響數據庫正常提供服務,是最常用的備份手段之一。
聯機備份時,可能存在一些處于活動狀態的事務正在執行,為確保備份數據的一致性,需要將備份期間產生的 REDO 日志一起備份。因此,只能在配置本地歸檔、并開啟本地歸檔的數據庫上執行聯機備份。
只有已經關閉的數據庫才允許執行脫機備份。正在運行的數據庫,無法執行脫機備份,系統會報錯。
7.3 數據備份和歸檔日志備份
按照備份內容不同,可以分為數據備份和歸檔日志備份。數據備份主要針對數據文件內容,包括庫備份、表空間備份和表備份。
庫備份,又稱為庫級備份。庫備份會拷貝數據庫中所有數據文件的有效數據頁,如果是聯機備份,則還會拷貝備份過程中產生的歸檔日志,寫入到備份集中。
表空間備份是針對特定表空間執行的備份,又稱為表空間級備份。表空間備份只能在聯機狀態下執行。
表備份則拷貝指定表的所有數據頁到備份集中,并會記錄各個數據頁之間的邏輯關系用以恢復。表備份只能在聯機狀態下執行,一次表備份操作只能備份一張用戶表,并且不支持增量表備份。
歸檔日志備份,是專門針對歸檔日志文件進行操作,不涉及任何數據文件內容。歸檔日志備份掃描歸檔目錄收集檔文件,并將歸檔日志寫入到備份集中。既可以在數據庫運行狀態下,執行聯機歸檔日志備份;也可以在數據庫關閉狀態下執行脫機歸檔日志備份。
7.4 一致性備份和非一致性備份
按照備份集中的數據是否滿足一致性,可以將備份劃分為一致性備份和非一致性備份。
一致性備份的備份集包含了完整的數據文件內容和歸檔日志信息;利用一個單獨的備份集可以將數據庫恢復到備份時狀態。不指定 WITHOUT LOG 選項的聯機備份生成的備份集就是一致性備份。脫機數據庫備份會強制將檢查點之后的有效 REDO 日志拷貝到備份集中,因此,脫機備份一定是一致性備份。數據庫正常關閉時,會生成完全檢查點,脫機備份生成的備份集中,不包含任何 REDO 日志。
非一致性備份的備份集只包含數據文件相關內容,沒有歸檔日志信息,利用非一致性備份還原的數據庫,無法直接啟動,必須借助歸檔日志來恢復。表空間備份、指定 WITHOUT LOG選項的聯機備份生成的備份集都是非一致性備份集。
7.5 完全備份和增量備份
按照備份數據完整性,可將備份分為完全備份和增量備份。庫備份和表空間備份支持增量備份,表備份不支持增量備份。
完全備份生成的備份集包含了指定庫(或者表空間)的全部有效數據頁。當數據規模比較大的情況下,生成的完全備份集通常會比較大,而且備份時間也會比較長。
增量備份是在某個特定備份集基礎上,收集數據庫新修改的數據頁進行備份,可以有效減少備份集的空間占用、提高備份速度。這個特定的、已經存在的備份集稱為增量備份的基備份,根據對基備份的要求不同,DM 的增量備份分為以下兩種:
1. 差異增量備份
差異增量備份的基備份既可以是一個完全備份集,也可以是一個增量備份集。
利用增量備份進行還原操作時,要求其基備份必須是完整的;如果差異增量備份的基備份本身也是一個增量備份,那么同樣要求其基備份是完整的;任何一個增量備份,最終都是以一個完全備份作為其基備份。因此,完全備份是增量備份的基礎。
2. 累積增量備份
累積增量備份的基備份只能是完全備份集,而不能是增量備份集。
增量備份時,并不關心其基備份集是脫機備份生成的,還是聯機備份生成的,脫機增量備份的基備份集可以是聯機備份生成的,聯機增量備份的基備份集也可以是脫機備份生成的。
8 還原與恢復
還原是備份的逆過程,就是從備份集中讀取數據頁,并將數據頁寫入到目標數據庫對應數據文件相應位置的過程。
由于聯機備份時,系統中可能存在一些處于活動狀態的事務正在執行,并不能保證備份集中的所有數據頁是處于一致性狀態;而脫機備份時,數據頁不一定是正常關閉的,也不能保證備份集中所有數據頁是處于一致性狀態。因此,還原結束后目標庫有可能處于非一致性狀態,不能馬上提供數據庫服務;必須要進行數據庫恢復操作后,才能正常啟動。
8.1 邏輯還原和物理還原
邏輯還原是邏輯備份的逆過程,邏輯還原就是使用 dimp 工具,把 dexp 導出的備份數據重新導入到目標數據庫。
物理還原是物理備份的逆過程,物理還原一般通過 DMRMAN 工具(或者 SQL 語句),把備份集中的數據內容(數據文件、數據頁、歸檔文件)重新拷貝、寫入目標文件。
8.2 聯機還原和脫機還原
聯機還原指數據庫處于運行狀態時,通過 SQL 語句執行還原操作。表空間還原和表還原可以在聯機狀態下執行,并且表空間還原要求目標表空間不是 ONLINE 狀態。
脫機還原指數據庫處于關閉狀態時執行的還原操作,脫機還原通過 DMRMAN 工具進行。
庫備份、表空間備份和歸檔備份,可以執行脫機還原。脫機還原操作的目標庫必須處于關閉狀態。
8.3 數據還原和歸檔日志還原
根據備份集類型,數據還原可以分為庫還原、表空間還原和表還原。庫還原的目標庫必須處于關閉狀態;表空間還原既可以脫機執行也可以聯機執行;表還原操作只能聯機執行。
表空間還原的數據來源既可以是表空間備份集,也可以是庫備份集。還原的目標表空間不能是 TEMP 表空間,只能是 MAIN、SYSTEM、ROLL 表空間,或者用戶定義的表空間。
表還原從表備份集讀取數據,重新恢復目標表數據,還會在目標表上重建索引、約束。
歸檔日志還原則將歸檔日志備份集中的歸檔日志內容,重新生成到指定目錄中。
8.4 完全還原和增量還原
完全還原是指直接利用完全備份集進行數據還原操作。增量還原指通過增量備份集進行數據還原操作。但是考慮到增量備份集的基礎一定是一個完全備份集,因此增量還原過程中隱含了一個完全還原操作。如果增量備份集的基備份集被刪除了,那么單獨使用這個增量備份集是無法進行還原操作的。
物理備份還原練習
案例1:對dmserver 數據庫進行冷備(完整備份)
第一步: 通過DM服務查看器,先關閉要備份的實例,但是dmap 服務要開啟
第二步. 在dm7/bin目錄下輸入 ./dmrman
第三步:使用命令備份 backup database ‘/dm7/data/DAMENG/dm.ini’;
看到backup successfull 就是備份成功
案例2:對dmserver 數據庫進行熱備(完整/增量備份)
前提:
1.先把數據庫實例啟動
2.創建一個備份目錄,/dm7/backup
第一步. 開啟歸檔日志,可以用管理工具進行開歸檔
第二步:進行全備/增量備份
方法1.使用sql命令
SQL> backup database full backupset ‘dm7/backup/full_bak’;
SQL> backup database increment backupset '/dm7/backup/incr_bak';
注意:如果基備沒有變化,是不能增量備的
方法2.使用DM管理工具
左側節點,找到備份--》庫備份--》新建備份,選擇全備或增量備份
備份成功后可以到/dm7/data/DAMENG/bak/DB_DAMENG_FULL_2019xxxx目錄下查看備份文件
備份表空間和表
1. 備份dmhr這個表空間,備份到dm7/backup目錄下
SQL> backup tablespace dmhr backupset ‘/dm7/backup/dmhr_bak’;
2. 備份dmhr的employee表,備份到dm7/backup目錄下
SQL> backup table dmhr.employee backupset ‘/dm7/backup/dmhr_bak’;
還原表空間
案例:模擬表空間tbs2損壞,從熱備全備中恢復tbs2表空間
1.刪除tbs2 的兩個表空間文件
mv tbs2_01.dbf tbs2_01_bak.dbf
2. 重啟數據庫實例
3. 手動將數據庫實例從mount到open
SQL> alter database open;
4. 查看表空間
SQL> select tablespace_name,status from dba_dablespace;
這時候tbs2是offline
如果alter tablespace tbs2 online;就會提示tbs2_01.dbf不存在
5. 開始恢復表空間
SQL> restore tablespace dmhr.tbs2 from backupset '/dm7/backup/full_bak/';
需要注意事項
備份的數據庫和表空間,如果做還原,是還原到當前時刻、如果備份的表做還原,還原到表的備份時刻。
System表空間和roll表空間損壞,要重新初始化數據庫實例,在用備份去還原。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。