在oracle 10g要準備一個讀寫備用的數據庫仍是很繁瑣的,準備好dataguard後得手動建立還原點,手動停日誌傳送,手動激活並強制打開,測試完了,若是主備的SCN差太多,你還得作增量備份追,統計了下需15步,和搭一個physical standby的步驟差很少了,因此用的極少。到11g裏終於解放了,啓用快照備庫只需3步(固然中間重啓的次數不算),恢復到實時應用備用也只需2步,日誌仍是繼續傳,須要鏡像庫測試的朋友,能夠放心用了(用dataguard borker更簡單)。固然轉換成Snapshot Standby,是有些附加條件的(沒有的參照前文去搭建一個):
1 數據庫閃回得打開;
2 db_recovery_file_dest_size仍是要有足夠的空間的;
3 若是使用的保護模式是Maximum Protection模式,必須有其餘的Standby與之相匹配,不然當心主庫宕機。
手動作的步驟以下:
1檢查閃回sql
SQL> select flashback_on,database_role,open_mode from v$database; FLASHBACK_ON DATABASE_ROLE OPEN_MODE ------------------ ---------------- -------------------- NO PHYSICAL STANDBY READ ONLY WITH APPLY
當前Standby狀態是隻讀Apply狀態,這個時候須要終止Apply過程,而且切換回mount狀態。不然是不容許進行convert動做的。數據庫
SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount; ORACLE instance started. SQL> alter database flashback on; alter database flashback on * ERROR at line 1: ORA-38706: Cannot turn on FLASHBACK DATABASE logging. ORA-38709: Recovery Area is not enabled.
報錯了,這個錯誤好解決:session
SQL> show parameter db_recovery_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string db_recovery_file_dest_size big integer 51000M SQL> alter system set db_recovery_file_dest='/data'; SQL> alter database flashback on; SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES
2 轉換oracle
SQL> alter database convert to snapshot standby; SQL> alter database open;
有興趣的能夠看下alert_sid.log
End: Standby Redo Logfile archival
RESETLOGS after incomplete recovery UNTIL CHANGE 1974538
Resetting resetlogs activation ID 1662850232 (0x631d14b8)
Online log /data/db/onlinelog/group_1.261.899048765: Thread 1 Group 1 was previously cleared
Online log /data/db/onlinelog/group_2.260.899048765: Thread 1 Group 2 was previously cleared
Online log /data/db/onlinelog/group_3.277.899049819: Thread 2 Group 3 was previously cleared
Online log /data/db/onlinelog/group_4.278.899049819: Thread 2 Group 4 was previously cleared
Online log /data/db/onlinelog/group_5.280.908381663: Thread 1 Group 5 was previously cleared
Online log /data/db/onlinelog/group_6.281.908381749: Thread 1 Group 6 was previously cleared
Online log /data/db/onlinelog/group_7.282.908381877: Thread 1 Group 7 was previously cleared
檢查下當前數據庫狀態:app
SQL> select open_mode, database_role, protection_mode from v$database; OPEN_MODE DATABASE_ROLE PROTECTION_MODE -------------------- ---------------- -------------------- READ WRITE SNAPSHOT STANDBY MAXIMUM AVAILABILITY
已經變成可寫狀態,查詢flash_back開始的SCN:ide
SQL> select oldest_flashback_scn, oldest_flashback_time from v$flashback_database_log; OLDEST_FLASHBACK_SCN OLDEST_FLASH -------------------- ------------ 1974537 17-MAY-17
從這裏開始能夠對備庫進行任何操做:測試
SQL> create table test as select * from all_objects; Table created. SQL> select count(*) from test; COUNT(*) ---------- 14629 SQL> drop table STAGE_TERADATA_OFFLINE_PKEYS purge; Table dropped.
切回:
1 關庫,切換rest
SQL>shutdown immediate SQL>startup mount; SQL> alter database convert to physical standby;
這裏查看alert_sid.log能夠看到
Flashback Restore Start
Flashback Restore Complete
Drop guaranteed restore point
刪除了還原點
2 關庫,關閃回,啓用real time apply日誌
SQL>shutdown immediate; SQL>startup mount; SQL>alter database flashback off; SQL>alter database open; SQL>RECOVER managed standby database using current logfile disconnect from session SQL>select open_mode, database_role, protection_mode,current_SCN from v$database; OPEN_MODE DATABASE_ROLE PROTECTION_MODE CURRENT_SCN -------------------- ---------------- -------------------- ----------- READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM AVAILABILITY 1977350
檢查下剛纔測試的數據:code
[oracle@ora9-2 data]$ sqlplus scott/test SQL*Plus: Release 11.2.0.4.0 Production on Wed May 17 08:42:08 2017 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-28002: the password will expire within 18446744073709551614 days Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select count(*) from test; select count(*) from test * ERROR at line 1: ORA-00942: table or view does not exist SQL> select * from STAGE_TERADATA_OFFLINE_PKEYS; no rows selected
該有的還在,不應有的也沒有了,挺好。