搭建 Oracle Data Guard

用 rman duplicate 進行創建 Standby 庫

                                             
主機名                 node1                     node2
ip                  192.168.0.191            192.168.0.192
db_name                moxi                    moxi
instance_name          moxi                    moxi
db_unique_name         mth                     atlas
service_names          moxi                    moxi
tns alias              first                   second
 

-------------------------
1 啓用 Force Logging
-------------------------
Primary 數據庫置爲 Force Logging 模式。通過下列語句,看狀態:
select database_role, force_logging from v$database;

DATABASE_ROLE    FOR
---------------- ---
PRIMARY          NO

修改模式
alter database force logging;

取消 Force logging 模式:
alter database no force logging;



-----------------------------
2 創建 standby redo logs
-----------------------------
在最大保護和最高可用性模式,還有 real-time apply時,必須爲 Standby 數據庫配置 Standby Redo logs
2 點注意的地方:
每個 standby redo log 文件的大小必須大於等於 Primary 庫的 online redo 的大小。最好是一樣大。standby redo log group 要比 primary redo group 至少多一組。
這裏要注意 Thread,每個 Thread 都有對應的所有的組。一般情況下,單實例只有 1 thread,那麼單實例到 standby 只需要比現在的組多一個就可以了。

如果是 RAC DGRAC 的每個節點都可以看成是一個 thread,這種情況下,standby 端的 redo log group 就是:(每線程的日誌組數 + 1* 最大線程數。

比如有 2 個線程,每個線程有 3 組,standby redo 就需要(3+1* 2 = 8 組。

線程查看命令:
select group#, thread#, bytes, members from v$log;

    GROUP#    THREAD#      BYTES    MEMBERS
---------- ---------- ---------- ----------
         1          1   52428800          1
         2          1   52428800          1
         3          1   52428800          1

select thread#, groups from v$thread;

   THREAD#     GROUPS
---------- ----------
         1          3

set line 200
col member for a80
set pagesize 9999
select group#, status, type, member from v$logfile order by 1,4;

    GROUP# STATUS  TYPE    MEMBER
---------- ------- ------- --------------------------------------------------
         1         ONLINE  /data1/app/oracle/oradata/moxi/redo01.log
         2         ONLINE  /data1/app/oracle/oradata/moxi/redo02.log
         3         ONLINE  /data1/app/oracle/oradata/moxi/redo03.log

Standby Redo Log
對於單線程:
alter database add standby logfile thread 1 group 4 ('/data1/app/oracle/oradata/moxi/st_1_4.log') size 50m;
alter database add standby logfile thread 1 group 5 ('/data1/app/oracle/oradata/moxi/st_1_5.log') size 50m;
alter database add standby logfile thread 1 group 6 ('/data1/app/oracle/oradata/moxi/st_1_6.log') size 50m;
alter database add standby logfile thread 1 group 7 ('/data1/app/oracle/oradata/moxi/st_1_7.log') size 50m;

查看 redo log
set line 200
col member for a80
set pagesize 9999
select group#, status, type, member from v$logfile order by 1,4;

----------------------------
3 設置主數據庫初始化參數
----------------------------
首先查看下列參數:
col name for a50
col value for a50
set line 150
set pagesize 9999
select name, value from v$parameter
where name in
('db_name','db_unique_name','service_names','log_archive_config','log_archive_dest_1',
'log_archive_dest_2','log_archive_dest_state_1','log_archive_dest_state_2',
'standby_file_management','fal_client','fal_server','db_file_name_convert',
'log_file_name_convert','remote_login_passwordfile');

修改如下:
alter system set log_archive_config='dg_config=(mth,atlas)';

alter system set log_archive_dest_1='location=/data2/app/arch/valid_for=(all_logfiles,all_roles) db_unique_name=mth';
alter system set log_archive_dest_2='service=second valid_for=(online_logfile,primary_role) db_unique_name=atlas';

alter system set log_archive_dest_state_1=enable;
alter system set log_archive_dest_state_2=defer;
alter system set standby_file_management=auto;
alter system set fal_client=first;
alter system set fal_server=second;

alter system set db_file_name_convert='/data1/app/oracle/oradata/moxi/','/data1/app/oracle/oradata/moxi/' scope=spfile;
alter system set log_file_name_convert='/data1/app/oracle/oradata/moxi/','/data1/app/oracle/oradata/moxi/' scope=spfile;


------------------
4 設置歸檔模式
------------------
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;

-----------------------------------------------------
5 Create a Control File for the Standby Database
-----------------------------------------------------
注意:如果用了 rman duplicate,那麼步驟 5 創建 standby 控制文件,可以省略掉了。
------------------------------------------------------------------------------
查看 primary 數據庫 control 文件信息:
col name for a60
select name from v$controlfile;

Primary 庫上執行如下語句,爲 Standby 數據庫創建控制文件:
shutdown immediate;
startup mount;
alter database create standby controlfile as '/data2/app/control01.ctl';
alter database open;

-------------------------------------------------------
6 Create a Parameter File for the Standby Database
-------------------------------------------------------
Primary 上,創建 pfile 文件:
create pfile from spfile;

修改參數文件 pfile
*.control_files='/data1/app/oracle/oradata/moxi/control01.ctl','/data1/app/oracle/flash_recovery_area/moxi/control02.ctl'
*.db_name='moxi'
*.db_unique_name='ATLAS'

*.fal_client='SECOND'
*.fal_server='FIRST'

*.log_archive_config='dg_config=(mth,atlas)'

*.log_archive_dest_1='location=/data2/app/arch/valid_for=(all_logfiles,all_roles)  db_unique_name=atlas'
*.log_archive_dest_2='service=first valid_for=(online_logfile,primary_role) db_unique_name=mth'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.service_names='MOXI'
*.standby_file_management='AUTO'

備庫
rman duplicate 創建 standby 庫是一定要在備庫的 pfile 文件添加下面內容。
*.log_file_name_convert='/data1/app/oracle/oradata/moxi/','/data1/app/oracle/oradata/moxi/'
*.db_file_name_convert='/data1/app/oracle/oradata/moxi/','/data1/app/oracle/oradata/moxi/'



---------------------------------------------------------------
7 Copy Files from the Primary System to the Standby System
---------------------------------------------------------------
rman 備份、密碼文件、參數文件、控制文件都拷貝到備數據庫中。
在備庫中運行如下命令:
mkdir -p /data1/app/oracle/admin/moxi/adump
mkdir -p /data1/app/oracle/oradata/moxi
mkdir -p /data1/app/oracle/flash_recovery_area
mkdir -p /data1/app/oracle/flash_recovery_area/moxi


RMAN
備份 Primary 數據庫,Standby 庫用 duplicate 進行恢復,下面是在 Primary 主庫操作:
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
backup as compressed backupset format '/data2/app/backup/db_%U' database plus archivelog;
backup current controlfile for standby format='/data2/app/backup/control_%U';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}

rman 備份全部拷貝到 standby 備庫相同的目錄下
$ cd /data1/app/backup
$ scp -r * oracle@node2:/data1/app/backup

Standby 數據庫執行 rman 恢復
sqlplus / as sysdba
startup nomount pfile=/data1/app/oracle/product/11.2.0/dbhome_1/dbs/initmoxi.ora


開始 rman duplicate
注意說明:rman 後面的 target sys 用戶是主數據庫的,後面 auxiliary / 指的是 Standby 數據庫
$ rman target sys/123@first auxiliary /
duplicate target database for standby nofilenamecheck dorecover;


創建 Standby spfile 文件
sqlplus / as sysdba
create spfile from pfile='/data1/app/oracle/product/11.2.0/dbhome_1/dbs/initmoxi.ora';



------------------------------------------------------
8 Configure listeners for the primary and standby
------------------------------------------------------
配置監聽器
$ netmgr

在主庫和備庫上分別執行:netmgr 命令配置 listener tnsname.ora
$ cat listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = moxi)
      (ORACLE_HOME = /data1/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = moxi)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.191)(PORT = 1521))
  )

