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:
Buka Kelola > Host.
Klik kanan host, lalu pilih Edit.
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:
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
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.
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 |
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. |
Kolom | Deskripsi |
---|---|
FILENAME
|
Nama file. |
FILESIZE
|
Ukuran file. |
PNUM
|
ID Proses (link ke PID di v$process) |
SRV_ID
|
ID server NFS |
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;