Menggunakan Oracle Direct NFS dengan Pencadangan dan DR

Untuk menggunakan Oracle Direct NFS (dNFS) dengan appliance pencadangan/pemulihan, persyaratan berikut harus dipenuhi:

  • Bandwidth jaringan yang memadai antara server database dan appliance pencadangan/pemulihan

  • Gunakan semua patch Oracle yang diperlukan atau direkomendasikan. Oracle mengelola daftar patch yang diperlukan atau direkomendasikan dalam dokumentasi Dukungan Oracle.

Mengonfigurasi konsol pengelolaan untuk melindungi dan memasang database Oracle virtual melalui dNFS

Untuk melakukan pencadangan berbasis dNFS, Anda harus menetapkan format disk staging appliance pencadangan/pemulihan (preferensi disk) ke NFS.

Gunakan petunjuk ini untuk menetapkan format disk staging (preferensi disk) ke NFS:

  1. Buka Kelola > Host.

  2. Klik kanan host, lalu pilih Edit.

  3. Pada format disk staging, pilih NFS, lalu klik Save.

Tindakan yang akan dilakukan pada host target agar dNFS berfungsi

Lakukan tindakan berikut untuk memastikan dNFS dikonfigurasi dengan benar:

  1. Periksa pesan berikut di bagian DB Alert.log untuk mengonfirmasi bahwa dNFS diaktifkan:

    Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.01.
    

    Jika dNFS tidak diaktifkan, aktifkan:

    • Paket klien NFS harus ada di host database untuk tugas perlindungan, dan di host Oracle tempat Anda dapat memasang database Oracle yang diambil menggunakan dNFS. Misalnya, untuk Linux, paket nfs-util harus ada di host. Periksa dengan hal berikut:

      rpm -qa |grep nfs-util

    • Aktifkan dNFS di host Oracle:

      cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk dnfs_on

    • Mulai ulang database yang berjalan di ORACLE_HOME tersebut, lalu periksa pesan berikut di bagian DB Alert.log untuk mengonfirmasi bahwa dNFS diaktifkan:

      Instance Oracle yang berjalan dengan ODM: Oracle Direct NFS ODM Library Versi 3.0

  2. Selama tugas pencadangan, jalankan kueri berikut untuk memeriksa penggunaan dNFS:

    select * from gv$dnfs_servers;
    

    Anda dapat melihat statistik baca/tulis NFS untuk I/O yang terjadi:

    select inst_id, PNUM, NFS_READ, NFS_WRITE, NFS_COMMIT, NFS_MOUNT from
    gv$dnfs_stats where NFS_READ>0 or NFS_WRITE>0 order by inst_id, PNUM;
    

    Kita dapat melihat informasi proses saluran dnfs.

    select c.inst_id, program, pid,pname, local, path from gv$process p,
    gv$dnfs_channels c where p.inst_id = c.inst_id and c.pnum = p.pid;
    

Memecahkan masalah dNFS: Masalah database

Hal ini mencakup:

Log pemberitahuan

Perhentian pertama untuk operasi debug adalah memeriksa log pemberitahuan untuk pesan terkait dNFS. Masalah umum yang diamati pada database dengan dNFS adalah ukuran buffering soket yang terbatas. Oracle mencoba menyesuaikan ukuran, tetapi hal ini dapat dibatasi oleh O/S. Dalam hal ini, error seperti ini ditemukan di log pemberitahuan:

    Direct NFS: Failed to set socket buffer size.wtmax=[1048576]\
    rtmax=[1048576], errno=-1

Item lain yang harus dicari dalam log pemberitahuan mencakup apakah kartu jaringan yang benar digunakan untuk berkomunikasi dengan filer. Hal ini dapat ditentukan dengan mencari pesan yang mirip dengan yang berikut ini:

    Direct NFS: channel id [0] path [192.168.56.3] to filer [192.168.56.3] via local [] is UP

File rekaman aktivitas database