ADR_BASE_LISTENER = /data1/app/oracle


$ cat tnsnames.ora
FIRST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.191)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = moxi)
    )
  )

SECOND =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.192)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = moxi)
    )
  )



----------------
9 DG 主備庫啓動
----------------

standby 監聽:lsnrctl start
第一次開啓,因爲第一次只有 pfile,所以要指定 pfile 開啓 standby 備庫,然後就可以在 standby 生成 spfile 了:
startup pfile='/data1/app/oracle/product/11.2.0/dbhome_1/dbs/initmoxi.ora' nomount
create spfile from pfile;
alter database mount standby database;


以後直接執行如下,啓動備援資料庫,語法如下:----------->“等同於 startup mount
SQL> connect sys/oracle as sysdba
SQL> startup nomount
SQL> alter database mount standby database


下面查看 standby 備庫的狀態
select status from v$instance;


set line 200
select open_mode, protection_mode, protection_level, database_role, switchover_status, force_logging from v$database;


執行下面就可以 applied redo 日誌,如果是物理恢復就是 MRP
alter database recover managed standby database disconnect from session;
alter database recover managed standby database disconnect;

主庫監聽器:lsnrctl start
主庫: startup



----------------
10 開始同步
----------------
下面是在 Primary 數據庫上執行如下。
alter system set log_archive_dest_state_2=enable scope=both;

