- TESTDB產生contral trace檔
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE
找到檔案後複製出來進行更改
製作成control file產生檔 xxx.sql - Shutdown database 使所有資料檔的SCN一致
- 在$ORACLE_BASE/oradata目錄下創建CLONEDB資料夾,並將所有資料檔複製過去
oradata]$ mkdir CLONEDB
TESTDB]$ cp -r *.dbf $ORACLE_BASE/oradata/CLONEDB - pfile所有TESTDB改成CLONEDB (:%s'TESTDB'CLONEDB'g)
db_name 改回TESTDB
新增 db_unique_name=CLONEDB
新增 instance_name=CLONEDB - 更改環境變數 export ORACLE_SID=CLONEDB
- SQL> startup nomount pfile=路徑;
- 製作control file: SQL> @xxx.sql檔路徑
- 開啟database: SQL> alter database open resetlogs;
- SQL> ALTER SYSTEM ARCHIVE LOG ALL;
- 建立TEMP: SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/11gr2/oradata/CLONEDB/temp01.dbf';
2017年4月12日 星期三
Cold Backup
2017年4月11日 星期二
Point-In-Time Recovery
- 在做Point-In-Time Recovery時設定的還原時間點,必須在備份完成之後的時間。舉例來說,今天早上8:00進行備份,到早上10:00完成備份,則還原時間點必須設定在10:00之後。如果設定在8:00~10:00之間,那些部分還沒備份完成的資料,就會從上一次的備份進行還原(recover),變得很麻煩。
練習 (DML操作記得commit,這樣紀錄才會寫進redo log)
備份
- RMAN> backup as backupset database spfile;
- 2017/4/12 早上09:00:00 完成備份
事件
- Insert幾筆資料至Table - 2017/4/12 早上10:00:00
- Drop Table - 2017/4/12 早上11:00:00
老闆: 哪個笨蛋把TABLE刪了?我10點輸入的資料都不見了! MIS! MIS!快給我處理一下
還原
- SQL> shutdown immediate;
- SQL> startup mount;
- RMAN> restore database;
- 恢復至TABLE刪除之前
RMAN> recover database until time "to_date('04 12 2017 10:50:00','MM DD YYYYHH24:MI:SS' )"; - SQL> alter database open resetlogs;
要注意的是Point-In-Time就像是回到過去的某個時間點,所以在那時間點之後的事都會丟失。就像The Flash回到過去一樣,會開出一條新的時間軸(Incranation),因此必須評估是否值得這樣做,如果只是回復小事情可以用Flashback功能。
Create Control File
- SQL> alter database backup controlfile to trace;
- 到產生Warn log的地方找檔案
$ORACLE_BASE/diag/rdbms/testdb/TESTDB/trace
找到內容 - 複製一份取個名xxx.sql
- 至spfile存放地址 $ORACLE_HOME/dbs
進入SQL產生pfile
SQL> create pfile from spfile;
SQL> exit; - 避免產生的control file覆蓋掉原本的,修改pfile initTESTDB.ora內的control file destination
- 在pfile目錄進入database
SQL> startup nomount pfile=initTESTDB.ora;
執行xxx.sql
SQL> @$ORACLE_BASE/diag/rdbms/testdb/TESTDB/trace/xxx.sql; - SQL> shutdown immediate;
- SQL> startup mount pfile=initTESTDB.ora;
- SQL> ALTER SYSTEM ARCHIVE LOG ALL;
- SQL> ALTER DATABASE OPEN;
- SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/11gr2/oradata/TESTDB/temp01.dbf';
2017年4月10日 星期一
Restore and Recover
RESTORE(還原) command: Restores database files from backup.
RECOVER(恢復) command: Recovers restored files by applying changes recorded in the redo log files.
RECOVER(恢復) command: Recovers restored files by applying changes recorded in the redo log files.
- 完全恢復(complete recovery)與不完全恢復(incomplete recovery)
- Complete recovery
Bring the database to the state where it is fully up-to-date, including all committed data modifications to the present time. - Incomplete recovery
Bring the database to some point in the past. This means there are missing transactions; any data modifications done between the recovery destination time and the present are lost. In many cases, this is the desirable goal because there may have been some changes made to the database that need to be undone. Recovering to a point in the past is a way to remove the unwanted changes.
Obsolete、Expired
- Obsolete
根據保留策略而被丟棄時,就會被標記為Obsolete。
例如:
設定保留策略
RMAN> configure retention policy to recovery window of 4 days;
因此5天前的備份都會被標記為Obsolete。 - Expired
Crosscheck對備份進行校驗,當備份儲存在RMAN目錄中,但是找不倒備份實體的檔案。
例如:
Our controlfile thinks that there is a backup under a directory with a name but someone delete this file from operating system. We can run crosscheck command to check if these files are exist and if rman found a file is missing then mark that backup record as expired which means is no more exists.
2017年4月9日 星期日
REDO、UNDO
- REDO
當使用DML指令時,會將我們對資料修改的操作及資料本身寫入Redo Log Buffer在適當的時機(註1)再透過LGWR寫入Redo Log File,然後把資料放進buffer cache再透過DBWR寫入datafile。
- UNDO
當我們進行交易時,Oracle會利用Undo Segment來存放異動前後的資料,在交易未Commit前,其他使用者可以在這裡查詢舊資料,如果交易失敗或取消,會回復原先資料。
註1:
- 交易確認時
- Redo Log Buffer的資料異動量放超過整個Buffer的1/3
- Redo Log Buffer的資料異動量超過1MB
- 當DBWR將異動的Data Block從Data Buffer Cache寫入Data Files之前
使用Recovery Manager-2
Catalog
設置儲存器來儲存備份資訊
設置儲存器來儲存備份資訊
舉個例子,今天我想在甲地備份,乙地還原,即使乙地有甲地的備份檔案,但沒有備份的matadata,這樣子RMAN在乙地是看不懂這些檔案的。
當RMAN開啟目標資料庫(甲地)及CATALOG資料庫的連線時,會同步備份資訊,當要在乙地進行還原時就可以透過catalog看懂甲地的備份檔案。
- 在存放catalog的資料庫設定
- 設定表格空間
SQL> create tablespace rman datafile '+DATA' size 10m autoextend on next 5m; - 創帳號
SQL> create user rman identified by rman default tablespace rman; - 設定帳號權限
SQL> grant resource, connect, recovery_catalog_owner to rman; - 設定連線
- 設定目標資料庫的tnsnames.ora
TPKTST(連線用的alias) =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = [catalog資料庫ip])(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TPKTST)
)
)- 初始化
$ rman catalog rman/rman@tpktst
RMAN> create catalog; - 註冊資料庫
$ rman target / catalog rman/rman@tpktst
RMAN> register database;
訂閱:
意見 (Atom)