Jika masalah I/O terjadi, peristiwa berikut dapat ditetapkan di database untuk mengambil informasi logging tambahan. Tetapkan peristiwa ini, tunggu insiden terjadi, lalu tinjau untuk melacak file.

    ALTER SYSTEM SET MAX_DUMP_FILE_SIZE =UNLIMITED;
    ALTER SYSTEM SET EVENTS '10298 trace name context forever, level 1'; # KSFD I/O tracing
    ALTER SYSTEM SET EVENTS '19392 trace name context forever, level 8'; # kgnfs tracing
    ALTER SYSTEM SET EVENTS '19394 trace name context forever, level 8'; # skgnfs tracing
    ALTER SYSTEM SET EVENTS '19396 trace name context forever, level 6'; # kgodm tracing
    ALTER SYSTEM SET EVENTS '19398 trace name context forever, level 128'; # mount tracing errors

Database tidak merespons

Jika database yang berjalan di dNFS tidak merespons, login sebagai SYSDBA menggunakan sqlplus dan lakukan 'hanganalyze' atau dump:

    ```oradebug
    oradebug setmypid
    oradebug unlimited
    oradebug hanganalyze 3
    oradebug dump systemstate 266
    ```

Jika database adalah database RAC, tambahkan opsi -g ke dua perintah oradebug terakhir.

Tampilan dNFS

Klien dNFS sebenarnya berada di kernel database. Oleh karena itu, beberapa tampilan v$ ada dalam database untuk memantau dan memeriksa kondisi dNFS dari dalam database. Oracle menyediakan paket yang dapat digunakan untuk memantau performa dNFS dengan cepat. Paket ini ada dalam paket monitor dNFS Oracle.

Setelah di-deploy, DBA dapat melakukan hal berikut untuk mendapatkan informasi (parameter: dnfs_monitor(sleep time), dnfs_itermonitor (sleep time,number of times to check), sleep time is in seconds):

    SQL> set serveroutput on
    SQL> set lines 200
    SQL> exec dnfs_monitor(60);
    Started at  01/18/2017 10:09:46 AM
    Finished at 01/18/2017 10:10:46 AM
    READ IOPS:                 2
    WRITE IOPS:                3
    TOTAL IOPS:                5
    READ Throughput:           0 MB/s
    WRITE Throughput:          0 MB/s
    TOTAL Throughput:          0 MB/s
    SQL> exec dnfs_itermonitor(2,10)
    Started at 01/18/2017 10:20:18 AM
    TIMESTAMP              READ IOPS  WRITE IOPS  TOTAL IOPS  READ(MB/s)  WRITE (MB/s) TOTAL (MB/s)

    01/18/2017 10:20:20 AM  15         7          22           0            0           0

    01/18/2017 10:20:22 AM   2         3          5            0            0           0

    01/18/2017 10:20:24 AM   0         3          3            0            0           0

    01/18/2017 10:20:26 AM   2         2          4            0            0           0

    01/18/2017 10:20:28 AM   0         3          3            0            0           0

    01/18/2017 10:20:30 AM   2         3          5            0            0           0

    01/18/2017 10:20:32 AM   4         3          7            0            0           0

    01/18/2017 10:20:34 AM   0         3          3            0            0           0

    01/18/2017 10:20:36 AM   2         3          5            0            0           0

    01/18/2017 10:20:38 AM   2         3          5            0            0           0

    Finished at 01/18/2017 10:20:38 AM

Tampilan V$ adalah:

  • V$DNFS_SERVER: Menampilkan informasi untuk semua koneksi server NFS (satu untuk setiap server NFS). Tampilan berguna untuk memverifikasi setelan koneksi dan soket TCP.

  • V$DNFS_CHANNELS: Menampilkan informasi untuk semua jalur jaringan yang dibuat ke server NFS. Setiap klien dNFS membuat satu saluran per proses per jalur jaringan. Jika ada beberapa jalur (beberapa NIC), klien dNFS akan melakukan load balancing di semua saluran. Data mencerminkan aktivitas sejak pemilihan terakhir.

  • V$DNFS_FILES: Menampilkan file yang terbuka menggunakan klien dNFS.

  • V$DNFS_STAT: Metrik performa untuk klien dNFS.

