در این متن، بطور اجمال، به مراحل پیکربندی Data Guard خواهیم پرداخت. برای راه اندازی دیتاگارد، نیاز است تا قسمتی از عملیات در محیط بانک اصلی و قسمت دیگر در سرور(ماشین) دیتاگارد انجام شود که البته به طور حتم و الزام نمی توان بین این مراحل، ترتیب مشخصی قائل شد.
با تقسیم بندی ما، طی ده مرحله زیر، دیتاگارد پیاده سازی خواهد شد.
مرحله اول: به عنوان مرحله اول، می توان نرم افزار اوراکل را در سرور یا ماشینی که قرار است دیتاگارد در ان راه اندازی شود، نصب نمود البته بدون ایجاد دیتابیس(طریقه نصب نرم افزار اوراکل را در این سایت مطالعه بفرمایید).
*در صورت عدم تطبیق بین نسخه نرم افزار بانک اصلی و دیتاگارد، باز هم پیاده سازی دیتاگارد امکان پذیر می باشد(صرفا در حالت mount) ولی در زمان انجام عملیات switchover، باید نسخه دو طرف یکسان باشد.
مرحله دوم: در صورتی که بانک اصلی(primary) در حالت noarchivelog قرار دارد، ان را در حالت archivelog قرار می دهیم:
SQL> SELECT log_mode FROM v$database;
LOG_MODE
————
NOARCHIVELOG
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1828713720 bytes
Fixed Size 8897784 bytes
Variable Size 687865856 bytes
Database Buffers 1124073472 bytes
Redo Buffers 7876608 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter system set log_archive_dest_1=’LOCATION=/u01/arch’;
System altered.
SQL> alter database open;
Database altered.
*بدون انجام مرحله دوم، راه اندازی دیتاگارد امکان پذیر نمی باشد.
*این مرحله باید قبل از ارسال دیتافایل به سرور گارد انجام شود.
مرحله سوم: فعال کردن forced logging در بانک اصلی:
SQL> SELECT force_logging FROM v$database;
FORCE_LOGGING
—————————————
NO
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
SQL> SELECT force_logging FROM v$database;
FORCE_LOGGING
—————————————
YES
*بدون انجام این مرحله، راه اندازی دیتاگارد امکان پذیر می باشد منتها در صورت ثبت اطلاعات در حالت nologging، دیتاگارد با خطا مواجه خواهد شد.
مرحله چهارم: افزودن standby redo log در بانک اصلی:
SQL> select max (bytes/1024/1024) MB , count (*) from v$log;
MB COUNT(*)
———- ———-
200 3
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 SIZE 200M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 SIZE 200M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 SIZE 200M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 SIZE 200M;
Database altered.
*انجام این مرحله، به صورت اختیاری می باشد.
مرحله پنجم: تنظیم فایل listener.ora در محیط دیتاگارد:
[[email protected]_host ~]$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = stb)
(ORACLE_HOME = /18c/home)
(SID_NAME = stb)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = stb_host)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
)
)
ADR_BASE_LISTENER = /18c/base
[[email protected]_host ~]$ lsnrctl reload
LSNRCTL for Linux: Version 18.0.0.0.0 – Production on 24-JUN-2018 10:43:15
Copyright (c) 1991, 2017, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stb_host)(PORT=1521)))
The command completed successfully
* معمولا قبل از راه اندازی دیتاگارد، بانک اصلی در حال سرویس دهی می باشد پس به احتمال بسیار زیاد، فایل listerner.ora در این محیط، نیازی به بازنگری نخواهد داشت.
همچنین اطلاعات زیر را در فایل tnsnames.ora اضافه می کنیم(در هر دو محیط بانک اصلی و دیتاگارد):
[[email protected]_host ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
primary=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prim_host)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(sid=cdb18c)
)
)
stb_tns=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = stb_host)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(sid=stb)
)
)
*این تنظیمات به فایل tnsnames.ora در هر دو طرف(بانک اصلی و دیتاگارد) اضافه می شود.
مرحله ششم:ایجاد پسورد فایل در بانک اصلی و کپی ان به سرور دیتاگارد:
–in prim:
[[email protected]_host ~]$orapwd file=/u02/18c/home/dbs/orapwcdb18c password=ramz_123 force=y
[[email protected]_host ~]# scp /u02/18c/home/dbs/orapwcdb18c stb_host:/18c/home/dbs/
[email protected]_host’s password:
orapwcdb18c 100% 6144 6.0KB/s 00:00
in stb:
[[email protected]_host ~]# mv /18c/home/dbs/orapwcdb18c /18c/home/dbs/orapwstb
[[email protected]_host ~]# chown oracle.oinstall /18c/home/dbs/orapwstb
*برای تست صحت انجام مرحله پنجم و ششم می توان از دستور زیر استفاده کرد:
–لاگین با مجوز sysdba به محیط دیتاگارد:
[[email protected]_host ~]$ sqlplus “sys/[email protected]_tns as sysdba”
SQL*Plus: Release 18.0.0.0.0 Production on Sun Jun 24 10:56:34 2018
Version 18.1.0.0.0
Copyright © 1982, 2017, Oracle. All rights reserved.
Connected to an idle instance.
SQL>
–لاگین با sysdba به بانک اصلی:
[[email protected]_host ~]$ sqlplus “sys/[email protected] as sysdba”
SQL*Plus: Release 18.0.0.0.0 Production on Sun Jun 24 10:57:28 2018
Version 18.1.0.0.0
Copyright (c) 1982, 2017, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production
Version 18.1.0.0.0
SQL>
اجرای این دو دستور نشان می دهد که تنظیم فایل listener.ora، tnsnanmes.ora و همچنین ایجاد پسوردفایل، به درستی صورت پذیرفته است.
–این دستور را می توان در محیط بانک اصلی هم برای تست، اجرا نمود.
مرحله هفتم: تنظیم پارامتر در بانک اصلی:
SQL> alter system set db_unique_name=cdb18c scope=spfile;
System altered.
SQL> alter system set log_archive_config=’dg_config=(cdb18c,stb)’;
System altered.
SQL> alter system set log_archive_dest_2=’service=stb_tns db_unique_name=stb’;
System altered.
SQL> alter system set log_archive_dest_state_2=enable;
System altered.
SQL> alter system set log_archive_max_processes=7;
System altered.
SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;
System altered.
به صورت خلاصه، تنظیم سه پارامتر زیر در محیط بانک اصلی، الزامی می باشد:
db_unique_name=cdb18c
log_archive_config=’dg_config=(cdb18c,stb)’
log_archive_dest_2=’service=stb_tns db_unique_name=stb’
مرحله هشتم: ایجاد پارامتر فایل برای دیتاگارد و استارت ان در حالت nomount:
*.db_name=cdb18c
*.db_unique_name=stb
*.control_files=’/18c/oradata/stb/control01.ctl’
*.fal_client=stb_tns
*.fal_server=primary
*.db_file_name_convert=’/u01/18c_oradata/cdb18c’,’/18c/oradata/stb’
*.log_file_name_convert=’/u01/18c_oradata/cdb18c’,’/18c/oradata/stb’
*. log_archive_config=’dg_config=(cdb18c,stb)’
*.log_archive_dest_1=’location=/18c/arch’
*.standby_file_management=auto
*.log_archive_max_processes=7
*.remote_login_passwordfile=exclusive
*._exadata_feature_on=true
*.enable_pluggable_database=true
*پارامتر _exadata_feature_on به پیکربندی دیتاگارد مربوط نیست و تنظیم ان در محیط عملیاتی، کاربردی ندارد.
*تنها در محیط multitenant باید پارامتر enable_pluggable_database را تنظیم کرد.
*در صورت یکسان بودن همه مسیرها در بانک اصلی و دیتاگارد، نیازی به تنظیم دو پارامتر db_file_name_convert و log_file_name_convert نخواهیم داشت.
* پارامتر db_name باید در هر دو طرف یکسان باشد و بهتر است که پارامتر db_unique_name، مقدار متفاوتی در محیط دیتاگارد داشته باشد.
*مقدار پارامتر fal_server و fal_client به نام net service name دو طرف اشاره دارد.
*مقدار پارامتر db_unique_name بانک اصلی و دیتاگارد، برای پارامتر log_archive_config تعیین شده است.
*پارامترهای اعلام شده، تنها به جهت پیکربندی دیتاگارد می باشند و دیگر پارامترها نظیر پارامترهای امنیتی، کارایی و … که مخصوصا بعد از انجام switchover مورد نیاز هستند، در این قسمت دیده نشده اند(پارامترهای نظیر sga_target – audit_trail – processes) پس باید متناسب با منابع و همچنین نیازهای محیطی، این پارامترها را هم تنظیم نمود.
بعد از تنظیم پارامتر فایل، spfileای را در این محیط ایجاد می کنیم:
[[email protected]_host ~]$ sqlplus “/as sysdba”
SQL*Plus: Release 18.0.0.0.0 Production on Sun Jun 24 11:13:12 2018
Version 18.1.0.0.0
Copyright (c) 1982, 2017, Oracle. All rights reserved.
Connected to an idle instance.
SQL> create spfile from pfile=’/home/oracle/init.ora’;
File created.
در پایان این مرحله، instance را در حالت nomount قرار می دهیم(البته در این مرحله، الزامی به انجام این کار وجود ندارد وصرفا جهت تست، این کار انجام می شود):
SQL> startup nomount
ORACLE instance started.
Total System Global Area 381680512 bytes
Fixed Size 8657792 bytes
Variable Size 314572800 bytes
Database Buffers 50331648 bytes
Redo Buffers 8118272 bytes
SQL>
مرحله نهم: چندین روش برای ارسال دیتافایلها از محیط Primary به محیط Data Guard وجود دارد که دو روش انجام آن را در ادامه مشاهده خواهید کرد.
1.Active duplicate standby
2.ارسال دیتافایل به صورت سیستم عاملی(در حالت begin backup)
روش اول: Active Duplicate standby
در این روش، با کمک ابزار rman، بانک اصلی را در محیط دیتاگارد dupliacate می کنیم که در ادامه شیوه انجام ان را مشاهده خواهید کرد.
قبل از اجرای دستور duplicate، فرض بر ان است که instance مربوط به data guard، با کمک spfile در حالت nomount قرار گرفته است.
اتصال به بانک اصلی(target) و دیتاگارد(auxiliary) از طریق rman:
[[email protected] ~]$ rman target sys/[email protected] auxiliary sys/[email protected]_tns
Recovery Manager: Release 18.0.0.0.0 – Production on Mon Jun 25 10:50:16 2018
Version 18.1.0.0.0
Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved.
connected to target database: CDB18C (DBID=297405757)
connected to auxiliary database: CDB18C (not mounted)
RMAN> duplicate target database for standby from active database nofilenamecheck;
Starting Duplicate Db at 25-JUN-18
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=660 device type=DISK
contents of Memory Script:
{
backup as copy reuse
passwordfile auxiliary format ‘/18c/home/dbs/orapwstb’ ;
}
contents of Memory Script:
{
restore clone from service ‘primary’ standby controlfile;
}
executing Memory Script
Starting restore at 25-JUN-18
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02
output file name=/18c/oradata/stb/control01.ctl
Finished restore at 25-JUN-18
contents of Memory Script:
{
sql clone ‘alter database mount standby database’;
}
executing command: SET NEWNAME
Starting restore at 25-JUN-18
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /18c/oradata/stb/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:08
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /18c/oradata/stb/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /18c/oradata/stb/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /18c/oradata/stb/pdbseed/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00006 to /18c/oradata/stb/pdbseed/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00007 to /18c/oradata/stb/users01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00008 to /18c/oradata/stb/pdbseed/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:04
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00028 to /18c/oradata/stb/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_system_fgcfop1o_.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00029 to /18c/oradata/stb/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_sysaux_fgcfop1y_.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service primary
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00030 to /18c/oradata/stb/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_undotbs1_fgcfop1z_.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 25-JUN-18
sql statement: alter system archive log current
contents of Memory Script:
{
switch clone datafile all;
}
Finished Duplicate Db at 25-JUN-18
روش دوم: ارسال دیتافایل به صورت سیستم عاملی(در حالت begin backup)
برای این کار، ابتدا بانک را در وضیعت begin backup قرار می دهیم:
SQL> alter database begin backup;
Database altered.
با دستور زیر، مسیر فایلهای بانک اصلی را مشخص می کنیم:
SQL> select name from v$datafile;
NAME
——————————————————————————–
/u01/18c_oradata/CDB18C/system01.dbf
/u01/18c_oradata/CDB18C/sysaux01.dbf
/u01/18c_oradata/CDB18C/undotbs01.dbf
/u01/18c_oradata/CDB18C/pdbseed/system01.dbf
/u01/18c_oradata/CDB18C/pdbseed/sysaux01.dbf
/u01/18c_oradata/CDB18C/users01.dbf
/u01/18c_oradata/CDB18C/pdbseed/undotbs01.dbf
/u01/18c_oradata/CDB18C/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_system_fgcfop1o_.dbf
/u01/18c_oradata/CDB18C/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_sysaux_fgcfop1y_.dbf
/u01/18c_oradata/CDB18C/CDB18C/6AFC495838351172E0530288200A1577/datafile/CDB18C/6AFC495838351172E0530288200A1577/datafile/o1_mf_undotbs1_fgcfop1z_.dbf
10 rows selected.
سپس همه این فایلها را به محیط دیتاگارد منتقل می کنیم:
[[email protected]_host ~]# scp -r /u01/18c_oradata/CDB18C/* stb_host:/18c/oradata/stb/
[email protected]_host’s password:
o1_mf_system_fgcfop1o_.dbf 100% 270MB 54.0MB/s 00:05
o1_mf_sysaux_fgcfop1y_.dbf 100% 560MB 70.0MB/s 00:08
o1_mf_undotbs1_fgcfop1z_.dbf 100% 305MB 50.8MB/s 00:06
o1_mf_temp_fgcfop20_.dbf 100% 62MB 62.0MB/s 00:00
o1_mf_13_flyf7vyw_.log 100% 200MB 100.0MB/s 00:02
o1_mf_11_flyf7oqt_.log 100% 200MB 100.0MB/s 00:02
o1_mf_10_flyf7kz7_.log 100% 200MB 100.0MB/s 00:02
o1_mf_12_flyf7rj3_.log 100% 200MB 100.0MB/s 00:02
control01.ctl 100% 18MB 17.9MB/s 00:01
control02.ctl 100% 18MB 17.9MB/s 00:00
o1_mf_system_fgc4h4fy_.dbf 100% 1060MB 50.5MB/s 00:21
o1_mf_temp_fgc4h4g1_.dbf 100% 129MB 129.0MB/s 00:01
o1_mf_undotbs1_fgc4h4g0_.dbf 100% 565MB 51.4MB/s 00:11
o1_mf_sysaux_fgc4h4fz_.dbf 100% 610MB 61.0MB/s 00:10
o1_mf_users_fgc4h4g1_.dbf 100% 5128KB 5.0MB/s 00:00
system01.dbf 100% 250MB 50.0MB/s 00:05
undotbs01.dbf 100% 100MB 100.0MB/s 00:01
sysaux01.dbf 100% 350MB 70.0MB/s 00:05
redo01.log 100% 200MB 100.0MB/s 00:02
redo02.log 100% 200MB 66.7MB/s 00:03
redo03.log 100% 200MB 100.0MB/s 00:02
sysaux01.dbf 100% 2380MB 50.6MB/s 00:47
system01.dbf 100% 870MB 54.4MB/s 00:16
temp01.dbf 100% 71MB 71.0MB/s 00:01
undotbs01.dbf 100% 390MB 48.8MB/s 00:08
users01.dbf 100% 5128KB 5.0MB/s 00:00
بعد از کپی شدن فایلها، بانک را از حالت begin backup خارج می کنیم:
SQL> alter database end backup;
Database altered.
این روش با ایجاد یک standby controlfile در محیط بانک اصلی و انتقال ان به سرور دیتاگارد به پایان خواهد رسید:
SQL> alter database create standby controlfile as ‘/u01/control01.ctl’;
Database altered.
[[email protected]_host ~]# scp /u01/control01.ctl stb_host:/18c/oradata/stb/
[email protected]_host’s password:
control01.ctl 100% 18MB 17.9MB/s 00:01
مرحله دهم: قرار دادن دیتاگارد در حالت mount و ریکاوری:
[[email protected]_host ~]# chown -R oracle.oinstall /18c/oradata/stb/
[[email protected]_host ~]$ sqlplus “/as sysdba”
SQL*Plus: Release 18.0.0.0.0 Production on Sun Jun 24 11:39:33 2018
Version 18.1.0.0.0
Copyright (c) 1982, 2017, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production
Version 18.1.0.0.0
SQL> alter database mount;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
Database altered.
SQL> select group#,status from v$standby_log;
GROUP# STATUS
———- ———-
10 ACTIVE
11 UNASSIGNED
12 UNASSIGNED
13 UNASSIGNED
با اجرای این دستور، عملیات ریکاوری شروع خواهد شد:
PR00 (PID:31499): Media Recovery Log /18c/arch/1_192_974028799.dbf
2018-06-24T11:50:30.258604+04:30
PR00 (PID:31499): Media Recovery Waiting for T-1.S-193 (in transit)
2018-06-24T11:50:30.262989+04:30
Recovery of Online Redo Log: Thread 1 Group 10 Seq 193 Reading mem 0
Mem# 0: /18c/oradata/stb/CDB18C/onlinelog/o1_mf_10_flyf7kz7_.log
همچنین برای گزارش گیری از محیط دیتاگارد، می توان ان را در حالت open قرار داد:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> alter database open;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
Database altered.
SQL> select count(*) from tbl;
COUNT(*)
———-
10