Tuesday, October 18, 2016

How to collect all SQL statement executed by Schema.

1. Set AUDIT_TRAIL parameter value db (Default) so that audit information will written into database (SYS.AUD$).
2. Create Schema and define audit policy.
3. Create and Enable fine grained auditing.
4. Collect all SQL Statement from sys.FGA_LOG$ table.
5. Purge all Audit information.
6. Drop fine grained auditing.
7. Scripts for enable fine grained auditing for all objects of schema.

1. 
SQL> show parameter audit_trail

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_trail                          string      DB
SQL>

2.
GRANT CONNECT, RESOURCE, DBA TO AUDIT_USER IDENTIFIED BY AUDIT_USER;

AUDIT ALL BY AUDIT_USER BY ACCESS;
AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY AUDIT_USER BY ACCESS;
AUDIT EXECUTE PROCEDURE BY AUDIT_USER BY ACCESS;
3.
--- Create Fine Grained Auditing
BEGIN
  DBMS_FGA.ADD_POLICY(
    OBJECT_SCHEMA   => 'AUDIT_USER',
    OBJECT_NAME     => 'TEST_DATA',
    POLICY_NAME     => 'AUDIT_USER_P',
    AUDIT_CONDITION => NULL,
    AUDIT_COLUMN    => NULL,
    STATEMENT_TYPES => 'SELECT,INSERT,UPDATE,DELETE');
END;
--- Enable Fine Grained Auditing
BEGIN

DBMS_FGA.ENABLE_POLICY (
OBJECT_SCHEMA    =>  'AUDIT_USER',
OBJECT_NAME      =>  'TEST_DATA',
POLICY_NAME      =>  'AUDIT_USER_P',
ENABLE           =>   TRUE);

END;

4.
--- Find all SQL Statement using the following Query. You can also store all SQL Statement in your own table using the Second query.

SELECT LSQLTEXT, LSQLBIND,NTIMESTAMP#
FROM FGA_LOG$;

CREATE TABLE SQL_STATEMENT
AS
SELECT LSQLTEXT, LSQLBIND,NTIMESTAMP#
FROM FGA_LOG$;

SELECT *
FROM FGA_LOG$;

5. 
--- Auditing information can be purge by truncate SYS.AUD$ and sys.FGA_LOG$ table. This is manual purge. Automated purge policy can define so that Oracle will automatically purge all audit information by using scheduler.

TRUNCATE TABLE SYS.AUD$ ;
TRUNCATE TABLE sys.FGA_LOG$;

6. 
BEGIN
  DBMS_FGA.drop_policy(
    object_schema   => 'AUDIT_USER',
    object_name     => 'TEST_DATA',
    policy_name     => 'AUDIT_USER_P');
END;

7. 
CREATE OR REPLACE PROCEDURE SP_AUDIT_SCHEMA_ACTIVITY (
   P_IN_SCHEMA_NAME IN VARCHAR2)
IS
   W_POLICY_NAME   VARCHAR2 (100);

   CURSOR CUR_TABLE_LIST
   IS
      SELECT OWNER, TABLE_NAME
        FROM ALL_TABLES
       WHERE OWNER = P_IN_SCHEMA_NAME;

BEGIN
   FOR IDX IN CUR_TABLE_LIST
   LOOP
      W_POLICY_NAME := IDX.OWNER || '_' || IDX.TABLE_NAME;
   
      IF LENGTH(W_POLICY_NAME)>30 THEN
       W_POLICY_NAME:=IDX.TABLE_NAME;
      END IF;

      BEGIN
         DBMS_FGA.ADD_POLICY (
            OBJECT_SCHEMA     => IDX.OWNER,
            OBJECT_NAME       => IDX.TABLE_NAME,
            POLICY_NAME       => W_POLICY_NAME,
            AUDIT_CONDITION   => NULL,
            AUDIT_COLUMN      => NULL,
            STATEMENT_TYPES   => 'SELECT,INSERT,UPDATE,DELETE');
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.PUT_LINE (W_POLICY_NAME||' >> '||SQLERRM);
      END;


      BEGIN
         DBMS_FGA.ENABLE_POLICY (OBJECT_SCHEMA   => IDX.OWNER,
                                 OBJECT_NAME     => IDX.TABLE_NAME,
                                 POLICY_NAME     => W_POLICY_NAME,
                                 ENABLE          => TRUE);
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.PUT_LINE (W_POLICY_NAME||' >> '||SQLERRM);
      END;
   END LOOP;
END;

CREATE OR REPLACE PROCEDURE SP_DROP_AUDIT_POLICY (
   P_IN_SCHEMA_NAME IN VARCHAR2)
IS
   W_POLICY_NAME   VARCHAR2 (100);

   CURSOR CUR_POLICY_LIST
   IS
      SELECT OBJECT_SCHEMA, OBJECT_NAME, POLICY_NAME
        FROM DBA_AUDIT_POLICIES
       WHERE OBJECT_SCHEMA = P_IN_SCHEMA_NAME;

BEGIN
   FOR IDX IN CUR_POLICY_LIST
   LOOP
      W_POLICY_NAME := IDX.POLICY_NAME;

      BEGIN
         DBMS_FGA.drop_policy (object_schema   => IDX.OBJECT_SCHEMA,
                               object_name     => IDX.OBJECT_NAME,
                               policy_name     => W_POLICY_NAME);
      END;
   END LOOP;
