Menggunakan Oracle Direct NFS dengan Pencadangan dan DR

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

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

  • Gunakan semua patch yang diperlukan atau direkomendasikan Oracle. 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 menyetel format disk penahapan alat pencadangan/pemulihan (preferensi disk) ke NFS.

Gunakan petunjuk ini untuk menyetel format disk penyiapan (preferensi disk) ke NFS:

  1. Buka Kelola > Host.

  2. Klik kanan host, lalu pilih Edit.

  3. Pada format disk penyiapan, pilih NFS, lalu klik Simpan.

Tindakan yang harus dilakukan di 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 belum 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 hal-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 Version 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 sedang 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 channel 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 notifikasi

Langkah pertama untuk setiap operasi debug adalah memeriksa log pemberitahuan untuk pesan terkait dNFS. Masalah umum yang diamati pada database dengan dNFS adalah ukuran buffer 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 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 dalam database untuk merekam informasi logging tambahan. Tetapkan peristiwa ini, tunggu hingga 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 ada di kernel database. Oleh karena itu, ada beberapa tampilan v$ 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 di paket monitor dNFS Oracle.

Setelah di-deploy, DBA dapat melakukan hal berikut untuk mendapatkan informasi (parameter: dnfs_monitor(waktu tidur), dnfs_itermonitor (waktu tidur,jumlah waktu untuk memeriksa), waktu tidur dalam detik):

    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 ini berguna untuk memverifikasi konektivitas dan setelan 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 dibuka 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 (ditautkan ke PID di v$process)
SVRNAME Nama server NFS
PATH Jalur jaringan ke server
CH_ID ID channel dNFS
SVR_ID ID server dNFS
SENDS Mengirim operasi melalui saluran sejak terakhir 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 (ditautkan ke PID di v$process)
SRV_ID ID server NFS
V$DNFS_STAT
Kolom Deskripsi
PNUM Nomor proses Oracle (ditautkan ke PID di v$process)
NFS_NULL Null operations
NFS_GETATTR Mendapatkan operasi atribut
NFS_SETATTR Tetapkan 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 Melakukan 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 link
NFS_READDIR Operasi baca direktori
NFS_READDIRPLUS Operasi baca dan plus direktori
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