2016年10月31日 星期一

mysql 縮小 ibdata1 檔案



今天發現一台Server 空間不足, 這台主機主要運行著mysql
查看了一下檔案最大的size 是 ibdata1 , 果然不出所料 
show variables like '%per_table%';  值為 off

意思是說 mysql 中所有的table index 都會存在ibdata1  這個檔案中,
即使你刪除了table 這個ibdata1 也不會縮小

解決方法:

1.exp 資料庫
2.drop database
3.設定 innodb_file_per_table 為ON

my.cnf文件
[mysqld]下增加下面配置
innodb_file_per_table=1  


或者

 set global innodb_file_per_table=1

4.imp 資料庫

通常到這邊資料庫就會縮得比原本還小

意外插曲:
我在匯入資料庫的途中 , 有把 ibdata1 不小心刪除掉
導致他雖然把資料匯進去, 但mysql找不到這些table 的metadata
後來只要重新在匯一次資料進去, 就可以找到table了


不過這台是備庫還需要設定 master/slave 
設完
SET GLOBAL server_id=2;

mysql> change master to
    -> master_host='192.168.100.189',
    -> master_port=3306, 
    -> master_user='rep',
    -> master_password='rep', 
    -> MASTER_LOG_FILE='mysql-bin.000510', 
    -> MASTER_LOG_POS=337935886;

在 start slave 就可以讓她進行同步了

2016年8月4日 星期四

MYSQL Master Slave 正庫備庫架構建置

MYSQK版本
version : mysql-server-5.1.73-3

Master 端

1.修改 my.cnf , 把參數加進去

[root@node02 log]# cat /etc/my.cnf
[mysqld]
server-id=1
log_bin=/vincentyuan/mysql/bin-log
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
binlog-do-db=test
binlog_format=mixed

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@node02 log]#


2.重啟資料庫讓參數生效

service mysqld restart

3. 在Master端建立同步用帳號, 並且授與 REPLICATION SLAVE  權限

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
FLUSH PRIVILEGES;

4.將Master 資料庫鎖定

 FLUSH TABLES WITH READ LOCK;


5.查看一下 Master 狀態
show master status;


記好 Binlog File 及Position 號碼, 等等要給 Slave 知道從哪邊開始同步

6. exp Master 端的資料庫

mysqldump --opt -u root -p test > test.sql

並把檔案傳送到Slave 端


7. 設定Slave my.cnf

[root@node02 log]# cat /etc/my.cnf 
[mysqld]
server-id=2
replicate-do-db=test
report-host=10.1.53.46
log_bin=/vincentyuan/mysql/bin-log
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

*.server-id 設定為2, server-id  在ㄧ套 Master Slave 架構中, server-id 每台DB都不能一樣 


8.重啟資料庫讓參數生效

service mysqld restart

9.把剛剛的備份檔案匯入Salve 端

mysql -u root -proot123 test < test.sql


10.Slave端設定同步設定

CHANGE MASTER TO
 MASTER_HOST='10.1.53.46',
 MASTER_USER='repl',
 MASTER_PASSWORD='repl',
 MASTER_LOG_FILE='bin-log.000007',
 MASTER_LOG_POS=2083;

設定剛剛在Master 的所看到的 File及Position 

11. 啟動 Slave 

start slave;

12.查看Slave狀態

show slave status \G;

看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

都是YES 表示設定成功

13.將Master 端解lock

 unlock tables;

在master 端寫入資料..看Slave 有沒有成功


要是沒有請看... show Slave status \G; 查看有無錯誤訊息 

PS:MYSQL Master、Slave 架構建置好後,Slave 資料是可以被修改的
要是Slave 不想被修改可以在 /etc/my.cnf 加入 read only , 
重啟後除了super user外 其他USER就不能修改資料了


延伸實做
Master、Slave 架構建置好後,Slave 因被修改了PK值導致在同步時找不到PK而同步失敗

已下是Slave status 錯誤訊息

 Last_Errno: 1032
 Last_Error: Could not execute Update_rows event on table test.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log bin-log.000007, end_log_pos 2527

很明顯得跟你說目前同步停在 bin-log.000007, 及Position 號碼為 2527,
意思是說 2527 上一個SQL語句出了錯誤

接下來的同步 Slave 報了錯誤
160805 22:28:17 [Warning] Slave: Can't find record in 'test' Error_code: 1032
160805 22:28:17 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'bin-log.000007' position 2342

上頭是說修復問題後可以從  bin-log.000007' position 2342 重新開始執行同步


這邊也可以看到Slave 是停止同步的

