ORACLE 11G dataguard的一些高階管理案例研究

yuntui發表於2016-11-03
搭建完了ORACLE 11G dataguard後,也做了角色切換的實驗,有switchover已經failover,感覺受益頗多,而後繼續研究了下dataguard的一些高階管理功能,所謂冰山一角,ORACLE果然博大精深,總結記錄如下:

1,ORACLE 11G dataguard的高階管理

1.1、READ ONLY/WRITE模式開啟物理STANDBY
一般standby都是可以設定為mount狀態的,於物理standby 可以有效分擔primary 資料庫壓力,提升資源利用,實際上說的就是這個。以read only 或read write 模式開啟物理standby,你可以轉移一些查詢任何,備份之類的操作到standby資料庫,以這種方式來分擔一些primary 的壓力。下面我們來演示一下,如何切換standby 資料庫的開啟模式,其實,非常簡單。例如,以Read-only 模式開啟物理standby:


這裡分兩種情況
1) standby 資料庫處於shutdown 狀態,直接startup 即可,直接開啟到open狀態。之後查詢,確保db的狀態是如下:
SQL> select open_mode,database_role from v$database;


OPEN_MODE     DATABASE_ROLE
-------------------- ----------------
READ WRITE     PRIMARY


SQL> 


2).standby 資料庫處於redo 應用狀態。
首先取消redo 應用:
alter database recover managed standby database cancel;
然後再開啟資料庫
alter  database open;
之後查詢,確保db的狀態是如下:
SQL> select open_mode,database_role from v$database;


OPEN_MODE     DATABASE_ROLE
-------------------- ----------------
READ WRITE     PRIMARY


SQL> 
提示:open 的時候不需要附加read only 子句,oracle 會根據控制檔案判斷是否是物理standby,從而自動啟動到read only 模式,直接startup 也是同理。


1.2,如果想從open 狀態再切換回redo 應用狀態,並不需要shutdown,直接啟用redo 應用即可,例如:
SQL> select status from v$instance;


STATUS
------------
OPEN


SQL> alter database recover managed standby database disconnect from session;
SQL> alter database recover managed standby database disconnect from session;


Database altered.


SQL> 
由於只讀開啟時就不能應用,雖然我們能夠查詢,但是查詢的結果確是與primary 不同步的,這點大大降低了物理standby 做報表服務分擔主庫壓力的可能性,對於
這點,我們有兩個解決方案:
(1):改用邏輯standby,由於邏輯standby 是開啟狀態下的實時應用,因此資料同步應該是ok的(只要primary 的資料型別和操作邏輯standby 都能被支援),當然邏輯standby 有邏輯standby 的問題。


(2):standby開啟read only模式下,可以邊接收邊應用。 alter database recover managed standby database using current logfile disconnect ; 


2,影響standby的primary資料庫事件
alter database enable|disable thread語句;(主要針對rac 環境,目前基本已廢棄,因為ENABLE|DISABLE INSTANCE 子句完全能夠實現類似功能)
修改表空間狀態(例如read-write到read-only,online到offline)
建立修改刪除表空間或者資料檔案(如果初始化引數standby_file_management被設定為auto的話)


2.1,primary上修改刪除資料檔案或者表空間
初始化引數STANDBY_FILE_MANAGEMENT 可以控制是否自動將primary 資料庫增加刪除表空間、資料檔案的改動繼承到standby。
1):改用邏輯standby,由於邏輯standby
2):如果設定為manual,則需要手工複製新建立的資料檔案到standby 伺服器。
下面分別透過示例演示STANDBY_FILE_MANAGEMENT 引數值為AUTO/MANUAL 值時增加及刪除資料檔案時的情形:


3,standby_file_management設定為auto,增加以及刪除表空間和資料檔案
先去standby庫上檢視下standby_file的值
SQL> show parameter standby_file;


NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management     string AUTO
SQL> 


3.1,新增表空間測試
去primary庫上新增新的tablespace
create tablespace mytest datafile '/home/oradata/powerdes/mytest01.dbf' size 20m autoextend on next 50m;
SQL> create tablespace mytest datafile '/home/oradata/powerdes/mytest01.dbf' size 20m autoextend on next 50m;


Tablespace created.


SQL> 
檢視剛才新增的表空間的資料檔案
select name from v$datafile where name like '%mytest%';
SQL> select name from v$datafile where name like '%mytest%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/mytest01.dbf


SQL> 
切換日誌 alter system switch logfile;
SQL>  alter system switch logfile;


System altered.


SQL> 

去standby上驗證mytest表空間以及資料檔案是否已經自動傳輸到了
檢視資料檔案:select open_mode,database_role from v$database;
SQL> select open_mode,database_role from v$database;


OPEN_MODE     DATABASE_ROLE
-------------------- ----------------
READ ONLY WITH APPLY PHYSICAL STANDBY


SQL> select name from v$datafile where name like '%mytest%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/mytest01.dbf


SQL> 

檢視錶空間:select * from v$tablespace where name like '%MYTEST%';
SQL> select * from v$tablespace where name like '%MYTEST%';


       TS# NAME  INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
