Selamlar, Dataguard kurulumunun ikinci yazısıyla devam ediyoruz. İlk yazımızda iki makina arasındaki haberleşme protokollerini ayarlamıştık şimdi diğer adımlarla devam ediyoruz.
Prod database’imiz archive log modunda olmalı ve force logging aktif olmalı
SQL> SELECT force_logging FROM v$database;
SQL> SELECT log_mode FROM v$database;
Herşey normal gözüküyor. Eğer archiveog veya force logging aktif değilse aktif etmeniz gerekecek.
testdb makinamızda ki (Prod) orapw dosyamızı dataguard kurulacak ortama kopyalamalıyız.
cd /$ORACLE_HOME/dbs
scp orapwTESTDB oracle@testdbdg:/$ORACLE_HOME/dbs
Dataguard ortamı için pfile oluşturup database’i nomount mod da pfile üzerinden başlatacağız. İstersek testdb sunucumuzdan kopyalayabilir içeriğini düzenleyebiliriz. Ben vi ile oluşturup içeriğini düzenliyorum.
cd $ORACLE_HOME/dbs vi initTESTDB.ora
SQL>startup nomount pfile='/$ORACLE_HOME/dbs/initTESTDB.ora';
– Adump dizinini kendimiz oluşturalım (mkdir -p /oracle/app/oracle/TESTDB/adump)
– db_name parametresine dikkat edelim sunucu TESTDBDG yapmayalım çünkü tek bir veritabanımız var o da canlı veritabanımızın ismi .
– fal_server , fal_client gibi parametreleri diğer makinamızda da daha sonra set etmemiz gerekecek.
Kaydedip dosyadan çıkalım.
testdb makinamızda stanby_logfile oluşturmamız gerekiyor (varsa ekstra eklenebilir)
SQL>ALTER DATABASE ADD standby logfile thread 1 GROUP 4 ('+DATA') SIZE 512M, GROUP 5 ('+DATA') SIZE 512M;
SQL>SELECT * FROM v$standby_log;
SELECT GROUP#, thread#, bytes/1024/1024 FROM v$log;
Şimdi bazı parametreleri set etmemiz gerekiyor
- DB_UNQNAME set edilir
alter system set log_archive_config=’DG_CONFIG=(TESTDB,TESTDBDG);
- log_archive_dest_n set edilir.
alter system set log_archive_dest_1=’LOCATION=+DATA VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=TESTDB’;
alter system set log_archive_dest_2=’SERVICE=TESTDB LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TESTDBDG’;
- fal_server, fal_client set edilir. (Dataguard tarafında tam tersi)
alter system set fal_server=TESTDBDG; (Prod için)
alter system set fal_client=TESTDB; (Prod için)
alter system set standby_file_management=auto;
vi rman_testdb.scpt export ORACLE_UNQNAME=TESTDBDG export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/dbhome_1 rman target sys/oracle@TESTDB auxiliary sys/oracle@TESTDBDG msglog /home/oracle/rman_backup.log cmdfile=/home/oracle/backup_testdb.cmd
Kaydedip dosyadan çıkalım.
vi backup_testdb.cmd run{ Allocate channel c1 device type disk; Allocate channel c2 device type disk; Allocate channel c3 device type disk; Allocate channel c4 device type disk; allocate channel c5 device type disk ; allocate channel c6 device type disk ; allocate channel c7 device type disk ; allocate channel c8 device type disk ; allocate auxiliary channel c9 device type disk ; allocate auxiliary channel c10 device type disk ; allocate auxiliary channel c11 device type disk ; allocate auxiliary channel c12 device type disk ; allocate auxiliary channel c13 device type disk ; allocate auxiliary channel c14 device type disk ; allocate auxiliary channel c15 device type disk ; allocate auxiliary channel c16 device type disk ; DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE dorecover ; }
Tekrar kaydedip çıkalım. Artık çalıştırmaya hazırız, herhangi bir hata durumunu izlemek için bir önceki script’ deki log dosyasını da aynı zamanda izleyelim.
./backup_testdb.cmd
Adımlarımız tamamlandı gözüküyor, tamamlanmadan önce bir warning aldık ancak bu tamamen benim sanal makinaya vermiş olduğun alanla ilgili, bu yüzden recovery file’lardın boyutlarını yeterince arttıramadım. Veritabanımız da şuan için yüklü işlemler olmayacağından problem teşkil etmiyor.
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=’SERVICE=TESTDB LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) compression=enable DB_UNIQUE_NAME=TESTDBDG’;
-Prod da basılacak-
SQL> ALTER system switch logfile;
–Standby da çalışan komut, replikasyonu başlatır—-
SQL> ALTER DATABASE recover managed standby DATABASE disconnect FROM SESSION;
——– Standby tarihsel anlamda prod’a yakın mı ——
SQL> SELECT 'Last applied : ' Logs, to_char(next_time,'DD-MON-YY:HH24:MI:SS') TIME FROM v$archived_log WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#) FROM v$archived_log WHERE applied='YES') UNION SELECT 'Last received : ' Logs, to_char(next_time,'DD-MON-YY:HH24:MI:SS') TIME FROM v$archived_log WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#) FROM v$archived_log);
—-prod da basılır kontrol scripti—-
SQL> SET linesize 300; col destination FOR a15; col dest_name FOR a20; col db_unique_name FOR a15; col TYPE FOR a10; col error FOR a30; SELECT DEST_ID, DESTINATION, DEST_NAME, DB_UNIQUE_NAME,SYNCHRONIZED, STATUS, TYPE, DATABASE_MODE, GAP_STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID<
-prod da basılacak-
SQL>SELECT thread#,MAX(SEQUENCE#) FROM v$archived_log GROUP BY thread#;
-standby da basılacak-
SQL>SELECT thread#,MAX(SEQUENCE#) FROM v$archived_log WHERE applied='YES' GROUP BY thread#;
—- standby da çalıştırırır. fark var mı kontrol eder——-
SQL> SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied", (ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference" FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH, (SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1;
Eğer bir problem yaşamadıysanız Local Standby kurulumunu böylelikle tamamladım. Görüşmek üzere.