END;


EXEC SP_AUDIT_SCHEMA_ACTIVITY('SCHEMA_NAME');

EXEC SP_DROP_AUDIT_POLICY('SCHEMA_NAME');

Reference

https://oracle-base.com/articles/10g/auditing-10gr2

https://oracle-base.com/articles/11g/auditing-enhancements-11gr2

Monday, October 17, 2016

RMAN Compress Backup Archivelog and Full Database

Archivelog Backup:

backup AS COMPRESSED BACKUPSET  archivelog all delete all input tag ORCL_ARCHIVE format '/u01/backup/rman/%d_%T_%s_%p_ARCHIVE';

Full Database and Archivelog Backup:

RUN
{
configure controlfile autobackup on;
set command id to 'ORCLOnlineBackupFull';
ALLOCATE CHANNEL c1 DEVICE TYPE disk;
ALLOCATE CHANNEL c2 DEVICE TYPE disk;
ALLOCATE CHANNEL c3 DEVICE TYPE disk;
ALLOCATE CHANNEL c4 DEVICE TYPE disk;
backup AS COMPRESSED BACKUPSET full database tag ORCL_FULL format '/u01/backup/rman/%d_%T_%s_%p_FULL' ;
sql 'alter system archive log current';
backup AS COMPRESSED BACKUPSET  archivelog all delete all input tag ORCL_ARCHIVE format '/u01/backup/rman/%d_%T_%s_%p_ARCHIVE';
backup tag ORCL_CONTROL current controlfile format '/u01/backup/rman/%d_%T_%s_%p_CONTROL';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}


[oracle@OEL564ASMN1 rman]$ rman target/

Recovery Manager: Release 11.2.0.3.0 - Production on Tue Oct 18 13:48:20 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ASMDB (DBID=624768357)

RMAN> backup AS COMPRESSED BACKUPSET  archivelog all delete all input tag ORCL_ARCHIVE format '/u01/backup/rman/%d_%T_%s_%p_ARCHIVE';

Starting backup at 18-OCT-16
current log archived
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=41 device type=DISK
channel ORA_DISK_1: starting compressed archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=37 RECID=35 STAMP=925050761
input archived log thread=1 sequence=38 RECID=36 STAMP=925566466
input archived log thread=1 sequence=39 RECID=37 STAMP=925566511
channel ORA_DISK_1: starting piece 1 at 18-OCT-16
channel ORA_DISK_1: finished piece 1 at 18-OCT-16
piece handle=/u01/backup/rman/ASMDB_20161018_24_1_ARCHIVE tag=ORCL_ARCHIVE comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:05
channel ORA_DISK_1: deleting archived log(s)
archived log file name=+FRA/asmdb/archivelog/2016_10_12/thread_1_seq_37.362.925050753 RECID=35 STAMP=925050761
archived log file name=+FRA/asmdb/archivelog/2016_10_18/thread_1_seq_38.358.925566461 RECID=36 STAMP=925566466
archived log file name=+FRA/asmdb/archivelog/2016_10_18/thread_1_seq_39.354.925566507 RECID=37 STAMP=925566511
Finished backup at 18-OCT-16

Starting Control File and SPFILE Autobackup at 18-OCT-16
piece handle=+FRA/asmdb/autobackup/2016_10_18/s_925566523.354.925566523 comment=NONE
Finished Control File and SPFILE Autobackup at 18-OCT-16

RMAN> exit


Recovery Manager complete.
[oracle@OEL564ASMN1 rman]$

Thursday, October 13, 2016

Modify the default Scheduler Window

resmgr:cpu quantum : This wait event indicate that The session is waiting to be allocated a quantum of cpu. This event occurs when the resource manager is enabled and is throttling CPU consumption. 

Solution : Check the status of Resource manager if it is running stop and configure Scheduler Window as per your idle database time.

SELECT WINDOW_NAME,
 RESOURCE_PLAN,
 ENABLED,
 CAST (LAST_START_DATE AS TIMESTAMP) LAST_START_DATE,
 CAST (NEXT_START_DATE AS TIMESTAMP) NEXT_START_TIME,
   EXTRACT (DAY FROM DURATION) * 24 * 60
 + EXTRACT (HOUR FROM DURATION) * 60
 + EXTRACT (MINUTE FROM DURATION) DURATION,
 ACTIVE,
 COMMENTS
FROM ALL_SCHEDULER_WINDOWS
ORDER BY NEXT_START_DATE;

The output of this query :


It is configured based on US holiday standard but is some different country like Bangladesh holiday is Friday for that we have to modify this default configuration.

To change the default configuration of each window we have to perform the following steps:

1. Disable the window.
2. Set attribute for window.
3. Enable The window.

Example of Sunday Window Change :

BEGIN

BEGIN
DBMS_SCHEDULER.DISABLE(
name=>'"SYS"."SUNDAY_WINDOW"',
force=>TRUE);
END;

BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."SUNDAY_WINDOW"',
attribute=>'DURATION',
value=>numtodsinterval(240, 'minute'));
END;

BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."SUNDAY_WINDOW"',
attribute=>'REPEAT_INTERVAL',
value=>'FREQ=WEEKLY;BYDAY=SUN;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;

BEGIN
DBMS_SCHEDULER.ENABLE(
name=>'"SYS"."SUNDAY_WINDOW"');
END;

END;

Result after change the default configuration of Sunday window :