16 MYTEST  YES NO  YES


SQL> 


3.2,刪除表空間測試
在primary上測試:drop tablespace mytest including contents and datafiles;
SQL> drop tablespace mytest including contents and datafiles;


Tablespace dropped.


SQL> 

在primary上驗證已經刪除
SQL> select name from v$datafile where name like '%mytest%';


no rows selected


SQL> 

切換日誌:alter system switch logfile;
SQL> alter system switch logfile;


System altered.
SQL> 


在standby上驗證表空間也已經刪除完成
SQL> select name from v$datafile where name like '%mytest%';


no rows selected


SQL> 
總結是:對於初始化引數STANDBY_FILE_MANAGMENT 設定為auto 的話,對於表空間和資料檔案的操作完全無須dba 手工干預,primary 和standby 都能很好的處理。


4,STANDBY_FILE_MANAGEMENT設定為MANUAL,增加及刪除表空間和資料檔案
因為一直是auto模式,這裡為了做實驗,需要將其設定為manual,設定命令是:alter system set standby_file_management='MANUAL' scope=both;
在primary和standby上都做如下操作
SQL> alter system set standby_file_management='MANUAL' scope=both;


System altered.


SQL> 


4.1,增加新的表空間
create tablespace mytmp datafile '/home/oradata/powerdes/mytmp01.dbf' size 20m autoextend  on next 10m;
SQL> create tablespace mytmp datafile '/home/oradata/powerdes/mytmp01.dbf' size 20m autoextend  on next 10m;


Tablespace created.

SQL> SQL> 

檢查剛建立的表空間
select name from v$datafile where name like '%mytmp%';
SQL> select name from v$datafile where name like '%mytmp%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/mytmp01.dbf


SQL> 


切換日誌:alter system switch logfile;
SQL> alter system switch logfile;


System altered.


SQL> 

檢查standby庫表空間,已經存在了:
select name from v$tablespace where name like '%MYTMP%';
SQL> select name from v$tablespace where name like '%MYTMP%';


NAME
------------------------------
MYTMP


SQL> 

檢查standby庫資料檔案,不存在:
SQL> select name from v$datafile where name like '%mytmp%';


no rows selected


SQL> 


奇怪,沒有存在mytmp資料檔案,去檢查下redo日誌有沒有應用,primary和standby都一樣,如下所示:
SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     60
Next log sequence to archive   0
Current log sequence       61
SQL> 

再去檢查standby是否redo應用啟動了,也是啟用了,如下所示:
SQL> select open_mode,database_role from v$database;


OPEN_MODE     DATABASE_ROLE
-------------------- ----------------
READ ONLY     PHYSICAL STANDBY


SQL> 