mysql> show slave status \G;
Slave_IO_Running: Yes
Slave_SQL_Running: No

首先先看一下2342 得上一個是執行什麼語法

show binlog events in 'bin-log.000007' from 2083 ;



這邊可以看到他是用ROW 的方式去紀錄 ,(這個資料庫 binlog_format 是 MIXED )
2342 的SQL 語句上一段是2083, 2083的SQL語句是 2273

在使用指令查看 2273的SQL
mysqlbinlog -vv /mysql/bin-log.000007 --base64-output=DECODE-ROWS --start-pos=2273



可以看到2273的最上頭的部分它是一段update 語法, 利用where 條件在去Master , 比對一下欄位資料 並且修改Slave 資料

要是它 where 條件欄位多的話就可以依照資料去回推 Slave 並且修改

修改完後,重新設定一下Slave 端的設定

change master to master_host='10.1.53.46', master_user='repl', 
master_password='repl', 
master_port=3306, 
master_log_file='bin-log.000007', 
master_log_pos=2342;

啟動Slave

start slave 

設定完後, Slave 端就會自己開始在追補以後的資料了

查看/var/log/mysqld.log  

160805 23:05:59 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='10.1.53.46', master_port='3306', master_log_file='bin-log.000007', master_log_pos='3605'. New state master_host='10.1.53.46', master_port='3306', master_log_file='bin-log.000007', master_log_pos='2342'.
160805 23:06:02 [Note] Slave SQL thread initialized, starting replication in log 'bin-log.000007' at position 2342, relay log './mysqld-relay-bin.000001' position: 4
160805 23:06:12 [Note] Slave I/O thread: connected to master 'repl@10.1.53.46:3306',replication started in log 'bin-log.000007' at position 2342

沒有在看到錯誤了!!!!




2016年6月7日 星期二

從 Data guard 還原到 RAC+ASM


在一般的環境RAC + data guard當中, 有時候PRIMARY 都會非常的busy , 會沒有Resource 去備份 DB

這時候就會考慮在 Standby DB 進行備份, 那在備庫備份的檔案可以還原到RAC?

以下是進行還原演練的測試 



1.Standby 備份


backup full database format '/ora/BACKUP/full_%t.dmp';







在list backup 指令裡頭可以看到每一個datafile的路徑


2.Standby端備份傳送到PRIMARY端

 scp full_914022* node01:/ora/BACKUP/

3.catalog start with (11g 開始才有的指令)

rman target /

catalog start with '/ora/BACKUP/';


list backup ; 
查看一下 backupset 內容




使用catalog start with 把 backupset 餵進去後, Oracle會自己轉換目前使用路徑

4.進行還原

RMAN> restore database;



還原成功!!!

2016年6月1日 星期三

Oracle 11g - 安裝 Golden Gate



 Golden Gate 運作如下


Extract:負責撈來源端(Source)執行過的SQL然後打包成Trail檔案
Data pump:負責把Source的 Trail 內的資料,傳送到Target的Trail內
Trail:負責儲存SQL資料, 預設路徑是放在 $ogg_home/dirdat 下
Replicat:讀取來源端 Trail 的SQL資料 ,然後在Target端的資料庫執行SQL



1.環境說明:

Source: Red Hat Enterprise Linux Server release 5.8,  Oracle 11.2.0.1.0 (single)
Target: Red Hat Enterprise Linux Server release 6.4 ,  Oracle 11.2.0.1.0 (single)

Golden gate 官方下載點:
http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html


source 端會安裝在 /u02/ogg_sou
target 端會安裝在 /u02/ogg_tar


[orcl11g@sou ~]$ mkdir -p /u02/ogg_sou
[oracle@tar ~]$  mkdir -p /u02/ogg_tar


再 .bash_profile 設置 ORACLE_SID、ORACLE_HOME和LD_LIBRARY_PATH;

export ORACLE_BASE=/ora/app/11;
export ORACLE_HOME=$ORACLE_BASE/db;
export ORACLE_SID=orcl;
export ORACLE_TERM=xterm;
export PATH=/usr/sbin:$PATH;
export PATH=$ORACLE_HOME/bin:$PATH;
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;


2.在Source端 安裝 GoldenGate


將下載下來的檔案解壓縮
unzip fbo_ggs_Linux_x64_shiphome

安裝 ogg
cd fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller







在Target端也是按照上述步驟, 只是要稍微注意下目錄的設定就好
安裝完後進入解壓縮資料夾, 查看狀態

[orcl11g@sou ogg_sou]$ ./ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Dec 12 2015 00:54:38
Operating system character set identified as UTF-8.

