Oracle Replication و UCP Fast Connection Failover



في بعض الأحيان ، يحتوي تكوين تطبيق Java على عنوان IP "الأساسي" لخادم قاعدة البيانات ، والذي يمكن أن يتغير ، على سبيل المثال ، في الحالات التالية:



  • التغيير المتحكم فيه لأدوار قاعدة البيانات. تصبح "أساسي" "Standby" والعكس صحيح ، "Standby" تصبح "أساسية". عادة ما يسمى هذا الإجراء "التبديل".
  • تغيير طارئ لدور "الاستعداد" إلى "أساسي". يشار إلى هذا عادةً باسم "تجاوز الفشل".


في كلتا الحالتين ، يجب ألا "يعرف" التطبيق عنوان IP للخادم "الأساسي" الجديد فحسب ، بل يجب أن يكون قادرًا أيضًا على الوصول إليه عند الحاجة. فيما يلي دليل سريع حول كيفية القيام بذلك باستخدام Oracle Universal Connection Pool (UCP) ، بالإضافة إلى عرض توضيحي "Switchover".



للتجربة ، سوف نستخدم:



  • MacBook بذاكرة وصول عشوائي (RAM) بسعة 16 جيجابايت (أكثر من 8 جيجابايت مطلوب للتجربة)
  • إصدار Virtual Box 6.1.12
  • 2x من الأجهزة الافتراضية (المشار إليها فيما يلي بـ VM) مع  CentOS 7 Minimal ، كل منها به

  • قاعدة بيانات أوراكل 19 ج


دعنا نتبع هذه الخطوات:



  1. تكوين الأجهزة الافتراضية
  2. تثبيت Oracle
  3. نسخ أوراكل
  4. تثبيت وتكوين Oracle Grid
  5. "Switchover" Java








نقوم بإنشاء أجهزة افتراضية (فيما يلي VMs) بنوع Linux Red Hat ، ابدأ. عند بدء تشغيل Virtual Box ، فإنه يطالبك بتحديد iso لبدء تشغيل VM (في التجربة ، يتم استخدام CentOS-7-x86_64-Minimal-1908.iso). اترك كل شيء افتراضيًا ، وأعد التشغيل ، وقم بالتحديث ، وتثبيت "إضافات ضيف Virtual Box" ، وأوقف تشغيل جدار الحماية حتى لا يعيق الطريق. "يعرف الجميع كيف يتم مسح البولندية" ، لذلك نلاحظ فقط أنه بعد تحديث أجهزة VM ، نقوم بتبديل واجهات الشبكة الخاصة بهم من محول NAT إلى "محول المضيف الظاهري" vboxnet0. بالنسبة لهذا المحول ، الذي يمكن إنشاؤه في أدوات Virtual Box ، قم بتعيين العنوان 192.168.56.1/24 يدويًا وقم بتعطيل DHCP. في الأساس ، هو عنوان IP الخاص بالبوابة الافتراضية لـ VMs وعنوان تطبيق Java. من أجل الوضوح فقط. وإذا كنت لا تزال بحاجة إلى الإنترنت على CentOS ،ثم يمكنك تمكين NAT على macOS:



  1. قم بالتبديل إلى الجذر باستخدام الأمر 'sudo su -'.
  2. اسمح بإعادة توجيه حركة المرور باستخدام الأمر 'sysctl -w net.inet.ip.forwarding = 1'.
  3. أضف محتوى الملف /etc/pf.conf إلى ملف /var/root/pfnat.conf ، حيث نقوم بإدراج قاعدة NAT بدلاً من السطر 3:

    nat على enX من vboxnet0: شبكة إلى أي -> (enX)


    حيث enX هو اسم واجهة الشبكة مع المسار الافتراضي.
  4. قم بتشغيل الأمر 'pfctl -f pfnat.conf -e' لتحديث قواعد عامل تصفية الحزمة.


