Xây dựng Oracle Data Guard 19c
11 min read
0
Featured image

Oracle Data Guard đảm bảo tính sẵn có cao (high availability), bảo vệ dữ liệu và phục hồi dữ liệu cho doanh nghiệp.

Oracle Data Guard giúp tạo, duy trì, quản lý và giám sát một hoặc nhiều cơ sở dữ liệu dự phòng để cho phép cơ sở dữ liệu Oracle chính (primary database) có thể khôi phục dữ liệu khi các trường hợp rủi ro xảy ra. Nếu cơ sở dữ liệu chính không khả dụng, ngừng hoạt động ngoài kế hoạch, Oracle Data Guard có thể chuyển bất kỳ cơ sở dữ liệu dự phòng (standby database) thành cơ sở dữ liệu chính, giảm thiểu downtime. Ngoài ra, Oracle Data Guard sử dụng kỹ thuật backup, restoration, và cluster để cung cấp mức độ bảo vệ dữ liệu cao và tính sẵn có của dữ liệu.

Chuẩn bị cài đặt

Một cấu hình Oracle Data Guard có thể bao gồm một primary database và tối đa 30 standby database.

Trong hướng dẫn này ta sẽ sử dụng 1 physical primary database và 1 physical standby database (dựng từ primary database) cùng phiên bản nằm trên 2 server khác nhau được dựng trên vmware

Primary database


#hostname
oradbpr
#enviroment variables
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ORACLE_UNQNAME=orapr
ORACLE_BASE=/u01/app/oracle
ORACLE_SID=ORAPR
#/etc/hosts file
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.254.131 oradbpr #primary
192.168.254.133 oradbsc #standby

Standby database


#hostname
oradbsc
#enviroment variables
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ORACLE_UNQNAME=orasc
ORACLE_BASE=/u01/app/oracle
ORACLE_SID=ORASC
#/etc/hosts file
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.254.131 oradbpr
192.168.254.133 oradbsc

Tiến hành cài đặt

Cấu hình primary database

Kích hoạt mode phù hợp cho Data Guard

Logging mode mặc định của 1 database không phù hợp với cấu hình Data Guard, mode này cho phép các hành động load dữ liệu nhất định không ghi lại log (nolog). mode này không phù hợp với standby database vì nó dẫn đến việc dữ liệu đã được load bị thiếu ở standby, dẫn đến việc cần can thiệp thủ công để khắc phục. Ngoài Logging mode mặc định, có 3 mode khác phù hợp cho một primary database.

FORCE LOGGING mode ngăn không cho bất kỳ hành vi load dữ liệu nào được thực thi mà không ghi lại log. Điều này có thể làm chậm quá trình load vì dữ liệu đã được load phải được copy vào redo logs. Để kích hoạt FORCE LOGGING mode sử dụng câu lệnh:


ALTER DATABASE FORCE LOGGING;

STANDBY NOLOGGING FOR DATA AVAILABILITY làm các hành vi load và gửi các dữ liệu đã được load đến từng standby thông qua chính kết nối giữa primary và standby. Commit sẽ bị trì hoãn cho đến khi tất cả các standby đã apply dữ liệu. Kích hoạt mode bằng câu lệnh:


ALTER DATABASE SET STANDBY NOLOGGING FOR DATA AVAILABILITY;

STANDBY NOLOGGING FOR LOAD PERFORMANCE cũng giống với STANDBY NOLOGGING FOR DATA AVAILABILITY mode ngoại trừ việc các tiến trình đang load có thể ngừng gửi dữ liệu đến các standby nếu network không thể theo kịp tốc độ dữ liệu được load vào primary. trong mode này các standby có thể bị thiếu dữ liệu, nhưng mỗi standby sẽ tự động fetch dữ liệu từ primary. Để kích hoạt mode thực hiện câu lệnh:


ALTER DATABASE SET STANDBY NOLOGGING FOR LOAD PERFORMANCE;

Trong hướng dẫn này ta sẽ sử dụng STANDBY NOLOGGING FOR DATA AVAILABILITY mode

Thực hiện trên primary database

Kích hoạt Archiving

Nếu archiving không được kích hoạt thì ta phải bật ARCHIVELOG mode trên primary database để kích hoạt archiving tự động Sử dụng các câu lệnh


SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

Đặt các tham số khởi tạo


ALTER SYSTEM SET DB_UNIQUE_NAME=ORAPR SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORAPR,ORASC)' SCOPE=SPFILE;
ALTER SYSTEM SET CONTROL_FILES='/data/ORAPR/control01.ctl', '/fra/ORAPR/control02.ctl' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME="ORAPR"' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE="ORASC" LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME="ORASC"' SCOPE=both;
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE='EXCLUSIVE' SCOPE=SPFILE;
ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=both;

  • Nếu sử dụng DGMGRL broker để quản lý, set tham số DG_BROKER_START ở cả primary và standby
  • Nếu quản lý bằng DGMGRL broker set LOG_ARCHIVE_DEST_2 phía standby sau khi enable configuration