Copyright (C) 1995, 2015, Oracle and/or its affiliates. All rights reserved.

GGSCI (sou) 1> info mgr

Manager is running (IP port oracle9i.7809, Process ID 3592).

GGSCI (sou) 2> 


這個版本在安裝的時候已經把相關資料夾給一併建立, 要是沒有可以手動下指令建立

 ./ggsci
create subdirs


2.Oracle user 、權限及相關設定

2.1 在Source端建立ogg_temp tablespace 

CREATE TABLESPACE OGG_TBS01 DATAFILE 
  '/u01/11g/oradata/orcl11g/ogg_temp01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;

2.2 在兩邊資料庫建立ogg user

create user ogg identified by ogg default tablespace ogg_tbs01 quota unlimited on ogg_tbs01

2.3 在兩邊資料庫建立ogg role
create role ogg_role;

2.4 在兩邊資料庫分配權限

grant 
CREATE SESSION,
ALTER SESSION,
ALTER SYSTEM,
RESOURCE,
SELECT ANY DICTIONARY,
FLASHBACK ANY TABLE,
SELECT ANY TABLE,
SELECT ANY TRANSACTION,
insert any table,
update any table,
drop any table,
CREATE TABLE
to ogg_role;

grant SELECT on dba_clusters to ogg_role;
grant SELECT on V_$DATABASE to ogg_role;
grant select on sys.logmnr_buildlog to ogg_role;
grant EXECUTE on DBMS_FLASHBACK to ogg_role;
grant execute on DBMS_CAPTURE_ADM to ogg_role;
grant execute on DBMS_STREAMS to ogg_role;  
grant EXECUTE_CATALOG_ROLE to ogg_role;
grant execute on DBMS_CAPTURE_ADM to ogg_role;

最後將role 權限給予ogg user , 並在兩端資料庫下授權指令 

grant ogg_role to ogg;

3. 在來源端開啟 archive log 、supplemental log 及 FORCE LOGGING模式

alter database archivelog;
alter database add supplemental log data;
ALTER DATABASE FORCE LOGGING;

查詢狀態, 兩項皆須YES

SELECT supplemental_log_data_min, force_logging FROM v$database;

3.1 在資料庫裡執行ogg_home內的SQL

@marker_setup.sql  
@ddl_setup.sql  
@role_setup.sql  
@ddl_enable.sql  
@ddl_pin ogg_sou

4.設定 Golden Gate
進入 ogg_home, 執行 ./ggsci

4.1 啟動 Golden Gate 管理程式

GGSCI (oracle9i) 5> start mgr  
Manager started.

GGSCI (oracle9i) 6> info mgr

Manager is running (IP port oracle9i.7809, Process ID 5739).


GGSCI (oracle9i) 7> 


4.2在來源端建立Extract
在這邊會建立兩個 Extract , 一個是一般的extract 一個是data pump的extract

使用ogg帳號登入ggsci

GGSCI (oracle9i) 7> dblogin userid ogg,password ogg
Successfully logged into database.



4.2.1 建立第一個extract 
add extract ext1, tranlog,begin now
edit params ext1 

(使用vi編輯,也可以直接編輯$ogg_home/dirprm/mgr.prm, 相關設定檔都放在 $ogg_home/dirprm 底下)

加入以下內容

EXTRACT ext1
SETENV(ORACLE_SID="orcl11g")
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg, password ogg
EXTTRAIL /u02/ogg_sou/dirdat/et
DDL INCLUDE ALL
TABLE vincentyuan.*;


userid:填入ogg的帳號密碼
setenv:可以在這邊設定環境變數
table:設定指定同步的table,指定多個table,可以使用*符號

設定完後, 啟動process


GGSCI (oracle9i as ogg_sou@orcl11g) 11> start ext1

Sending START request to MANAGER ...
EXTRACT EXT1 starting


GGSCI (oracle9i as ogg_sou@orcl11g) 12> 

GGSCI (oracle9i as ogg_sou@orcl11g) 12> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
EXTRACT     RUNNING     EXT1        00:00:00      00:00:00    



GGSCI (oracle9i as ogg_sou@orcl11g) 13> 


要是status 不在 running ,可以下 view report EXT1 , 查看log

4.2.2 為第一個 extract 配置 trail

GGSCI (oracle9i as ogg_sou@orcl11g) 13>add exttrail /u02/ogg_sou/dirdat/et,extract ext1


exttrail added.


4.2.3 建立第二個 extract (data dump)

設定 pump config

edit params pump_so

填入以下設定

