Dưới đây là hướng dẫn chi tiết quá trình dựng node Oracle data guard Physical standby Ver 19c với RMAN
Hướng dẫn cài đặt Oracle data guard Physical standby Ver 19c với RMAN
THÔNG TIN CHI TIẾT 2 NODE:
Items | Primary – SRV1 | Standby – SRV2 |
hostname | srv1 | srv2 |
ip | 192.168.68.11 | 192.168.68.12 |
db name | duodb | duodb |
instance_name | duodb | duodb |
db_unique_name | duodb | stand |
version DB | 19.3 | 19.3 |
DB_HOME | /u01/app/oracle/product/ 19.3.0/dbhome_1 | /u01/app/oracle/product/ 19.3.0/dbhome_1 |
DB_BASE | /u01/app/oracle | /u01/app/oracle |
global database name | srv1.localdomain | srv2.localdomain |
Bắt đầu thôi:
Chuẩn bị hệ điều hành Linux để cài đặt:
Xem các bước cài đặt HĐH oracle Linux ở đây: https://datalinks.vn/huong-dan-cai-dat-oracle-linux-7-9-tren-vtbox/
Hoặc Download oracle linux 7.9 file .OVA có sẵn cho máy ảo Virtualbox mà không phải cài đặt:
https://drive.google.com/file/d/1SA3R5UY97qTSYtQGzpaz4LocUAZBBuGt/view?usp=sharing
Các bạn tải về và mở Virtualbox lên sau đó thực hiện Import vào => File => Import …
Cài đặt Oracle database 19c trên Linux ở bên trên:
Xem bài viết này nhé: https://datalinks.vn/cai-dat-oracle-database-19c-tren-linux-install-oracle-database-19c-on-linux/
Cài đặt Oracle database 19c trên Linux | Install oracle database 19c on Linux
Tiếp theo:
SRV1 – là server tôi đặt là Primary
SRV2 – là server tôi đặt là Standby
Chúng ta tạo Data Guard dạng Physical Standby nghĩa là nó sẽ apply Redolog sang Standby từ Primary.
Prim: cài đặt hoàn thiện phần mềm và khởi tạo CSDL oracle database 19c, tên CSDL là duodb
Stand: chỉ cài đặt oracle Software và không tạo DB (chúng ta sẽ clone nó từ Prim)
Đặt tên hostname cho 2 node:
trên SRV1: hostnamectl set-hostname srv1.localdomain trên SRV2: hostnamectl set-hostname srv2.localdomain
Trên cả 2 SRV:
Thêm vào cuối file hosts theo thông tin bên dưới:
vi /etc/hosts 192.168.68.11 srv1.localdomain srv1 192.168.68.12 srv2.localdomain srv2
SERVER PRIM SRV1:
trước khi thực hiện đảm bảo rằng trên SV1 đã cài đặt oracle software và tạo database rồi => thực hiên theo hướng dẫn ở bên trên
Kiểm tra và bật chế độ Archivelog:
su oracle cd . .bash_profile sqlplus / as sysdba startup alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=both; select log_mode from v$database; archive log list;
Nếu chưa bật thì Off database đi khởi động ở mount và bật lên:
shutdown immediate startup mount alter database archivelog; alter database open;
Kiểm tra và bật chế độ Force Logging:
select force_logging from v$database; alter database force logging;
Check redo log size:
select group#, thread#, bytes/1024/1024 mb from v$log; select thread#, instance from v$thread ;
SQL> select group#, thread#, bytes/1024/1024 mb from v$log;
GROUP# THREAD# MB
---------- ---------- ----------
1 1 200
2 1 200
3 1 200
Tạo redo log cho standby node, chúng ta nên tạo standby redo logs giống như primary về kích thước file, số lượng group và log file (ở đây là 200MB và 3 logfile):
alter database add standby logfile thread 1 size 200m; alter database add standby logfile thread 1 size 200m; alter database add standby logfile thread 1 size 200m;
Kiểm tra kết quả sau khi tạo:
select group#, thread#, sequence#, bytes/1024/1024 mb, archived, status from v$standby_log; select member from v$logfile where type = 'STANDBY';
Check db_unique_name:
show parameter db_unique_name
Set log_archive_config:
alter system set log_archive_config='DG_CONFIG=(DUODB,STAND)' scope=both;
Set log_archive_dest_2:
alter system set log_archive_dest_2='SERVICE=STAND ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STAND' scope=both;
Set fal_server:
show parameter fal_server ; alter system set fal_server ='STAND' scope=both;
Set standby_file_management: AUTO
show parameter standby_file_management alter system set standby_file_management='AUTO' scope=both;
Lấy thông tin đường dẫn: control_files, core_dump_dest, audit_file_dest:
select name, value from v$parameter where upper(value) like upper('%/duodb/%');
Kiểm tra và Enable flashback:
select flashback_on from v$database; alter database flashback on;
Check the password file:
exit ls /u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapw*
Tắt firewall trên node:
systemctl stop firewalld.service systemctl disable firewalld.service
Bật đồng bộ thời gian cho node:
systemctl enable chronyd.service systemctl restart chronyd.service systemctl status chronyd chronyc tracking chronyc sources chronyc -a 'burst 4/4' chronyc -a makestep
Update yum:
yum update -y
Add to tnsnames.ora:
vi /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
# Thêm nội dung đoạn này vào file:
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. DUODB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = duodb.localdomain) ) ) STAND = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = stand.localdomain) ) ) LISTENER_DUODB = (ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
Thêm static listener:
vi /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora
# Thêm nội dung đoạn này vào file:
# listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = duodb.localdomain) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1) (SID_NAME = duodb) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle
Ghi chú: có thể sử dụng netmgr, netca để tiến hành thiết lập listener và tnsnames cho node.
Tiến hành Reload the listener:
lsnrctl start lsnrctl status lsnrctl reload
CẤU HÌNH SERVER STANDBY:
trước khi thực hiện đảm bảo rằng trên SV1 đã cài đặt oracle software rồi => thực hiên theo hướng dẫn ở bên trên
Tắt firewall trên node:
systemctl stop firewalld.service systemctl disable firewalld.service
Bật đồng bộ thời gian cho node:
systemctl enable chronyd.service systemctl restart chronyd.service systemctl status chronyd chronyc tracking chronyc sources chronyc -a 'burst 4/4' chronyc -a makestep
Update yum:
yum update -y
Tạo thông tin để khởi tạo DB, tên db là giống nhau ở cả 2 db (duodb), thông tin db_unique_name sẽ là khác nhau lần lượt là: DUODB, STAND (server: prim, stand):
Tạo db_name trong file pfile trên server:
Lệnh này sẽ tạo ra pfile tên initstand.ora trong thư mục dbs:
echo 'DB_NAME=DUODB' > $ORACLE_HOME/dbs/initstand.ora
Copy password file từ Prim sang Stand và đổi tên:
Srv2: Thực hiện Copy đúng thông tin file:
scp oracle@srv1:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwduodb /u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwstand
Kiểm tra xem trên Srv2 đã có file orapw hay chưa:
ls -al /u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwstand
SRV2: Copy tnsname.ora file từ Prim sang Stand:
scp oracle@srv1:/u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora
Add listener và reload nó:
vi /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora
# Thêm đoạn sau vào file:
# listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = stand.localdomain) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1) (SID_NAME = stand) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /u01/app/oracle
Start và Reload Listener:
lsnrctl start lsnrctl status lsnrctl reload
Tiến hành tnsping kiểm tra kết nối mạng:
ping srv1 ping srv1.localdomain ping srv2 ping srv2.localdomain tnsping duodb tnsping stand
- hệ thống hiển thị kết quả ping thành công
Tạo adump folder và oradata:
mkdir -p /u01/app/oracle/admin/STAND/adump mkdir -p /u01/app/oracle/oradata mkdir -p /u01/app/oracle/fast_recovery_area
Khởi động Stand DB trong nomount:
Thực hiện gán biến SID thành stand trước khi khởi động: (tên db là chữ thường, phân biệt chữ hoa/thường)
[oracle@srv2 ~]$ export ORACLE_SID=stand Login vào sqlplus: sqlplus / as sysdba startup nomount exit
DUPLICATE THE DATABASE
prim: DB open
stand: DB nomount
SRV1: Kết nối RMAN vào Prim và Stand cùng lúc: (trên Srv1)
rman TARGET sys/oracle@DUODB AUXILIARY sys/oracle@STAND
Nhân bản (Duplicate the database) DB:
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET DB_UNIQUE_NAME 'STAND' COMMENT 'Is standby' SET LOG_ARCHIVE_DEST_2 'SERVICE=DUODB ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DUODB' SET AUDIT_FILE_DEST '/u01/app/oracle/admin/STAND/adump' SET CONTROL_FILES '/u01/app/oracle/oradata/STAND/controlfile/control01.ctl' SET FAL_SERVER 'DUODB' NOFILENAMECHECK;
- Duplicate thành công
Kết nối vào Stand để check database: (Srv2)
sqlplus / as sysdba select database_role from v$database; show parameter db_name show parameter db_unique_name
Stand: thực hiện apply redo:
alter database recover managed standby database disconnect from session;
Stand: thực hiện check apply redo:
select role, thread#, sequence#, action from v$dataguard_process;
Prim: thực hiện check apply redo và thực hiện switch logfile check quá trình tạo log:
select sequence#, first_time, next_time from v$archived_log order by sequence#; alter system switch logfile;
Stand: kiểm tra log mới apply:
select sequence#, first_time, next_time, applied from v$archived_log order by sequence#;
Stand: Stop quá trình recovery process
alter database recover managed standby database cancel;
Stand: Enable flashback on the standby:
select flashback_on from v$database; alter database flashback on;
Stand: Start the recovery process again on the standby
alter database recover managed standby database disconnect from session;
TEST DATABASE: THỰC HIỆN QUÁ TRÌNH SWITCHOVER VỚI SQLPLUS:
Prim: kiểm tra đồng bộ dữ liệu sẵn sàng thực hiện switchover
sqlplus / as sysdba alter database switchover to STAND verify;
Prim: Kiểm tra GAPS: no gaps
select status, gap_status from v$archive_dest_status where dest_id = 2;
Prim: thực hiện lênh switchover:
alter database switchover to STAND;
SRV2: (hiện tại Srv2 trở thành primary database) => open database:
sqlplus / as sysdba alter database open;
SRV1: (hiện tại là standby database) và tiến hành mount database:
startup mount alter database recover managed standby database disconnect;
SRV1: check và kiểm tra thông tin:
select database_role from v$database; select role, thread#, sequence#, action from v$dataguard_process;
- SRV1 hiện tại đã thành Standby database và SRV2 thành Primary
- Quá trình thực hiện switchover thành công
TEST DATABASE: THỰC HIỆN SWITCHBACK:
SRV2: verify thông tin sẵn sàng thực hiện switch:
alter database switchover to DUODB verify;
SRV2: thực hiện switchover.
alter database switchover to DUODB;
SRV1: Open database
alter database open;
SRV2: mount database và start recover redo logfile:
startup mount alter database recover managed standby database disconnect;
SRV2: kiểm tra thông tin sau khi thực hiện switchover
select database_role from v$database;
- quá trình switchover thành công
TROUBLESHOOTING
set linesize 200 pages 50 col value for a85 col name for a50 select name, value from gv$parameter where name in ('db_name','db_unique_name','log_archive_config', 'log_archive_dest_1','log_archive_dest_2','log_archive_dest_3', 'log_archive_dest_state_1','log_archive_dest_state_2','log_archive_dest_state_3', 'remote_login_passwordfile','log_archive_format','log_archive_max_processes', 'fal_server','fal_client','db_file_name_convert', 'log_file_name_convert', 'standby_file_management') order by 1;
Chú ý:
Khi bạn insert data vào trong primary mà muốn kiểm tra thông tin trên standy thì sẽ không thể check được do là standby đang ở chế độ mount => như vậy muốn xem được thông tin thì standby phải chuyển sang Open => nhưng nếu Open standby thì rất nguy hiểm vì lúc này nó sẽ không thể là thành phần của data guard nữa => chúng ta chỉ có thể chuyển standby về chế độ Open Read Only là an toàn
Khi bạn mở cơ sở dữ liệu (database) trên server standby (physical standby server), có thể có các trường hợp sau đây tùy thuộc vào chế độ bạn mở nó:
- Open ở chế độ read-only (READ ONLY WITH APPLY):
- Trong trường hợp này, bạn có thể mở database trên standby để đọc dữ liệu nhưng không thể thực hiện các thao tác ghi (INSERT, UPDATE, DELETE). Lúc này, standby server vẫn có thể nhận và áp dụng các redo logs từ primary server để cập nhật dữ liệu.
- Ảnh hưởng: Không có tác động tiêu cực lên quá trình đồng bộ hóa giữa primary và standby, vì standby vẫn tiếp tục nhận và áp dụng redo logs mà không làm gián đoạn hoạt động của primary server. Bạn có thể dùng standby cho mục đích báo cáo mà không ảnh hưởng đến hoạt động chính của hệ thống.
- Open ở chế độ read-write (READ WRITE):
- Nếu bạn mở standby database ở chế độ read-write, nó sẽ trở thành một cơ sở dữ liệu độc lập (không còn là standby). Việc này sẽ làm ngắt quá trình đồng bộ giữa primary và standby.
- Ảnh hưởng: Standby server sẽ không còn nhận redo logs từ primary nữa, điều này có thể làm mất tính nhất quán giữa hai server và bạn cần cấu hình lại nếu muốn quay về mô hình standby.
Thông thường, standby database được mở ở chế độ read-only để phục vụ cho mục đích đọc và phân tích dữ liệu, tránh làm gián đoạn quá trình đồng bộ với primary.
Xem thêm bài viết này để chuyển đổi thành Active data guard từ hệ thống data guard thông thường nhé. Primary sẽ dùng để làm data chính, Standby sẽ dùng để khai thác dữ liệu Read Only, hệ thống vẫn đồng bộ dữ liệu bình thường. https://datalinks.vn/oracle-data-guard-convert-physical-standby-thanh-active-data-guard-oracle-19c/
Oracle Data Guard convert Physical standby thành Active data guard Oracle 19c
Chúc các bạn thực hiện thành công!