V$DNFS_SERVER
Kolom Deskripsi
SRVNAME Nama Server NFS
DIRNAME Volume yang diekspor oleh server NFS
MNTPORT Port pemasangan lokal
NFSPORT Port server NFS
WTMAX Ukuran tulis maksimum untuk server NFS
RTMAX Ukuran baca maksimum untuk server NFS
V$DNFS_CHANNELS
Kolom Deskripsi
PNUM Nomor proses Oracle (link ke PID di v$process)
SVRNAME Nama server NFS
PATH Jalur jaringan ke server
CH_ID ID saluran dNFS
SVR_ID ID server dNFS
SENDS Mengirim operasi melalui saluran sejak terakhir kali dipilih.
RECVS Menerima operasi melalui saluran sejak terakhir dipilih.
PINGS Operasi ping melalui saluran sejak terakhir dipilih.
V$DNFS_FILES
Kolom Deskripsi
FILENAME Nama file.
FILESIZE Ukuran file.
PNUM ID Proses (link ke PID di v$process)
SRV_ID ID server NFS
V$DNFS_STAT
Kolom Deskripsi
PNUM Nomor proses Oracle (link ke PID di v$process)
NFS_NULL Null operations
NFS_GETATTR Mendapatkan operasi atribut
NFS_SETATTR Menetapkan operasi atribut
NFS_LOOKUP Operasi pencarian
NFS_ACCESS Operasi akses
NFS_READLINK Membaca operasi link
NFS_READ Operasi baca
NFS_WRITE Operasi tulis
NFS_CREATE Membuat operasi
NFS_MKDIR Membuat operasi direktori
NFS_MKNOD Membuat operasi node
NFS_SYMLINK Operasi link simbolis
NFS_REMOVE Menghapus operasi
NFS_RMDIR Menghapus operasi direktori
NFS_RENAME Mengganti nama operasi
NFS_LINK Operasi penautan
NFS_READDIR Membaca operasi direktori
NFS_READDIRPLUS Operasi baca direktori plus
NFS_FSSTAT Operasi status sistem file
NFS_FSINFO Operasi informasi sistem file
NFS_PATHCONF Operasi konfigurasi jalur
NFS_COMMIT Operasi commit
NFS_MOUNT Operasi pemasangan