extract pump_so
dynamicresolution
passthru
rmthost 10.1.53.100,mgrport 7809,compress
rmttrail /u02/ogg_trg/dirdat/pt   
DDL INCLUDE ALL

table vincentyuan.*;



*rmthost :為目的端的IP及Port
*rmttrail :為目的端的接收資料檔的位置

配置 data pump process
add extract pump_so,exttrailsource /u02/ogg_sou/dirdat/et


為data pump增加遠端trail文件

add rmttrail /u02/ogg_trg/dirdat/pt,extract pump_so

ADD EXTTRAIL /ORA/software/ogg_source/software/dirdat/pt, EXTRACT PUMP_SO

*. 他會產生開頭 pt 加上 9個數字的檔案 , 這個檔案會傳到target端 /u02/ogg_trg/dirdat 這邊設定的是要丟到Target 哪一個目錄

設定完後啟動Process

GGSCI (oracle9i as ogg_sou@orcl11g) 14> start pump_so

Sending START request to MANAGER ...
EXTRACT PUMP_SO starting

GGSCI (oracle9i as ogg_sou@orcl11g) 16> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
EXTRACT     RUNNING     EXT1        00:00:00      00:00:05    
EXTRACT     RUNNING     PUMP_SO     00:00:00      00:17:52    



GGSCI (oracle9i as ogg_sou@orcl11g) 17> 


4.3 在目的端建立 Replicat

4.3.1 先在目的端配置 checkpoing table 


[oracle@datagu ogg_trg]$ ./ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Dec 12 2015 00:54:38
Operating system character set identified as UTF-8.

Copyright (C) 1995, 2015, Oracle and/or its affiliates. All rights reserved.

GGSCI (datagu) 1> dblogin userid ogg,password ogg
Successfully logged into database.

GGSCI (datagu as ogg_tar@orclogg) 2> add checkpointtable ogg_trg.ogg_chk


 Successfully created checkpoint table ogg_trg.ogg_chk

將 checkpoint table 設定在 golden gate 裡頭

edit params ./GLOBALS

GGSCHEMA OGG_TRG
CHECKPOINTTABLE OGG_TRG.OGG_CHK



4.3.2 配置 Peplicat

新增Peplicat
add replicat rep01,exttrail /u02/ogg_trg/dirdat/pt,checkpointtable OGG_TAR.OGG_CHK

*.這邊設定要從哪裡讀取從target丟過來的檔案

設定參數
edit params rep01

將以下內容加入

replicat repl
setenv (ORACLE_SID=orclogg)
userid ogg,password ogg
assumetargetdefs
reperror default,discard
discardfile /u02/ogg_trg/dirdat/repl.dsc,append,megabytes 50
dynamicresolution
DDL INCLUDE ALL
DDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 3 RETRYDELAY 5
map vincentyuan.*, target vincentyuan.*;

*DDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 3 RETRYDELAY 5
是只說 DDL要是同步出現錯誤時, 會以每五秒Retry一次,會try 3次, 要是仍報錯,則被略過


啟動 Peplicat
GGSCI (datagu as ogg_tar@orclogg) 9> start rep01

Sending START request to MANAGER ...
REPLICAT REP01 starting


GGSCI (datagu as ogg_tar@orclogg) 10> 

GGSCI (datagu as ogg_tar@orclogg) 10> 

GGSCI (datagu as ogg_tar@orclogg) 10> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
REPLICAT    RUNNING     REP01       00:00:00      00:00:04    


GGSCI (datagu as ogg_tar@orclogg) 11> 


5.測試DDL
在來源端create table 後, 在去目的端就可以看到資料庫新增的table

要是同步失敗, 可以再次確認路徑是否正確
我在安裝過程中, 較常遇到的是路徑及名稱問題, 確定完後就可解決



備註:  在ggsci 指令 :  info name detail  可以查看Process更詳細的內容

2016年5月31日 星期二

Oracle 11g - 建立RAC + DataGuard

Data Guard 運作圖




環境說明 

一組RAC+ASM 搭配 DataGuard (single instance)


Oracle Database :11.2.0.4


PRIMARY RAC1 IP : 10.1.53.46

PRIMARY RAC2 IP : 10.1.53.47
STANDBY  IP : 10.1.53.100

PRIMARY及Standby SID皆使用 orcl



1.設定PRIMARY及Standby Tnsnames.ora 連線資訊, RAC及Standby都設一樣


ORCL2 =

  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.53.146)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl2)
      (INSTANCE_NAME = orcl2)
    )
  )

ORCL1 =

  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.53.147)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl1)
      (INSTANCE_NAME = orcl1)
    )
  )

