3.手工備份恢復(fù)--關(guān)閉數(shù)據(jù)庫(kù)的備份與完全還原(練習(xí)1、2)
保護(hù)數(shù)據(jù)最簡(jiǎn)單的方式就是把所有的數(shù)據(jù)庫(kù)文件復(fù)制到另一個(gè)地方,一旦出現(xiàn)問(wèn)題,可以把這些文件覆蓋到原來(lái)的位置進(jìn)行恢復(fù),然后啟動(dòng)數(shù)據(jù)庫(kù),這樣的操作叫做完全(或全部)一致數(shù)據(jù)庫(kù)庫(kù)備份與恢復(fù)。這里特別說(shuō)明的是一致數(shù)據(jù)庫(kù)備份通常指的是冷備份(關(guān)閉數(shù)據(jù)庫(kù)),在這種狀態(tài)下數(shù)據(jù)文件、重做日志以及控制文件都被標(biāo)以相同的SCN號(hào)。
第3、4節(jié)將介紹三種完全恢復(fù):
(1)數(shù)據(jù)庫(kù)完全關(guān)閉備份和還原,不進(jìn)行恢復(fù);
(2)完全的關(guān)閉備份和恢復(fù);
(3)不完全恢復(fù)。
練習(xí)1:備份關(guān)閉的數(shù)據(jù)庫(kù)
本練習(xí)將備份PRACTICE所有的數(shù)據(jù)文件,接著模擬出現(xiàn)嚴(yán)重故障,刪除所有的數(shù)據(jù)庫(kù)文件,然后從備份還原所有數(shù)據(jù)庫(kù)文件,并打開(kāi)數(shù)據(jù)庫(kù)。
步驟一:生成數(shù)據(jù)庫(kù)活動(dòng)日志
在這里我們向TINA用戶DATE_LOG表插入數(shù)據(jù),在數(shù)據(jù)還原后查看該筆數(shù)據(jù)是否存在,以確認(rèn)還原是否成功,其腳本如下:
2 SQL>INSERT INTO tina.date_log values (sysdate+10*365);
3 SQL>COMMIT;
4 SQL>ALTER SESSION SET nls_date_format=’yyyy-MM-dd HH24:mi:ss’;
5 SQL>SELECT create_date FROM tina.date_log;
步驟二:創(chuàng)建備份腳本
利用腳本創(chuàng)建執(zhí)行命令是一種快速、簡(jiǎn)便、保證腳本正確的方法,下面我們將創(chuàng)建一個(gè)名為closed_copy.sql的數(shù)據(jù)庫(kù)腳本,這些腳本添加錯(cuò)誤處理、驗(yàn)證、日志等部分可以使用在工作中。
2 set feedback off heading off verify off trimspool off
3 set pagesize 0 linesize 200
4 Remark Set SQL*Plus user variables used in this script
5 define dir = 'D:\oracle\CODE\chap4'
6 define fil = 'D:\oracle\CODE\tmp\closed_backup_commands.sql'
7 prompt *** Spooling to &fil
8 Remark Create a command file with file backup commands
9 spool &fil
10 select 'host copy ' || name || ' &dir' from v$datafile order by 1;
11 select 'host copy ' || member || ' &dir' from v$logfile order by 1;
12 select 'host copy ' || name || ' &dir' from v$controlfile order by 1;
13 select ‘host copy ‘ || name || ‘ &dir’ from v$tempfile order by 1;
14 spool off;
15 remark Shutdown the database cleanly
16 shutdown immediate;
17 Remark Run the copy file commands form the operating system
18 @&fil
19 Remark Start the database again
20 startup;
- 第2-3行設(shè)置SQL*Plus變量,避免從數(shù)據(jù)庫(kù)中提取的結(jié)果在命令文件中顯示不必要的內(nèi)容;
- 第5-6行在腳本范圍內(nèi)為命令制定用戶變量, dir變量指定了備份文件將被拷貝的路徑位置,fil則指定了生成備份命令的文件名稱,在接下來(lái)的腳本中,可以通過(guò)在變量名前加&來(lái)引用該變量;
- 第7行使用SQL*Plus提示命令顯示輸出結(jié)果;
- 第9行通知SQL*Plus將所有的屏幕結(jié)果輸出結(jié)果寫入一個(gè)文件,該文件名為變量fil所定義的closed_backup_commands.sql
- 第10-13行給出了多個(gè)操作系統(tǒng)命令,執(zhí)行對(duì)PRACTICE數(shù)據(jù)庫(kù)中每一個(gè)數(shù)據(jù)文件的拷貝。符號(hào)||用于連接SQL命令中的字符串,使用V$動(dòng)態(tài)視圖復(fù)制各個(gè)數(shù)據(jù)文件、聯(lián)機(jī)重做日志文件、控制文件以及臨時(shí)文件。Host用于在SQL*Plus提示符下運(yùn)行操作系統(tǒng)命令;
- 第14行停止向closed_backup_commands.sql文件寫命令;
- 第16行正常關(guān)閉數(shù)據(jù)庫(kù);
- 第18行開(kāi)始執(zhí)行前面創(chuàng)建的所有命令,由于數(shù)據(jù)庫(kù)文件較大,將需要較多時(shí)間執(zhí)行;
- 第20行再次啟動(dòng)數(shù)據(jù)庫(kù)。
注意:以上腳本執(zhí)行需要以SYSDBA角色SYS或SYSTEM連接數(shù)據(jù)庫(kù)
步驟三:運(yùn)行備份腳本
通過(guò)步驟二創(chuàng)建了closed_copy.sql腳本,此時(shí)利用start或@命令運(yùn)行該腳本:
在運(yùn)行過(guò)程中將出現(xiàn)命令行窗口,不要關(guān)閉,運(yùn)行后在目標(biāo)路徑出現(xiàn)PRACTICE數(shù)據(jù)庫(kù)的拷貝,如下圖所示:
練習(xí)2:還原整個(gè)數(shù)據(jù)庫(kù)
本練習(xí)中將還原上一練習(xí)中復(fù)制PRACTICE數(shù)據(jù)庫(kù)所有文件,一旦文件還原,不需要恢復(fù)就能打開(kāi)數(shù)據(jù)庫(kù)。
步驟一:刪除數(shù)據(jù)庫(kù)文件
為了模擬真實(shí)環(huán)境,我們可以設(shè)想一名新手在數(shù)據(jù)庫(kù)關(guān)閉狀態(tài)下,意外地刪除了數(shù)據(jù)庫(kù)所有文件,在這里我們關(guān)閉數(shù)據(jù)庫(kù)并刪除PRACTICE數(shù)據(jù)庫(kù)中所有數(shù)據(jù)庫(kù)文件。
步驟二:還原備份數(shù)據(jù)庫(kù)文件
通過(guò)復(fù)制上一練習(xí)備份的數(shù)據(jù)庫(kù)文件到PRACTICE數(shù)據(jù)庫(kù)文件位置上。
步驟三:打開(kāi)數(shù)據(jù)庫(kù)
這里我們通過(guò)先加載控制文件啟動(dòng)數(shù)據(jù)庫(kù),具體腳本如下:
以下討論非必要,但有助于了解數(shù)據(jù)庫(kù)還原、恢復(fù)機(jī)制。打開(kāi)數(shù)據(jù)庫(kù)的告警日志D:\oracle\product\10.1.0\admin\PRACTICE\bdump\alert_practice.log(視實(shí)際情況打開(kāi))
通過(guò)以上信息我們可以知道在數(shù)據(jù)庫(kù)關(guān)閉時(shí),需要關(guān)閉SMON、ARCHIVE等進(jìn)程后才能完全關(guān)閉數(shù)據(jù)庫(kù)。對(duì)上面通過(guò)mount啟動(dòng)數(shù)據(jù)庫(kù),查看相關(guān)列檢查是否和關(guān)閉時(shí)間是否一致:
2 SQL>SELECT file#, status, checkpoint_change#, checkpoint_time,
3 Last_change#, last_time FROM v$datafile;
通過(guò)查詢可以發(fā)現(xiàn)數(shù)據(jù)庫(kù)關(guān)閉的時(shí)間2010-01-10 15:10:32正是數(shù)據(jù)文件檢查點(diǎn)發(fā)生的時(shí)間2010-01-10 15:10:31:
上述文件中,數(shù)據(jù)文件檢查點(diǎn)的SCN是513045,當(dāng)前重做日志中的第一個(gè)更改號(hào)是510573,因此,數(shù)據(jù)庫(kù)備份發(fā)生在重做日志的第3組為當(dāng)前狀態(tài)時(shí)。
在掃描了已加載的控制文件的視圖后,可以使用ALTER DATABASE OPEN命令打開(kāi)數(shù)據(jù)庫(kù)。
步驟四:確認(rèn)數(shù)據(jù)庫(kù)還原
除非數(shù)據(jù)文件、控制文件和聯(lián)機(jī)重做日志一致,否則打開(kāi)不了Oracle數(shù)據(jù)庫(kù)。可以從TINA.DATE_LOG查詢數(shù)據(jù),確認(rèn)是否存在一筆比當(dāng)前時(shí)間大10年的數(shù)據(jù)。
--向DATE_LOG插入一筆10年后的數(shù)據(jù),插入后查看是否存在
2 SQL>SELECT create_date FROM tina.date_log ORDER BY create_date DESC;

浙公網(wǎng)安備 33010602011771號(hào)