همانطور که می دانید، زمانی که دیتابیس در حالت read only قرار دارد امکان ثبت اطلاعات در جداول دیتادیکشنری از بین خواهد رفت این قاعده برای جداول مربوط به auditing(نظیر aud$unified) هم صادق است از اینرو نمی توان عملیات انجام شده توسط کاربران را در دیتابیس ذخیره کرد.
در این شرایط، در صورت استفاده از قابلیت Unified auditing، اوراکل auditهای انجام شده را در محیط سیستم عامل ثبت خواهد کرد.
عملیات انجام شده توسط کاربران در قالب فایلهای باینری، با پسوند bin. و در مسیر ORACLE_BASE/audit/$ORACLE_SID$ ثبت خواهند شد و امکان مشاهده محتویات این فایلهای باینری از طریق ویوی unified_audit_trail فراهم می شود.
برای مثال، در محیط دیتاگارد، از طریق کاربر usef پرس و جویی را اجرا می کنیم و این مسئله را مورد بررسی قرار می دهیم:
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
—————- ——————–
PHYSICAL STANDBY READ ONLY WITH APPLY
SQL> conn usef/a
Connected.
SQL> select count(*) from usef.mytbl;
COUNT(*)
———-
4
SQL>/
COUNT(*)
———-
4
با اجرای دستور فوق، فایل زیر در مسیر بیان شده ایجاد خواهد شد:
[oracle@ol6 ~]$ cd $ORACLE_BASE/audit/$ORACLE_SID
[oracle@ol6 stb]$ ls -l
-rw——-. 1 oracle oinstall 2048 Jul 5 13:51 ora_audit_01249.bin
با رجوع به ویوی unified_audit_trail، محتویات ثبت شده در این فایل را مشاهده خواهید کرد:
SQL> select d.userhost,to_char(substr(d.sql_text,1,30)) sql_text from unified_audit_trail d where d.dbusername=’USEF’ and sql_text is not null;
بدیهی است که در صورت جابجا کردن سیستم عاملی این فایل، ویوی unified_audit_trail اطلاعات قبلی را نمایش نمی دهد:
[oracle@ol6 ~]$ mv /19c/base/audit/stb/ora_audit_01249.bin /home/oracle/
SQL> select d.userhost,to_char(substr(d.sql_text,1,30)) sql_text from unified_audit_trail d where d.dbusername=’USEF’ and sql_text is not null;
no rows selected
و همچنین با اجرای پروسیجر clean_audit_trail از بسته dbms_audit_mgmt محتویات این فایل از بین خواهد رفت:
[oracle@ol6 ~]$ cp /home/oracle/ora_audit_01249.bin /19c/base/audit/stb/
SQL> select d.userhost,to_char(substr(d.sql_text,1,30)) sql_text from unified_audit_trail d where d.dbusername=’USEF’ and sql_text is not null;
SQL> exec dbms_audit_mgmt.clean_audit_trail(audit_trail_type=>dbms_audit_mgmt.audit_trail_unified,use_last_arch_timestamp=>false);
PL/SQL procedure successfully completed.
SQL> select d.userhost,to_char(substr(d.sql_text,1,30)) sql_text from unified_audit_trail d where d.dbusername=’USEF’ and sql_text is not null;
USERHOST SQL_TEXT
———- —————————————-
ol6 BEGIN dbms_audit_mgmt.clean_au
توجه: این دستورات در محیط دیتا گارد اجرا شده اند.
در صورتی که قصد داشته باشیم اطلاعات ثبت شده در فایلهای *.bin را در جدول aud$unified ثبت کنیم، می توان فایلها را به سرور primary منتقل کرده و سپس پروسیجر LOAD_UNIFIED_AUDIT_FILES از بسته DBMS_AUDIT_MGMT را اجرا کنیم:
[oracle@ol6 ~]$ scp /home/oracle/ora_audit_01249.bin ol7:/19c/base/audit/db19c
SQL> exec DBMS_AUDIT_MGMT.LOAD_UNIFIED_AUDIT_FILES;
PL/SQL procedure successfully completed.
SQL> select d.userhost,to_char(substr(d.sql_text,1,30)) sql_text from unified_audit_trail d where d.dbusername=’USEF’ and sql_text is not null;
با اجرای دستور فوق، نیازی به فایل باینری نخواهیم داشت و اطلاعات در دیتابیس ذخیره خواهند شد:
[oracle@ol7 ~]$ rm -rf /19c/base/audit/db19c/*
این عملیات برای کاربر sys هم قابل انجام هستند.