ORCL_ST =

  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.1.53.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = orcl)
    )
  )

2. 設定 Standby listener.ora, 加入以下設定

SID_LIST_LISTENER =

(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /ora/app/11/db)
)
)

在Standby db設定靜態註冊,如果没有該參數,待會的Standby db 在nomount 時PRIMARY會連不到 standby,
或者也有可能會報PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514.錯誤


3. 把PRIMARY 設為 force狀態 

alter database force logging;

4.PRIMARY必須為 ARCHIVE Log mode


SQL> archive log list;

Database log mode        Archive Mode
Automatic archival        Enabled
Archive destination        /ora/app/11/ARCH
Oldest online log sequence     70
Next log sequence to archive   0
Current log sequence        70


SQL> 




5.PRIMARY DB中 添加3組 Standby Rode log file,thread 1,2 個三組
Alter database add standby logfile thread 1 group 5  size 50m;
Alter database add standby logfile thread 1 group 6  size 50m;
Alter database add standby logfile thread 1 group 7  size 50m;
Alter database add standby logfile thread 2 group 8  size 50m;
Alter database add standby logfile thread 2 group 9  size 50m;
Alter database add standby logfile thread 2 group 10  size 50m;

-- 
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 21 ('+DATA_IDX05/lg/onlinelog/st_redo_01_01.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 22 ('+DATA_IDX05/lg/onlinelog/st_redo_01_02.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 23 ('+DATA_IDX05/lg/onlinelog/st_redo_01_03.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 24 ('+DATA_IDX05/lg/onlinelog/st_redo_01_04.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 25 ('+DATA_IDX05/lg/onlinelog/st_redo_01_05.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 26 ('+DATA_IDX05/lg/onlinelog/st_redo_01_06.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 27 ('+DATA_IDX05/lg/onlinelog/st_redo_01_07.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 28 ('+DATA_IDX05/lg/onlinelog/st_redo_01_08.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 29 ('+DATA_IDX05/lg/onlinelog/st_redo_01_09.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 30 ('+DATA_IDX05/lg/onlinelog/st_redo_01_10.redo') size 2000M;
ALTER DATABASE ADD STANDBY LOGFILE  thread 1 GROUP 31 ('+DATA_IDX05/lg/onlinelog/st_redo_01_11.redo') size 2000M;



6.產生password file


RAC1:orapwd file=$ORACLE_HOME/dbs/orapworcl1  password=oracle  entries=10 ignorecase=Y


RAC2:orapwd file=$ORACLE_HOME/dbs/orapworcl2  password=oracle  entries=10 ignorecase=Y


Standby:orapwd file=$ORACLE_HOME/dbs/orapworcl  password=oracle  entries=10 ignorecase=Y


7.在PRIMARY DB 創一個 standby controlfile 

alter database create standby controlfile as '/ora/BACKUP/control01.ctl';


把檔案傳送至 Standby 端

scp /ora/BACKUP/control01.ctl datagu:/ora/app/11/oradata/control01.ctl
scp /ora/BACKUP/control01.ctl datagu:/ora/app/11/oradata/control02.ctl


8.修改 PRIMARY 及 STANDBY 的Spfile.ora


PRIMARY 設定如下


*.audit_file_dest='/ora/base/db/admin/orcl/adump'

*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.0.0'
*.control_files='+DATA01/orcl/controlfile/current.260.912971595'
*.db_block_size=8192
*.db_create_file_dest='+DATA01'
*.db_domain=''
*.db_name='orcl'
*.diagnostic_dest='/ora/base/db'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
orcl1.instance_number=1
orcl2.instance_number=2
*.memory_target=786432000
*.open_cursors=300
*.processes=150
*.remote_listener='scan:1521'
*.remote_login_passwordfile='exclusive'
orcl2.thread=2
orcl1.thread=1
orcl1.undo_tablespace='UNDOTBS1'
orcl2.undo_tablespace='UNDOTBS2'

*.DB_UNIQUE_NAME='orcl2'

*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='DEFER'
orcl1.log_archive_dest_1='location=+DATA01/ORCL/ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl1'
orcl2.log_archive_dest_1='location=+DATA01/ORCL/ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl2'
*.log_archive_dest_2='service=orcl_st LGWR ASYNC NOAFFIRM VALID_FOR=(online_logfiles,primary_role) db_unique_name=orcl_st'

*.log_archive_config='dg_config=(orcl,orcl_st)'

*.db_file_name_convert='/ora/app/11/oradata','+DATA01/ORCL/datafile','ora/app/11/oradata/tempfile','+DATA01/ORCL/tempfile'
*.log_file_name_convert='/ora/app/11/oradata', '+DATA01/orcl/onlinelog/'
*.standby_file_management=auto
*.standby_archive_dest='+DATA01/ORCL/ARCH'
*.fal_server='orcl_st'
orcl1.fal_client='orcl1'

orcl2.fal_client='orcl2'


STANDBY 設定如下

*.audit_file_dest='/ora/app/11/admin/orcl/adump'
*.background_dump_dest='/ora/app/11/admin/orcl/bdump'
*.core_dump_dest='/ora/app/11/admin/orclcdump'
*.user_dump_dest='/ora/app/11/admin/orcl/udump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/ora/app/11/oradata/control01.ctl','/ora/app/11/oradata/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_unique_name='orcl_st'
*.diagnostic_dest='/ora/app/11/db'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_dest_state_2='ENABLE'
*.memory_target=386432000
*.open_cursors=300
*.processes=150
*.job_queue_processes=10

*.db_unique_name=orcl_st

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE 
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE 
*.log_archive_config='dg_config=(orcl1,orcl_st)'
*.remote_login_passwordfile='exclusive'
*.log_archive_dest_1='LOCATION=/ora/app/11/ARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_st'
*.log_archive_dest_2='SERVICE=orcl1 LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl1'
*.db_file_name_convert='+DATA01/ORCL/datafile','/ora/app/11/oradata','+DATA01/ORCL/tempfile','/ora/app/11/oradata/tempfile'
*.log_file_name_convert='+DATA01/ORCL/onlinelog','/ora/app/11/oradata'
*.standby_file_management=auto
*.standby_archive_dest='/ora/app/11/ARCH'
*.fal_server='orcl1'
*.fal_client='orcl_st'


因為PRIMARY 使用ASM ,所以參數上要設定 db_file_name_convert,log_file_name_convert 讓 Standby 的datafile路徑做轉換



9.backup PRIMARY DB

RUN {
allocate channel c1 type disk;
allocate channel c2 type disk;
sql 'alter system archive log current';
backup current controlfile for standby format='/ora/BACKUP/control_%U';
BACKUP FORMAT '/ora/BACKUP/orcl_%U_%T' skip inaccessible filesperset 5 DATABASE ;
sql 'alter system archive log current';
BACKUP FORMAT '/ora/BACKUP/arch_%U_%T' skip inaccessible filesperset 5 ARCHIVELOG ALL ;
release channel c2;
release channel c1;
}

10.將備份檔案傳至Standby 

scp * datagu:/ora/BACKUP

11.standby 使用剛剛修改好的pfile.ora開至 nomount 狀態 ,listener 也一併開啟

SQL> startup nomount pfile='/ora/BACKUP/pfile.ora';

ORACLE instance started.


Total System Global Area  388317184 bytes

Fixed Size    2213656 bytes
Variable Size  306186472 bytes
Database Buffers   71303168 bytes
Redo Buffers    8613888 bytes

SQL> 


[oracle@datagu ~]$ lsnrctl start


LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-JUN-2016 18:05:20


Copyright (c) 1991, 2009, Oracle.  All rights reserved.


Starting /ora/app/11/db/bin/tnslsnr: please wait...


TNSLSNR for Linux: Version 11.2.0.1.0 - Production

System parameter file is /ora/app/11/db/network/admin/listener.ora
Log messages written to /ora/app/11/diag/tnslsnr/datagu/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=datagu)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=datagu)(PORT=1521)))

STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                03-JUN-2016 18:05:20
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /ora/app/11/db/network/admin/listener.ora
Listener Log File         /ora/app/11/diag/tnslsnr/datagu/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=datagu)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@datagu ~]$ 