Paket monitor dNFS Oracle

    CREATE OR REPLACE PROCEDURE dnfs_monitor
       (sleepSecs IN NUMBER)
    IS
       startTime       DATE;
       startReadIOPS   NUMBER;
       startWriteIOPS  NUMBER;
       startReadBytes  NUMBER;
       startWriteBytes NUMBER;
       endTime         DATE;
       endReadIOPS     NUMBER;
       endWriteIOPS    NUMBER;
       endReadBytes    NUMBER;
       endWriteBytes   NUMBER;
       readThr         NUMBER;
       writeThr        NUMBER;
       readIOPS        NUMBER;
       writeIOPS       NUMBER;
       elapsedTime     NUMBER;
    BEGIN

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes),
    SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO startTime, startReadBytes, startWriteBytes, startReadIOPS, startWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_OUTPUT.PUT_LINE('Started at  ' || TO_CHAR(startTime,'MM/DD/YYYY HH:MI:SS AM'));

       DBMS_LOCK.SLEEP(sleepSecs);

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO endTime, endReadBytes, endWriteBytes, endReadIOPS, endWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_OUTPUT.PUT_LINE('Finished at ' || to_char(endTime,'MM/DD/YYYY HH:MI:SS AM'));

       elapsedTime := (endTime - startTime) * 86400;
       readThr := (endReadBytes - startReadBytes)/(1024 * 1024 * elapsedTime);
       writeThr := (endWriteBytes - startWriteBytes)/(1024 * 1024 * elapsedTime);
       readIOPS := (endReadIOPS - startReadIOPS)/elapsedTime;
       writeIOPS := (endWriteIOPS - startWriteIOPS)/elapsedTime;

       DBMS_OUTPUT.PUT_LINE('READ IOPS:        ' || LPAD(TO_CHAR(readIOPS, '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('WRITE IOPS:       ' || LPAD(TO_CHAR(writeIOPS,
       '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('TOTAL IOPS:       ' || LPAD(TO_CHAR(readIOPS + writeIOPS, '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('READ Throughput:  ' || LPAD(TO_CHAR(readThr, '999999999'), 10, ' ') || ' MB/s');
       DBMS_OUTPUT.PUT_LINE('WRITE Throughput: ' || LPAD(TO_CHAR(writeThr,
       '999999999'), 10, ' ') || ' MB/s');
       DBMS_OUTPUT.PUT_LINE('TOTAL Throughput: ' || LPAD(TO_CHAR(readThr + writeThr, '999999999'), 10, ' ') || ' MB/s');
       END;
    /

    CREATE OR REPLACE PROCEDURE dnfs_itermonitor
       (sleepSecs IN NUMBER,
        iter      IN NUMBER)
    IS
       startTime       DATE;
       startReadIOPS   NUMBER;
       startWriteIOPS  NUMBER;
       startReadBytes  NUMBER;
       startWriteBytes NUMBER;
       endTime         DATE;
       endReadIOPS     NUMBER;
       endWriteIOPS    NUMBER;
       endReadBytes    NUMBER;
       endWriteBytes   NUMBER;
       readThr         NUMBER;
       writeThr        NUMBER;
       readIOPS        NUMBER;
       writeIOPS       NUMBER;
       i               NUMBER;
       elapsedTime     NUMBER;
    BEGIN

       DBMS_OUTPUT.PUT_LINE('Started at ' || TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM'));

       DBMS_OUTPUT.PUT_LINE(
           LPAD('TIMESTAMP', 15, ' ')||
           LPAD('READ IOPS', 33, ' ')||
           LPAD('WRITE IOPS', 15, ' ')||
           LPAD('TOTAL IOPS', 15, ' ')||
           LPAD('READ (MB/s)', 15, ' ')||
           LPAD('WRITE (MB/s)', 15, ' ')||
           LPAD('TOTAL (MB/s)', 15, ' '));

       FOR i IN 1..iter
       LOOP
       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO startTime, startReadBytes, startWriteBytes, startReadIOPS, startWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_LOCK.SLEEP(sleepSecs);

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO endTime, endReadBytes, endWriteBytes, endReadIOPS, endWriteIOPS
       FROM dual, v$dnfs_stats stats;

       elapsedTime := (endTime - startTime) * 86400;
       readThr := (endReadBytes-startReadBytes)/(1024 * 1024 * elapsedTime);
       writeThr := (endWriteBytes-startWriteBytes)/(1024 * 1024 * elapsedTime);
       readIOPS := (endReadIOPS - startReadIOPS)/elapsedTime;
       writeIOPS := (endWriteIOPS - startWriteIOPS)/elapsedTime;

       DBMS_OUTPUT.PUT_LINE(
           TO_CHAR(endTime, 'MM/DD/YYYY HH:MI:SS AM')||
           LPAD(TO_CHAR(readIOPS, '999999999'), 15, '') ||
           LPAD(TO_CHAR(writeIOPS, '999999999'), 15,' ') ||
           LPAD(TO_CHAR(readIOPS + writeIOPS, '999999999'),15, ' ') ||
           LPAD(TO_CHAR(readThr, '999999999'), 15, '') ||LPAD(TO_CHAR(writeThr, '999999999'), 15, '
    ') ||
    LPAD(TO_CHAR(readThr + writeThr, '999999999'), 15, ' '));
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Finished at ' || to_char(endTime, 'MM/DD/YYYY HH:MI:SS AM'));

    END;

Panduan DBA Oracle