يمكن تنفيذ الخطوات من 2 إلى 4 بأمر واحد.
sysctl -w net.inet.ip.forwarding=1 \
 && grep -v -E -e '^#.*' -e '^$' /etc/pf.conf | head -n2 > pfnat.conf \
 && INET_PORT=$(netstat -nrf inet | grep default | tr -s ' ' | cut -d ' ' -f 4) \
 && echo "nat on ${INET_PORT} from vboxnet0:network to any -> (${INET_PORT})" >> pfnat.conf \
 && grep -v -E -e '^#.*' -e '^$' /etc/pf.conf | tail -n+3 >> pfnat.conf \
 && pfctl -f pfnat.conf -e




أضف إدخالات موحدة إلى / etc / hosts لجميع أجهزة VM حتى يتمكنوا من "اختبار الاتصال" من خلال أسماء النطاقات.



127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.56.78 oracle1.localdomain oracle1
192.168.56.79 oracle2.localdomain oracle2




تثبيت Oracle





نقوم بتثبيت "البرامج فقط" على oracle1 و oracle2  باستخدام حزم rpm ، الدليل الذي يمكن مشاركته من MacOS عبر Virtual Box (الجهاز-> الإعدادات-> المجلد المشترك).



yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm


yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm


بعد ذلك ، نقوم بإنشاء مثيل DBMS على VM "oracle1". للقيام بذلك ، قم بتشغيل البرنامج النصي المقابل تحت مستخدم Oralce.



/etc/init.d/oracledb_ORCLCDB-19c configure


هذا الإجراء يستغرق بعض الوقت. بعد إنشاء مثيل على كلا المضيفين ، أضف هذه السطور إلى ملف /home/oracle/.bash_profile:



export ORACLE_HOME="/opt/oracle/product/19c/dbhome_1"
export ORACLE_BASE="/opt/oracle"
export ORACLE_SID="ORCLCDB"
export PATH=$PATH:$ORACLE_HOME/bin


حسنًا ، قمنا بتهيئة ssh للراحة ، بحيث يمكنك الاتصال على الفور كمستخدم oracle. نحن نتصل بالمضيف عبر ssh ونتصل بقاعدة البيانات تحت مستخدم oracle.