12.在 PRIMARY端登入standby 端 rman 來還原資料庫


[root@node01 ~]# rman target / auxiliary sys/oracle@orcl_st



RMAN> duplicate target database for standby;


如果在RMAN恢復時不指定 nofilenamecheck 參數

則在數據文件相同文件名恢復時會出現RMAN-05501錯誤
duplicate target database for standby nofilenamecheck;



13.PRIMARY 將使用修改完後的pfile.ora 重啟



14.查看 PRIMARY ARchive log 傳送狀態


SQL> Select dest_name,status,error from v$archive_dest;


DEST_NAME       STATUS ERROR
------------------------------ --------- --------------
LOG_ARCHIVE_DEST_1       VALID
LOG_ARCHIVE_DEST_2       VALID
LOG_ARCHIVE_DEST_3       INACTIVE
LOG_ARCHIVE_DEST_4       INACTIVE
LOG_ARCHIVE_DEST_5       INACTIVE
LOG_ARCHIVE_DEST_6       INACTIVE
LOG_ARCHIVE_DEST_7       INACTIVE
LOG_ARCHIVE_DEST_8       INACTIVE
LOG_ARCHIVE_DEST_9       INACTIVE
LOG_ARCHIVE_DEST_10       INACTIVE
LOG_ARCHIVE_DEST_11       INACTIVE