Đặt các tham số khởi tạo dành cho standby role trên primary database. Các tham số này chỉ có hiệu lực khi primary database chuyển sang standby role


ALTER SYSTEM SET FAL_SERVER=ORASC SCOPE=SPFILE;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/ORASC/','/ORAPR/' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/ORASC/','/ORAPR/' SCOPE=SPFILE;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=SPFILE;

Cấu hình nhận redo data

Cấu hình primary database để nhận redo data, nếu lần đầu tiên thêm 1 standby database vào cấu hình. Sau đó, cơ sở dữ liệu chính có thể nhanh chóng chuyển sang standby role và bắt đầu nhận redo data, nếu cần. Để tạo standby redo log, hãy sử dụng câu lệnh ALTER DATABASE ADD STANDBY LOGFILE. Ví dụ:


ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 4 ('/data/ORAPR/standby_redo01.log') SIZE 500M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 ('/data/ORAPR/standby_redo02.log') SIZE 500M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 6 ('/data/ORAPR/standby_redo03.log') SIZE 500M;

Check redo log file exist


SELECT GROUP#, TYPE, MEMBER from v$logfile;

Check redo wastage


SELECT name, value FROM v$sysstat WHERE name = 'redo wastage';

Chỉnh sửa listener.oratnsnames.ora

Thực hiện trên cả primary và standby

Chỉnh sửa 2 file $ORACLE_HOME/network/admin/listener.ora$ORACLE_HOME/network/admin/tnsnames.ora

listener.ora
tnsnames.ora

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradbpr)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORAPR)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(SID_NAME = ORAPR)
)
)
#Phía standby
#LISTENER =
# (DESCRIPTION_LIST =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCP)(HOST = oradbsc)(PORT = 1521))
# (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
# )
# )
#SID_LIST_LISTENER =
# (SID_LIST =
# (SID_DESC =
# (GLOBAL_DBNAME = ORASC)
# (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
# (SID_NAME = ORASC)
# )
# )

Cấu hình và khởi tạo standby database

Tạo standby control file trên primary


ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/backup/orasc.ctl';

Tạo PFILE từ SPFILE trên primary


CREATE PFILE='/data/ORAPR/initORAPR.ora' FROM SPFILE;

Thực hiện các thao tác sau phía standby sau khi đã cài Oracle Database software


mkdir -p /data/ORASC
mkdir -p /fra/ORASC
mkdir -p /u01/app/oracle/admin/ORASC/adump
mkdir -p /backup/rman/data

Copy các file sau từ primary sang standby


scp $ORACLE_HOME/dbs/orapwORAPR oracle@oradbsc:$ORACLE_HOME/dbs/orapwORASC
scp /data/ORAPR/initORAPR.ora oracle@oradbsc:$ORACLE_HOME/dbs/initORASC.ora
scp /backup/orasc.ctl oracle@oradbsc:/data/ORASC/control01.ctl

Thực hiện sau khi copy, trên standby


cp /data/ORASC/control01.ctl /fra/ORASC/control02.ctl

Chỉnh sửa file $ORACLE_HOME/dbs/initORASC.ora

initORAPR.ora
initORASC.ora

ORAPR.__data_transfer_cache_size=0
ORAPR.__db_cache_size=1459617792
ORAPR.__inmemory_ext_roarea=0
ORAPR.__inmemory_ext_rwarea=0
ORAPR.__java_pool_size=0
ORAPR.__large_pool_size=16777216
ORAPR.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
ORAPR.__pga_aggregate_target=687865856
ORAPR.__sga_target=2046820352
ORAPR.__shared_io_pool_size=100663296
ORAPR.__shared_pool_size=452984832
ORAPR.__streams_pool_size=0
ORAPR.__unified_pga_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/ORAPR/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/data/ORAPR/control01.ctl','/fra/ORAPR/control02.ctl'
*.db_block_size=8192
*.db_file_name_convert='/ORASC/','/ORAPR/'
*.db_name='ORAPR'
*.db_recovery_file_dest='/fra'
*.db_recovery_file_dest_size=8256m
*.db_unique_name='ORAPR'
*.dg_broker_start=TRUE
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORAPRXDB)'
*.fal_server='ORASC'
*.local_listener='LISTENER_ORASC'
*.log_archive_config='DG_CONFIG=(ORAPR,ORASC)'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME="ORAPR"'
*.log_archive_dest_2='SERVICE="ORASC" LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME="ORASC"'
*.log_archive_format='%t_%s_%r.arc'
*.log_file_name_convert='/ORASC/','/ORAPR/'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=649m
*.processes=320
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1947m
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'

Khởi tạo standby database bằng RMAN DUPLICATE