user@macbook:~$ ssh oracle@oracle1
Last login: Wed Aug 12 16:17:05 2020
[oracle@oracle1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 12 16:19:44 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>


في الواقع ، أوراكل. بالنسبة للتجربة ، نحتاج أيضًا إلى إعداد النسخ المتماثل.



نسخ أوراكل.







لتكوين النسخ المتماثل ، سنستخدم تعليمات محدثة قليلاً :



  1. نقوم بنقل قاعدة البيانات الموجودة على خادم oracle1 إلى "وضع الأرشفة". للقيام بذلك ، قم بتنفيذ الأوامر في sqlplus:



    SHUTDOWN IMMEDIATE;


    STARTUP MOUNT;


    ALTER DATABASE ARCHIVELOG;


    ALTER DATABASE OPEN;
  2. بدون ترك sqlplus ، قم بتمكين "فرض التسجيل" على خادم oracle1.



    ALTER DATABASE FORCE LOGGING;


    ALTER SYSTEM SWITCH LOGFILE;
  3. قم بإنشاء ملفات "إعادة تسجيل" على خادم oracle1.

    ALTER DATABASE
          ADD STANDBY LOGFILE
          THREAD 1 GROUP 10 ('/opt/oracle/oradata/ORCLCDB/standby_redo01.log')
          SIZE 209715200;


    ALTER DATABASE
          ADD STANDBY LOGFILE
          THREAD 1 GROUP 11 ('/opt/oracle/oradata/ORCLCDB/standby_redo02.log')
          SIZE 209715200;


    ALTER DATABASE
          ADD STANDBY LOGFILE
          THREAD 1 GROUP 12 ('/opt/oracle/oradata/ORCLCDB/standby_redo03.log')
          SIZE 209715200;


    ALTER DATABASE
          ADD STANDBY LOGFILE
          THREAD 1 GROUP 13 ('/opt/oracle/oradata/ORCLCDB/standby_redo04.log')
          SIZE 209715200;
  4. قم بتشغيل "FLASHBACK" على خادم oracle1 ، فلن يعمل بدونه.

    SQL> host

    [oracle @ oracle1 ~] $ mkdir / opt / oracle / recovery_area

    [oracle @ oracle1 ~] $ exit

    SQL> تغيير مجموعة النظام db_recovery_file_dest_size = 2g النطاق = كلاهما ؛

    SQL> تغيير مجموعة النظام db_recovery_file_dest = '/ opt / oracle / recovery_area' نطاق = كلاهما ؛

    SQL> ALTER DATABASE FLASHBACK ON ؛
  5. نقوم بتمكين شيء ما تلقائيًا على خادم oracle1.

    SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
  6. tnsnames.ora listener.ora oracle1 oracle2 :

    oracle1, $ORACLE_HOME/network/admin/tnsnames.ora
    
    LISTENER_ORCLCDB =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521))
    
    ORCLCDB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = ORCLCDB)
        )
      )
    
    ORCLCDB_STBY =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = ORCLCDB)
        )
      )
    




    oracle1, $ORACLE_HOME/network/admin/listener.ora
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = ORCLCDB_DGMGRL)
          (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
          (SID_NAME = ORCLCDB)
        )
      )
    
    ADR_BASE_LISTENER = /opt/oracle
    




    oracle2, $ORACLE_HOME/network/admin/tnsnames.ora
    
    LISTENER_ORCLCDB =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521))
    
    ORCLCDB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = ORCLCDB)
        )
      )
    
    ORCLCDB_STBY =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = ORCLCDB)
        )
      )
    




    oracle2, $ORACLE_HOME/network/admin/listener.ora
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = ORCLCDB_STBY_DGMGRL)
          (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
          (SID_NAME = ORCLCDB)
        )
      )
    
    ADR_BASE_LISTENER = /opt/oracle
    


  7. oracle1 listener-.

    [oracle@oracle1 ~]$ lsnrctl reload


    [oracle@oracle1 ~]$ lsnrctl status



    LSNRCTL for Linux: Version 19.0.0.0.0 — Production on 15-AUG-2020 08:17:24



    Copyright © 1991, 2019, Oracle. All rights reserved.



    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle1.localdomain)(PORT=1521)))

    STATUS of the LISTENER

    — Alias LISTENER

    Version TNSLSNR for Linux: Version 19.0.0.0.0 — Production

    Start Date 15-AUG-2020 08:09:57

    Uptime 0 days 0 hr. 7 min. 26 sec

    Trace Level off

    Security ON: Local OS Authentication

    SNMP OFF

    Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora

    Listener Log File /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml

    Listening Endpoints Summary…

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle1.localdomain)(PORT=1521)))

    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle1.localdomain)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))

    Services Summary…

    Service «ORCLCDB» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «ORCLCDBXDB» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «ac8d8d741e3e2a52e0534e38a8c0602d» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «orclpdb1» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    The command completed successfully


    ( Data Guard: ORCLCDB_DGMGRL)
    [oracle@oracle1 ~]$ lsnrctl status



    LSNRCTL for Linux: Version 19.0.0.0.0 — Production on 15-AUG-2020 08:17:32



    Copyright © 1991, 2019, Oracle. All rights reserved.



    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle1.localdomain)(PORT=1521)))

    STATUS of the LISTENER

    — Alias LISTENER

    Version TNSLSNR for Linux: Version 19.0.0.0.0 — Production

    Start Date 15-AUG-2020 08:09:57

    Uptime 0 days 0 hr. 7 min. 34 sec

    Trace Level off

    Security ON: Local OS Authentication

    SNMP OFF

    Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora

    Listener Log File /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml

    Listening Endpoints Summary…

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle1.localdomain)(PORT=1521)))

    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle1.localdomain)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))

    Services Summary…

    Service «ORCLCDB» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «ORCLCDBXDB» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «ORCLCDB_DGMGRL» has 1 instance(s).

    Instance «ORCLCDB», status UNKNOWN, has 1 handler(s) for this service…

    Service «ac8d8d741e3e2a52e0534e38a8c0602d» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    Service «orclpdb1» has 1 instance(s).

    Instance «ORCLCDB», status READY, has 1 handler(s) for this service…

    The command completed successfully
  8. SYS oracle1.

    SQL> alter user sys identified by "pa_SSw0rd";
  9. oracle2 listener .

    [oracle@oracle2 ~]$ lsnrctl start

    [oracle@oracle2 ~]$ orapwd file=$ORACLE_BASE/product/19c/dbhome_1/dbs/orapwORCLCDB entries=10 password=pa_SSw0rd

    [oracle@oracle2 ~]$ echo "*.db_name='ORCLCDB'" > /tmp/initORCLCDB_STBY.ora

    [oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/oradata/ORCLCDB/pdbseed

    [oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/oradata/ORCLCDB/ORCLPDB1

    [oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/admin/ORCLCDB/adump

    [oracle@oracle2 ~]$ mkdir /opt/oracle/recovery_area

    [oracle@oracle2 ~]$ sqlplus / as sysdba

    SQL> STARTUP NOMOUNT PFILE='/tmp/initORCLCDB_STBY.ora'

    [oracle@oracle2 ~]$ rman TARGET sys/pa_SSw0rd@ORCLCDB AUXILIARY sys/pa_SSw0rd@ORCLCDB_STBY

    RMAN> DUPLICATE TARGET DATABASE FOR STANDBY من قاعدة البيانات النشطة DORECOVER SPFILE SET db_unique_name = 'ORCLCDB_STBY' COMMENT 'هو وضع الاستعداد' NOFILENAMECHECK ؛
  10. قم بتشغيل Data Guard على كلا الخادمين (oracle1 و oracle2).

    SQL> ALTER SYSTEM SET dg_broker_start = صحيح ؛
  11. على خادم oracle1 ، قم بالاتصال بوحدة التحكم في إدارة Data Guard وقم بإنشاء تكوين.

    [oracle @ oracle1 ~] $ dgmgrl sys / pa_SSw0rd @ ORCLCDB

    DGMGRL> إنشاء تكوين my_dg_config كقاعدة بيانات أساسية هي ORCLCDB معرّف الاتصال هو ORCLCDB ؛

    DGMGRL> إضافة قاعدة بيانات ORCLCDB_STBY نظرًا لأن معرف الاتصال هو ORCLCDB_STBY محفوظ على أنه مادي ؛

    DGMGRL> تمكين التكوين ؛




لذلك ، نتيجة لإنشاء نسخة متماثلة وتمكين Data Guard ، لدينا الحالة التالية:



DGMGRL> show configuration

Configuration - my_dg_config

  Protection Mode: MaxPerformance
  Members:
  orclcdb      - Primary database
    orclcdb_stby - Physical standby database 
      Warning: ORA-16854: apply lag could not be determined

Fast-Start Failover:  Disabled

Configuration Status:
WARNING   (status updated 40 seconds ago)


هذه حالة سيئة. دعنا ننتظر قليلا ...



DGMGRL> show configuration

Configuration - my_dg_config

  Protection Mode: MaxPerformance
  Members:
  orclcdb      - Primary database
    orclcdb_stby - Physical standby database 

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 55 seconds ago)


الآن الدولة جيدة! ومع ذلك ، فإن النسخة المتماثلة سلبية للغاية ، فهي لا تقبل طلبات القراءة (OPEN MODE: MOUNTED).



SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 
	 2 PDB$SEED			  MOUNTED
	 3 ORCLPDB1			  MOUNTED


لنجعل النسخة المتماثلة نشطة بحيث تقبل طلبات القراءة. ثم سنكون قادرين في المستقبل على تفريغ الخادم بالقاعدة "الأساسية". هذا هو ما يسمى "Active Data Guard" أو الاستعداد النشط . على خادم oracle2 ، قم بتنفيذ التسلسل التالي من الأوامر في sqlplus:

alter database 
      recover managed standby database cancel;


alter database open;


alter database 
      recover managed standby database 
      using current logfile 
      disconnect from session;


alter pluggable database all open;


الآن يمكنك القراءة من النسخة المتماثلة (OPEN MODE: READ ONLY):

SQL> show pdbs;

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 
	 2 PDB$SEED			  READ ONLY  NO
	 3 ORCLPDB1			  READ ONLY  NO


وفي وحدة تحكم DataGuard على خادم oracle1 ، يبدو كل شيء جيدًا:

DGMGRL> show configuration;

Configuration - my_dg_config

  Protection Mode: MaxPerformance
  Members:
  orclcdb      - Primary database
    orclcdb_stby - Physical standby database 

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 19 seconds ago)


على الرغم من حقيقة أن لدينا الآن Data Guard Active ، إلا أن الكتلة لا تزال سلبية إلى حد كبير. ما زال لا يقول كلمة واحدة لنا ولتطبيق Java المذهل لدينا أن Primary لم يعد أساسيًا. للقيام بذلك ، يجب تشغيل خدمة أخرى ، ONS (Oracle Notification Services) ، على خوادم الكتلة. ويبدو أن تثبيت Oracle Database لا يكفي لتشغيل هذه الخدمة ، سنحتاج إلى تثبيت Oracle Grid.







تثبيت وتكوين Oracle Grid.







كل شيء بسيط للغاية هنا: كما هو الحال في عملية تثبيت Oracle Database ، سنتبع التعليمات الرسمية ببساطة .



  1.   oracle1  oracle2 root    Oracle Grid, gcc-c++, oracle   asm.   Virtual Box, Oracle, Oracle Grid    .

    mkdir -p /opt/oracle/product/19c/grid \
            && cp -r /mnt/oracle_grid_19300/LINUX/* /opt/oracle/product/19c/grid/ \
            && chown -R oracle:oinstall /opt/oracle/product/19c/grid


    yum install -y gcc-c++


    groupadd asm && usermod -aG asm oracle


  2. ,   oracle, Oracle Grid.

    cd /opt/oracle/product/19c/grid/ && ./runcluvfy.sh stage -pre hacfg


    Verifying Physical Memory ...FAILED

    Required physical memory = 8GB

    Verifying Swap Size ...FAILED

    Required = 2.6924GB (2823138.0KB); Found = 2GB (2097148.0KB)]



      - ,     swap, Oracle Grid ,   .
  3. oracle2, oracle1.

    SQL> shutdown immediate


    # poweroff
  4. oracle1  8192 ,  VM   swap root.

    dd if=/dev/zero of=/swap_file bs=1G count=7 \
                && chmod 600 /swap_file && mkswap /swap_file \
                && echo '/swap_file  swap  swap  defaults  0 0' >> /etc/fstab \
                && swapoff -a && swapon -a
  5. , , .

    [oracle@oracle1 grid]$ cd /opt/oracle/product/19c/grid/ && ./runcluvfy.sh stage -pre hacfg

    Pre-check for Oracle Restart configuration was successful.


    ! Oracle Grid.
  6. oracle   oracle1  /opt/oracle/product/19c/grid/ grid_configwizard.rsp.

    cd /opt/oracle/product/19c/grid/ && touch grid_configwizard.rsp


    grid_configwizard.rsp , oracle restart, ASM   .

    oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0

    INVENTORY_LOCATION=/opt/oracle/oraInventory

    oracle.install.option=CRS_SWONLY

    ORACLE_BASE=/opt/oracle

    oracle.install.asm.OSDBA=oinstall

    oracle.install.asm.OSASM=asm

    oracle.install.asm.SYSASMPassword=oracle

    oracle.install.asm.diskGroup.name=data

    oracle.install.asm.diskGroup.redundancy=NORMAL

    oracle.install.asm.diskGroup.AUSize=4

    oracle.install.asm.diskGroup.disksWithFailureGroupNames=/dev/sdb

  7.   oracle grid   .

    ./gridSetup.sh -silent \
                   -responseFile /opt/oracle/product/19c/grid/grid_configwizard.rsp
  8.   , oracle grid root,   .

    /opt/oracle/product/19c/grid/root.sh
  9. , oracle restart root roothas.sh.

    cd /opt/oracle/product/19c/grid/crs/install/ && ./roothas.sh


  10.   oracle   runInstaller.

    cd /opt/oracle/product/19c/grid/oui/bin/ \
                                && ./runInstaller -updateNodeList \
                                    ORACLE_HOME=/opt/oracle/product/19c/grid \
                                    -defaultHomeName CLUSTER_NODES= CRS=TRUE
  11. oracle1 /etc/fstab , /swap_file, 2048 RAM.
  12. " Oracle Grid" VM oracle2.
  13. ,   ,   Oracle Restart.    oracle1 oracle     Oracle Restart.

    srvctl add database -db ORCLCDB \
                -oraclehome /opt/oracle/product/19c/dbhome_1 \
                -role PRIMARY


    /opt/oracle/product/19c/grid/bin/crsctl modify \
                res ora.cssd -attr "AUTO_START=always" -unsupported


    /opt/oracle/product/19c/grid/bin/crsctl stop has


    /opt/oracle/product/19c/grid/bin/crsctl start has
  14.   oracle2 oracle     Oracle Restart.

    /opt/oracle/product/19c/grid/bin/crsctl modify \
                res ora.cssd -attr "AUTO_START=always" -unsupported


    /opt/oracle/product/19c/grid/bin/crsctl stop has


    /opt/oracle/product/19c/grid/bin/crsctl start has


    srvctl add database -db ORCLCDB_STBY \
               -oraclehome /opt/oracle/product/19c/dbhome_1 \
               -role PHYSICAL_STANDBY \
               -spfile /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora \
               -dbname ORCLCDB -instance ORCLCDB
  15. على كلا الخادمين ، oracle1 و oracle2 ، أضف مستمعًا إلى تكوين Oracle Restart ضمن مستخدم oracle.

    srvctl add listener
  16. على خادم oracle1 ، تحت مستخدم oracle ، أضف إلى التكوين وابدأ خدمة قاعدة البيانات ، ORCLCDB.

    srvctl add service -db ORCLCDB -service orclpdb -l PRIMARY -pdb ORCLPDB1


    srvctl start service -db ORCLCDB -service orclpdb
  17. على خادم oracle2 تحت مستخدم oracle ، أضف خدمة قاعدة البيانات ، ORCLCDB_STBY إلى التكوين ، وابدأ طبعة قاعدة البيانات

    srvctl add service -db ORCLCDB_STBY -service orclpdb -l PRIMARY -pdb ORCLPDB1


    srvctl start database -db ORCLCDB_STBY
  18. على خادم oracle1 و oracle2 ، ابدأ خدمة ons.

    srvctl enable ons


    srvctl start ons




عرض "التبديل" على تطبيق اختبار Java







نتيجة لذلك ، لدينا خادمان أوراكل مع النسخ المتماثل في وضع الاستعداد النشط وخدمة ons التي سيتم إرسال أحداث التبديل إليها ، وسيكون تطبيق Java قادرًا على معالجة هذه الأحداث بمجرد وصولها.



لنقم بإنشاء مستخدم وجدول اختبار في Oracle.
  oracle1 oracle   sqlplus  

  • sqlplus / as sysdba
  • alter session set container=ORCLPDB1;
  • CREATE USER testus 
           IDENTIFIED BY test 
           DEFAULT TABLESPACE USERS 
           QUOTA UNLIMITED ON USERS;
  • GRANT CONNECT, 
          CREATE SESSION, 
          CREATE TABLE 
          TO testus;
  • CREATE TABLE TESTUS.MESSAGES (TIMEDATE TIMESTAMP, MESSAGE VARCHAR2(100));




بعد إنشاء مستخدم وجدول اختبار ، نقوم بالاتصال بخادم oracle2 و "نفتح" المثيل للقراءة للتأكد من عمل النسخ المتماثل.

 
 [oracle@oracle2 ~]$ sqlplus / as sysdba
 SQL> alter pluggable database all open;
 SQL> alter session set container=ORCLPDB1;
 SQL> column table_name format A10;
 SQL> column owner format A10;
 SQL> select table_name, owner from dba_tables where owner like '%TEST%';

TABLE_NAME OWNER
---------- ----------
MESSAGES   TESTUS


يتكون تطبيق الاختبار من فئة رئيسية واحدة فقط ، ويحاول في حلقة إضافة سجل إلى جدول الاختبار ، ثم قراءة نفس السجل (انظر أساليب "putNewMessage ()" و "getLastMessage ()"). هناك أيضًا طريقة "getConnectionHost ()" ، والتي تحصل من كائن "الاتصال" باستخدام "واجهة برمجة تطبيقات الانعكاس" على عنوان IP للاتصال بقاعدة البيانات. كما ترى في وحدة التحكم ، بعد "التبديل" يتغير هذا العنوان.



قم بتشغيل تطبيق الاختبار وتنفيذ "التبديل" في وحدة تحكم Data Guard.



DGMGRL> switchover to orclcdb_stby;


نرى كيف يتغير عنوان IP الخاص بالاتصال في سجل التطبيق ، ووقت التوقف هو دقيقة واحدة:



[Wed Aug 26 23:56:55 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:55|  ?
[Wed Aug 26 23:56:56 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:56|  ?
[Wed Aug 26 23:56:57 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:57|  ?
[Wed Aug 26 23:56:58 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:02 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:06 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:10 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:14 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:18 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:23 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:27 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:31 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:35 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:39 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:43 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:47 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:57:51 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:52|  ?
[Wed Aug 26 23:57:53 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:53|  ?
[Wed Aug 26 23:57:54 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:54|  ?


العودة مرة أخرى للتأكد.



DGMGRL> switchover to orclcdb;


الوضع متماثل.



[Wed Aug 26 23:58:54 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:58:54|  ?
[Wed Aug 26 23:58:55 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:58:55|  ?
[Wed Aug 26 23:58:56 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:00 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:04 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:08 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:12 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:16 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:20 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:24 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:28 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:32 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:36 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:40 MSK 2020]: SQLException: -  !
[Wed Aug 26 23:59:44 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:59:45|  ?
[Wed Aug 26 23:59:46 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:59:46|  ?


أيضًا ، دعنا ننتبه إلى اتصالات TCP على مضيفي oralce1 و oracle2. منفذ البيانات مشغول بالاتصالات فقط على المنفذ الأساسي ، ومنفذ ONS مشغول على كل من النسخة الأساسية والنسخة المتماثلة.



قبل التحول.

oracle1
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22"

ESTAB 0 0 192.168.56.78:1521 192.168.56.1:49819 users:(("oracle_21115_or"...))
ESTAB 0 0 192.168.56.78:1521 192.168.56.1:49822 users:(("oracle_21117_or"...))
ESTAB 0 0 [::ffff:192.168.56.78]:6200 [::ffff:192.168.56.1]:49820 users:(("ons"...))



oracle2
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22"

ESTAB 0 0 [::ffff:192.168.56.79]:6200 [::ffff:192.168.56.1]:49821 users:(("ons"...))


بعد التحول.

oracle1
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v 22  Wed Aug 26 16:57:57 2020

ESTAB 0 0 [::ffff:192.168.56.78]:6200 [::ffff:192.168.56.1]:51457 users:(("ons"...))



oracle2
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22" Wed Aug 26 16:58:35 2020

ESTAB 0 0 192.168.56.79:1521 192.168.56.1:52259 users:(("oracle_28212_or"...))
ESTAB 0 0 192.168.56.79:1521 192.168.56.1:52257 users:(("oracle_28204_or"...))
ESTAB 0 0 [::ffff:192.168.56.79]:6200 [::ffff:192.168.56.1]:51458 users:(("ons"...))


خاتمة



وبالتالي ، قمنا بمحاكاة مجموعة Data Guard في بيئة معملية بأقل عدد من الإعدادات وقمنا بتنفيذ اتصال تجاوز الفشل لتطبيق Java التجريبي. الآن نحن نعرف ما يريده المطور من DBA ، و DBA من المطور. يبقى إطلاق Fast Start Failover واختباره ، ولكن ربما في إطار مقالة منفصلة.



All Articles