Primary 庫執行如下,進行日誌的切換。
alter system switch logfile;
select status,error from v$archive_dest where dest_id=2;


standby 備庫 執行如下:
alter database open;
alter database recover managed standby database using current logfile disconnect;

SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY WITH APPLY

------------
11 驗證
------------
下面查看 standby 備庫的狀態
select status from v$instance;

set line 200
select open_mode, protection_mode, protection_level, database_role, switchover_status, force_logging from v$database;

下面是在 primary 主庫執行如下:
col dest_name for a20
col destination for a20
select dest_name, destination, status, error from v$archive_dest;
上面 error 列沒有顯示,說明 redo 傳輸成功。

下面在 primary 主庫執行日誌切換:
SQL> alter system switch logfile;

下面在 primary standby 分別查看日誌是否相等,如果相等說明傳輸成功:
SQL> select max(sequence#) from v$archived_log;

下面查看 redo 傳送狀態,在 standby 中執行:
set line 200
col name for a50
select name, sequence#, applied, first_time, next_time from v$archived_log order by sequence#;



---------------------
最大性能轉換到最大可用
---------------------
shutdown immediate
startup mount
alter systemset log_archive_dest_2='service=second LGWR SYNC AFFIRM valid_for=(online_logfile,primary_role) db_unique_name=atlas';
alter database set standby database to maximize availability;
alter database open;
select open_mode, protection_mode from v$database;



------------
主、備庫切換
------------
1.
在主庫
alter database commit to switchover to physical standby with session shutdown;
shutdown immediate

2.
在備庫
alter database commit to switchover to primary with session shutdown;
shutdown immediate
startup

3.
在主庫
startup mount

4.
檢查數據庫角色
set line 200
select name, open_mode, protection_mode, protection_level, database_role, switchover_status, force_logging from v$database;



-------------------
failover
非正常切換
-------------------
failover
切換一般是 Primary 數據庫發生故障後的切換,這種情況是 Standby 數據庫發揮其作用的情況。這種切換髮生後,可能會造成數據的丟失。而且這個過程不是可逆的,Data Guard 環境會被破壞。
由於 Primary 數據庫已經無法啓動,所以 Failover 切換所需的條件並不多,只要檢查 standby 是否運行在最大保護模式下,如果是的話,需要將其置爲最大性能模式,否則切換到 primary 角色也無法啓動。

1.
 查看是否有日誌gap,沒有應用的日誌:
    sql> select unique thread#, max(sequence#) over(partition by thread#) last from v$archived_log;
  sql> select thread#, low_sequence#, high_sequence# from v$archive_gap;

  如果有,則拷貝過來並且註冊
    sql> alter database register physical logfile '
路徑';
   
重複查看直到沒有應用的日誌:

2. 
然後停止應用歸檔:
  sql> alter database recover managed standby database cancel;

3.
下面將 standby 數據庫切換爲 priamry 數據庫:
  sql> alter database recover managed standby database finish;
   

    sql> alter database recover managed standby database finish force;

  sql> select database_role from v$database;
  database_role
  ----------------
  physical standby

  sql> alter database commit to switchover to primary;

    sql> alter database open;
或者 shutdown immediate + startup

  檢查數據庫是否已經切換成功:
  sql> select database_role from v$database;
  database_role
  ----------------
  primary

至此,Failover 切換完成。這個時候應該馬上對新的 Primary 數據庫進行備份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章