Startup nomount và reload listener trên standby


SQL> STARTUP NOMOUNT;
[oracle@oradbpr ~]$ lsnrctl reload


rman target sys/password@ORAPR auxiliary sys/password@ORASC
RMAN> DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
#SPFILE
#SET DB_UNIQUE_NAME='ORASC' COMMENT 'Is standby'
#SET FAL_SERVER='ORAPR' COMMENT 'Is primary'
DORECOVER
NOFILENAMECHECK;

  • FOR STANDBY: Báo hiệu lệnh DUPLICATE này nhân bản cho standby database do đó DBID phải giữ nguyên
  • FROM ACTIVE DATABASE: Lấy trực tiếp từ datafile sau đó recover ,mà không sử dụng bản backup hay không phải backup gì cả.
  • DORECOVER: Thực hiện recovery để đưa standby về 1 thời điểm gần nhất
  • SPFILE: Cho phép chúng ta đặt lại các giá trị trong spfile khi được copy từ primary sang standby.
  • NOFILENAMECHECK: Vị trị các file không được kiểm tra

Nếu password chứa ký tự đặc biệt truy cập https://www.urlencoder.org/ để convert.

Khởi tạo standby database bằng Backup/Recovery

Tiến hành backup bên primary


rman target /
RMAN> STARTUP MOUNT; #Nếu chưa startup database
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 10G;
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
RMAN> run {
crosscheck archivelog all;
crosscheck backup;
delete expired backup;
backup incremental level 0 database format '/backup/rman/data/%T_data_%U';
backup archivelog all format '/backup/rman/data/%T_arc_%U';
backup current controlfile format '/backup/rman/data/ctl_%U';
backup spfile format '/backup/rman/data/spfile_%U';
crosscheck backup;
delete obsolete;
}

Thực hiện backup xong copy sang standby


scp -r /backup/rman/data oracle@oradbsc:/backup/rman
scp -r /fra/ORAPR/archivelog oracle@oradbsc:/fra/ORASC

Tiến hành recovery trên standby


rman target /
RMAN> STARTUP MOUNT; #Nếu chưa startup database
RMAN> CATALOG START WITH '/backup/rman/data';
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;

Apply quy trình

Sau khi thực hiện duplicate database, thực thi các câu lệnh phía standby

Triển khai redo apply trong background. Kiểm soát được trả lại cho phiên khi tiến trình apply được bật


ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Tắt tiến trình apply


ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

Open database


ALTER DATABASE OPEN;

Bật apply theo thời gian thực (real time)


--Cần kích hoạt archivelog mode
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE THROUGH ALL SWITCHOVER DISCONNECT;

  • THROUGH ALL SWITCHOVER: sử dụng control option này giúp các standby database (không tham gia vào switchover) có thể recover thông qua tất cả các điểm end-of-redo và tiếp tục nhận và apply archived redo logs từ primary database mới, thay vì dừng quá trình recovery rồi bắt đầu lại sau khi failover để standby database trở thành primary database mới.

Nếu muốn, ta có thể đặt thời gian trễ giữa sự xuất hiện của archived redo log và các sequence được apply phía standby bằng cách sử dụng các lệnh sau.


ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DELAY 30 DISCONNECT FROM SESSION;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY DISCONNECT FROM SESSION;

Kiểm tra cài đặt

Trên primary database, kiểm tra archived redo log mới nhất và force a log switch (bắt Log Switches để chuyển sang log file tiếp theo)


SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC;
ALTER SYSTEM SWITCH LOGFILE;

Kiểm tra xem archived redo log mới đã đến được standby database và được apply hay chưa


SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC;

Kiểm tra OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS trước khi switchover


SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER và FAILOVER

SWITCHOVER

Một database có thể ở một trong 2 role là primary và standby, hai role này có thể thay đổi trong thời gian chạy mà không làm maastg mát dữ liệu hoặc reset redo logs. Quá trình chuyển đổi này được gọi là SWITCHOVER.

Chuyển đổi cơ sở dữ liệu primary sang chế độ standby


ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;

Mount primary database cũ bây giờ thành standby database


STARTUP NOMOUNT;
ALTER DATABASE MOUNT STANDBY DATABASE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE THROUGH ALL SWITCHOVER DISCONNECT USING CURRENT LOGFILE;

Chuyển đổi standby database thành cơ sở dữ liệu primary


ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

Open standby database cũ, bây giờ thành primary


ALTER DATABASE OPEN;

FAILOVER

Khi primary database gặp sự cố và không thể khôi phục được, standby database có thể được activate hoạt động như là primary database mới.

Thực hiện các câu lệnh sau


ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE ACTIVATE STANDBY DATABASE;

Sau khi chuyển đổi nên tiến hành backup full để đảm bảo an toàn.

Tham khảo thêm:

©2024Nguyen Dong Anh