用 rman duplicate 進行創建 Standby 庫
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 到 DG,RAC 的每個節點都可以看成是一個 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 數據庫進行備份。