DEST_NAME       STATUS ERROR
------------------------------ --------- -------------
LOG_ARCHIVE_DEST_12       INACTIVE
LOG_ARCHIVE_DEST_13       INACTIVE
LOG_ARCHIVE_DEST_14       INACTIVE
LOG_ARCHIVE_DEST_15       INACTIVE
LOG_ARCHIVE_DEST_16       INACTIVE
LOG_ARCHIVE_DEST_17       INACTIVE
LOG_ARCHIVE_DEST_18       INACTIVE
LOG_ARCHIVE_DEST_19       INACTIVE
LOG_ARCHIVE_DEST_20       INACTIVE
LOG_ARCHIVE_DEST_21       INACTIVE
LOG_ARCHIVE_DEST_22       INACTIVE

DEST_NAME       STATUS ERROR
------------------------------ --------- --------------
LOG_ARCHIVE_DEST_23       INACTIVE
LOG_ARCHIVE_DEST_24       INACTIVE
LOG_ARCHIVE_DEST_25       INACTIVE





看是否為:VALID, 假如跳出 ORA-16191: Primary log shipping client not logged on standby

請查看 

1.remote_login_passwordfile 是否設為 SHARED or EXCLUSIVE 

2.password files PRIMARY 及 STANDBY 都要一樣



15.驗證Archive log 是否自動傳送到 STANDBY



在RAC 1切換 log



SQL> alter system switch logfile;

System altered.

SQL> 
SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       +DATA01/orcl/arch
Oldest online log sequence     56
Next log sequence to archive   57
Current log sequence       57
SQL> 


在RAC 2切換 log

SQL> alter system switch logfile;

System altered.

SQL> 
SQL> archive log list;
Database log mode        Archive Mode
Automatic archival        Enabled
Archive destination        +DATA01/orcl/arch
Oldest online log sequence     69
Next log sequence to archive   70
Current log sequence        70
SQL>



STANDBY 查詢
select thread#,max(sequence#) max from v$archived_log group by thread#;SQL> 

   THREAD#  MAX
-------- ----------
1           69
2           56

SQL> 

SQL> select recid, SEQUENCE# ,APPLIED from v$archived_log ;

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
1   52 YES
2   41 YES
3   40 YES
4   53 YES
5   43 YES
6   54 YES
7   53 YES
8   55 YES
9   42 YES
10   56 YES
11   44 YES

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
12   57 YES
13   58 YES
14   59 YES
15   45 YES
16   46 YES
17   47 YES
18   60 YES
19   61 YES
20   62 YES
21   48 YES
22   63 YES

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
23   64 YES
24   65 YES
25   49 YES
26   50 YES
27   51 YES
28   66 YES
29   53 YES
30   69 YES
31   52 YES
32   68 YES
33   67 YES

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
34   54 YES
35   55 NO
36   56 NO

36 rows selected.

成功




相關LOG查詢

select thread#,max(sequence#) max from v$archived_log group by thread#;
select recid, SEQUENCE# ,APPLIED from v$archived_log ;
Select dest_name,status,error from v$archive_dest;
select process,status,client_process,thread#,sequence# from v$managed_standby;
select * FROM V$ARCHIVE_GAP;
select group#,thread#,sequence#,archived,status from v$standby_log;

查詢錯誤
select * from v$dataguard_status order by timestamp desc 


RAC + Data guard Switchover 



1.先查一下雙方的資料庫狀態

SQL> select inst_id,database_role,OPEN_MODE from  gv$database;

   INST_ID DATABASE_ROLE       OPEN_MODE
---------- ---------------- --------------------
1 PRIMARY        READ WRITE

SQL> 


SQL> select inst_id,database_role,OPEN_MODE from  gv$database;

   INST_ID DATABASE_ROLE          OPEN_MODE
---------- ----------------   --------------------
1 PHYSICAL STANDBY        MOUNTED

SQL> 


2.查看 PRIMARY 的Switchover status 

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO STANDBY


SQL> 

TO STANDBY 表示 PRIMARY 可以進行 switch, 要是 sessions active 表示目前還有session 在進行讀取, 則必須等session結束