都正常啊,那就再去檢查下最新建立的那個資料檔案
primary庫上:select * from(select to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss'),name from v$datafile order by  CREATION_TIME desc)a where rownum<3;
SQL> select * from(select to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss'),name from v$datafile order by  CREATION_TIME desc)a where rownum<3;


TO_CHAR(CREATION_TI
-------------------
NAME
--------------------------------------------------------------------------------
2015-02-12 16:00:26
/home/oradata/powerdes/mytmp01.dbf


2015-02-10 18:09:38
/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/D:ORACLEORASERVERORADATAPOWERDESP
LCRM01.DBF




SQL>

standby庫上:
SQL> select * from(select to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss'),name from v$datafile order by  CREATION_TIME desc)a where rownum<3;


TO_CHAR(CREATION_TI
-------------------
NAME
--------------------------------------------------------------------------------
2015-02-12 16:00:26
/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00011


2015-02-10 18:09:38
/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/D:ORACLEORASERVERORADATAPOWERDESP
LCRM01.DBF




SQL> 

發現在同一時刻2015-02-12 16:00:26primary和standby都建立了一個資料檔案,primary就是我們建立知道的mytmp表空間所屬的資料檔案,那麼standby庫呢?有一個UNNAMED00011未知的資料檔案,這段時間沒有人操作standby庫,這意味著這個UNNAMED00011就是從primary及時同步過來的表空間,只是因為不是auto所以給起了個臨時的名字而已。手工修改其與primary資料庫保持一致,如下(注意執行命令之後手工複製資料檔案到standby):
在standby庫上執行:alter database create datafile '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00011'  as '/home/oradata/powerdes/mytmp01.dbf';
SQL> alter database create datafile '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00011'  as '/home/oradata/powerdes/mytmp01.dbf';


Database altered.


SQL> 

再去檢查standby庫上檢查,mytmp資料檔案已經存在了,如下所示:
SQL>  select name from v$datafile where name like '%mytmp%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/mytmp01.dbf


SQL> 


4.3,刪除表空間測試
在primary上操作:drop tablespace mytmp including contents and datafiles;
SQL> drop tablespace mytmp including contents and datafiles;


Tablespace dropped.


SQL> 

檢查mytmp沒有記錄,已經刪除了
SQL>  select name from v$datafile where name like '%mytmp%';


no rows selected


SQL> 


再去standby庫上檢查
SQL>  select name from v$datafile where name like '%mytmp%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/mytmp01.dbf


SQL> 

看到standby庫上mytmp還在,所以需要我們人工手動處理
alter database recover managed standby database disconnect from session;
SQL> alter database recover managed standby database disconnect from session;


Database altered.


SQL> 

再去檢查,執行,就看不到mytmp的記錄了。
SQL>  select name from v$datafile where name like '%mytmp%';


no rows selected              


SQL> 


你在primary 資料庫執行刪除時加上了including 子句,在standby 資料庫仍然只會將表空間和資料檔案從資料字典中刪除,你還需要手工刪除表空間涉及的資料檔案。


結論是:初始化引數STANDBY_FILE_MANAGMENT 設定為manual 的話,對於表空間和資料檔案的操作必須有dba手工介入,所以比較麻煩;在oracle資料庫選擇檔案系統的時候,可以把dg的standby_file_managment設定成auto,這對於表空間資料檔案的維護比較方便一些。但是如果你選擇的是裸裝置的話,就必須將dg的standby_file_managment設定成manual。


5,重新命名資料檔案
如果重新命名了一個或者多個資料檔案的話,這項修改並不會自動傳輸到standby上面去,需要手動操作,不管standby_file_managment是auto或者manual;
將一個資料檔案離線測試

以下在primary庫上操作:
alter tablespace plcrm offline;
SQL> alter tablespace plcrm offline;


Tablespace altered.


SQL> 

然後手工將資料檔案改名:
[oracle@powerlong4 powerdes]$ mv plcrm01.dbf plcrm01_rename.dbf

透過命令修改資料字典中的資料檔案路徑,並online 表空間
alter tablespace plcrm rename datafile '/home/oradata/powerdes/plcrm01.dbf' to '/home/oradata/powerdes/plcrm01_rename.dbf';
SQL> alter tablespace plcrm rename datafile '/home/oradata/powerdes/plcrm01.dbf' to '/home/oradata/powerdes/plcrm01_rename.dbf';


Tablespace altered.


SQL> alter tablespace plcrm online;


Tablespace altered.


SQL>

檢查新的資料檔名:select name from v$datafile where name like '%rename%';
SQL> select name from v$datafile where name like '%rename%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/plcrm01_rename.dbf


SQL> 

以下在standby上操作:
暫停redo 應用,並shutdown
SQL> alter database recover managed standby database cancel;


Database altered.


離線表空間:alter tablespace plcrm offline;
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 

然後手工方式對資料檔案進行改名:
[oracle@powerlong5 powerdes]$ mv plcrm01.dbf plcrm01_rename.dbf

然後重啟oracle例項:
SQL> startup mount
ORACLE instance started.


Total System Global Area 3373858816 bytes
Fixed Size    2218032 bytes
Variable Size 1845495760 bytes
Database Buffers 1509949440 bytes
Redo Buffers   16195584 bytes
Database mounted.
SQL> 

資料檔案重新命名:
SQL> alter database rename file '/home/oradata/powerdes/plcrm01.dbf' to '/home/oradata/powerdes/plcrm01_rename.dbf';


Database altered.


SQL> 

重新啟動redo應用:
alter database recover managed standby database disconnect from session;
SQL> alter database recover managed standby database disconnect from session;


Database altered.


SQL> 

再去primary切換日誌: 
SQL> alter system switch logfile;


System altered.


SQL> 

最後去standby上驗證
  檢查新的資料檔名:select name from v$datafile where name like '%rename%';
SQL> select name from v$datafile where name like '%rename%';


NAME
--------------------------------------------------------------------------------
/home/oradata/powerdes/plcrm01_rename.dbf


SQL>

6,新增或刪除Online redo logs
資料庫調優的時會涉及到重置日誌檔案大小或者增加刪除日誌組等操作,這種操作不會傳輸到standby庫,也不會影響到standby的執行,但是有需要注意的地方是:
比如,我們假設我們的一臺primary 資料庫擁有5 組online redo 檔案,standby 資料庫擁有2 組,當你執行switch over 之後,新的primary 執行歸檔的頻率會比standby 高的多,因此,當你在primary 資料庫增加或移除online redologs 時,一定記的手工同步一相standby 資料庫中相關的設定。
standby redologs 與online redologs 之間的關係,即保證standby redologs 比online redologs 要至少多一組。


操作的過程很簡單(總不會複雜過新增刪除資料檔案),需要注意的就是在standby做操作前務必將STANDBY_FILE_MANAGEMENT 設定為MANUAL。

 ----------------------------------------------------------------------------------------------------------------
<版權所有,允許轉載,但必須以連結方式註明源地址,否則追究法律責任!>
原部落格地址:       http://blog.itpub.net/26230597/viewspace-1432708/
原作者:黃杉 (mchdba)
----------------------------------------------------------------------------------------------------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127688/,如需轉載,請註明出處,否則將追究法律責任。

相關文章