3.因為PRIMARY 是RAC, 留一個node就好,其他就先關閉

srvctl stop instance -d orcl -i orcl2
srvctl status database -d orcl Instance orcl1 is running on node node01 Instance orcl2 is not running on node node02


4.PRIMARY 切換成 STANDBY

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN; Database altered.


這時候查看alert.log, 就可以看到在切換時, PRIMARY 會把目前在的redo log 丟過去 STANDBY 做 APPLIED

PRIMARY :
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY  [Process Id: 11043] (orcl1)
Sat Jun 04 22:02:17 2016
Thread 1 advanced to log sequence 127 (LGWR switch)
  Current log# 1 seq# 127 mem# 0: +DATA01/orcl/onlinelog/group_1.261.912971607

STANDBY :
Media Recovery Log /ora/app/11/ARCH/1_126_912971607.dbf
Media Recovery Waiting for thread 1 sequence 127
Sat Jun 04 22:02:34 2016
RFS[6]: Assigned to RFS process 31438
RFS[6]: Identified database type as 'physical standby': Client is ARCH pid 11069
Sat Jun 04 22:02:55 2016
RFS[7]: Assigned to RFS process 31441
RFS[7]: Identified database type as 'physical standby': Client is Foreground pid 11043
RFS[7]: Selected log 5 for thread 1 sequence 127 dbid 1440752330 branch 912971607
Sat Jun 04 22:02:55 2016
Archived Log entry 133 added for thread 1 sequence 127 ID 0x55ea51f1 dest 1:
Sat Jun 04 22:02:56 2016
RFS[8]: Assigned to RFS process 31443
RFS[8]: Identified database type as 'physical standby': Client is ARCH pid 11069
Sat Jun 04 22:03:05 2016
Media Recovery Log /ora/app/11/ARCH/1_127_912971607.dbf
Media Recovery Waiting for thread 1 sequence 128


5.STANDBY 切換成 PRIMARY 

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN; Database altered.


這邊的alert.log 則可以看到, standby redo log 被初始化

Sat Jun 04 22:10:37 2016
 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
ALTER DATABASE SWITCHOVER TO PRIMARY (orcl)
Maximum wait for role transition is 15 minutes.
Backup controlfile written to trace file /ora/app/11/db/diag/rdbms/orcl_st/orcl/trace/orcl_ora_29933.trc
SwitchOver after complete recovery through change 1414599
Online log /ora/app/11/oradata/group_1.261.912971607: Thread 1 Group 1 was previously cleared
Online log /ora/app/11/oradata/group_2.262.912971615: Thread 1 Group 2 was previously cleared
Online log /ora/app/11/oradata/group_3.265.912972281: Thread 2 Group 3 was previously cleared
Online log /ora/app/11/oradata/group_4.266.912972289: Thread 2 Group 4 was previously cleared
Standby became primary SCN: 1414597
Switchover: Complete - Database mounted as primary
Completed:  ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
Sat Jun 04 22:10:37 2016
ARC3: Becoming the 'no SRL' ARCH


6.STANDBY 切換成 PRIMARY 後就可以直接OPEN

SQL> alter database open;

Database altered.

SQL>

7.PRIMARY 切換成 STANDBY 後執行 Active Data Guard (Active Data Guard 11g 新功能, 可以允許standby資料庫用read only 開啟到open,好讓standby 可以查詢資料或產出報表)


SQL> startup nomount ;
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size    2217464 bytes
Variable Size  574622216 bytes
Database Buffers  201326592 bytes
Redo Buffers    6832128 bytes
SQL> 
SQL> 
SQL> 
SQL> 
SQL> alter database mount standby database;

Database altered.

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

Database altered.

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE cancel;

Database altered.

SQL> alter database open read only;

Database altered.

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;


Database altered.

SQL>
SQL> 


8.驗證功能

PRIMARY 切換 Redo log

SQL> alter system switch logfile;

System altered.

SQL> 
SQL> select recid, SEQUENCE# ,APPLIED from v$archived_log ;

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
       133  127 YES
       134  128 YES
       135  129 NO
       136  130 NO
       137  131 NO
       138  131 YES
       139  129 YES
       140  130 YES
       141  132 NO
       142  132 YES


Standby
select recid, SEQUENCE# ,APPLIED from v$archived_log ;

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
       300  127 YES
       301  127 NO
       302  128 YES

     RECID  SEQUENCE# APPLIED
---------- ---------- ---------
       303  128 NO
       304  131 YES
       305  129 YES
       306  130 YES
       307  132 YES