Showing posts with label Performance Tunning. Show all posts
Showing posts with label Performance Tunning. Show all posts

Monday 17 May 2021

PT - IOSTAT MPSTAT Performance Monitoring commands

PT -  IOSTAT  MPSTAT  Performance Monitoring commands 

iostat 


  • iostat cpu  performance output at every 2 seconds
iostat -c 2 



  • iostat  overlall  performance output at every 2 seconds
iostat 2 




  • MPSTAT performance output  at every 2 second 
mpstat 


mpstat 2 


iostat -ykx sda -d 2

-d displays the statistics every 2 seconds
-k displays the statistics in kilobytes
sda is the partition that we are interested in displaying its statistics
-y to omit first report with statistics since the system boot
-x to display more information




Tuesday 12 January 2021

PT - Oracle Compression Basic and advanced table example

 PT - Oracle Compression Basic and advanced

  • Query to check table compression 

SQL> SELECT TABLE_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TABLES;

TABLE_NAME        COMPRESS COMPRESS_FOR

----------------- -------- ------------------------------

ADDRESSES         DISABLED

PRODUCT_INFORMATI DISABLED

ON

LOGON             DISABLED

ORDERS            DISABLED

CARD_DETAILS      DISABLED

INVENTORIES       DISABLED

WAREHOUSES        DISABLED

JOBS              DISABLED

CUSTOMERS         DISABLED


TABLE_NAME        COMPRESS COMPRESS_FOR

----------------- -------- ------------------------------

PRODUCT_DESCRIPTI DISABLED

ONS


ORDER_ITEMS       DISABLED

V                 DISABLED

JOB_HISTORY       DISABLED

EMP               DISABLED

DEPT              DISABLED

ORDERENTRY_METADA DISABLED

TA

TABLE_NAME        COMPRESS COMPRESS_FOR

----------------- -------- ------------------------------

CUST_SOURCE       DISABLED

CUST_BCOMPRESSED  ENABLED  BASIC

CUST_ACOMPRESSED  ENABLED  ADVANCED

19 rows selected.

SQL>

  • Create table with no compression basic and advanced.
No compression : CUST_SOURCE

Basic Compression : CUST_BCOMPRESSED

Advanced Compression : CUST_ACOMPRESSED

SQL> conn soe/soe

Connected.

SQL> CREATE TABLE CUST_SOURCE

  2  ( CUSTOMER_NO NUMBER(6),

  3  FIRST_NAME VARCHAR2(20),

  4  LAST_NAME VARCHAR2(20),

  5  NOTE1 VARCHAR2(100),

  6  NOTE2 VARCHAR2(100)

  7  ) NOLOGGING PCTFREE 0 TABLESPACE SOETBS;

Table created.

SQL> CREATE TABLE CUST_BCOMPRESSED

  2  ( CUSTOMER_NO NUMBER(6),

  3  FIRST_NAME VARCHAR2(20),

  4  LAST_NAME VARCHAR2(20),

  5  NOTE1 VARCHAR2(100),

  6  NOTE2 VARCHAR2(100)

  7  ) ROW STORE COMPRESS BASIC NOLOGGING TABLESPACE SOETBS;


Table created.


SQL> CREATE TABLE CUST_ACOMPRESSED

  2  ( CUSTOMER_NO NUMBER(6),

  3  FIRST_NAME VARCHAR2(20),

  4  LAST_NAME VARCHAR2(20),

  5  NOTE1 VARCHAR2(100),

  6  NOTE2 VARCHAR2(100)

  7  ) ROW STORE COMPRESS ADVANCED NOLOGGING PCTFREE 0 TABLESPACE SOETBS;


Table created.

  • Insert value on all tables.

SQL> INSERT INTO CUST_SOURCE

  2  SELECT LEVEL AS CUSTOMER_NO,

  3  DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(10,20))) FIRST_NAME,

  4  DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(10,20))) LAST_NAME,

  5  DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(0,100))) NOTE1,

  6  DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(0,100))) NOTE2

  7  FROM DUAL

  8  CONNECT BY LEVEL <= 100000;


100000 rows created.


SQL> COMMIT;


Commit complete.


SQL> INSERT INTO CUST_BCOMPRESSED SELECT * FROM CUST_SOURCE;


100000 rows created.


SQL> COMMIT;


Commit complete.


  • Gather stats on the all tables.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS(USER,'CUST_SOURCE');


PL/SQL procedure successfully completed.


SQL> exec DBMS_STATS.GATHER_TABLE_STATS(USER,'CUST_BCOMPRESSED');


PL/SQL procedure successfully completed.


SQL>

  • Check block size compression on the all tables

SQL> col TABLE_NAME format a17

SQL> SELECT TABLE_NAME, BLOCKS*8 SIZE_KB, COMPRESSION, PCT_FREE

  2  FROM USER_TABLES

  3  WHERE TABLE_NAME IN ('CUST_SOURCE','CUST_BCOMPRESSED','CUST_ACOMPRESSED');


TABLE_NAME           SIZE_KB COMPRESS   PCT_FREE

----------------- ---------- -------- ----------

CUST_ACOMPRESSED             ENABLED           0

CUST_BCOMPRESSED       15056 ENABLED           0

CUST_SOURCE            15056 DISABLED          0

  • Truncate and insert value on compressed table using direct path loading hints . As compare to basic compression there is small difference in advanced. check the status below.

SQL> TRUNCATE TABLE CUST_ACOMPRESSED;


Table truncated.


SQL> INSERT /*+ APPEND */ INTO CUST_ACOMPRESSED SELECT * FROM CUST_SOURCE;


100000 rows created.


SQL> COMMIT;


Commit complete.


SQL> exec DBMS_STATS.GATHER_TABLE_STATS(USER,'CUST_ACOMPRESSED');


PL/SQL procedure successfully completed.


SQL> col TABLE_NAME format a17

SQL> SELECT TABLE_NAME, BLOCKS*8 SIZE_KB, COMPRESSION, PCT_FREE

  2  FROM USER_TABLES

  3  WHERE TABLE_NAME IN ('CUST_SOURCE','CUST_BCOMPRESSED','CUST_ACOMPRESSED');


TABLE_NAME           SIZE_KB COMPRESS   PCT_FREE

----------------- ---------- -------- ----------

CUST_ACOMPRESSED        4360 ENABLED           0

CUST_BCOMPRESSED        4360 ENABLED           0

CUST_SOURCE             5984 DISABLED          0

  • Create Basic level of compression from no compressed table

SQL> CREATE TABLE CUST_BCOMPRESSED1 ROW STORE COMPRESS BASIC as select * from CUST_SOURCE ;

Table created.

  • Change existing table to compression

SQL> ALTER TABLE CUST_SOURCE ROW STORE COMPRESS BASIC;

Table altered.

SQL> SELECT TABLE_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TABLES where table_name='CUST_SOURCE';

TABLE_NAME        COMPRESS COMPRESS_FOR
----------------- -------- ------------------------------
CUST_SOURCE       ENABLED  BASIC

  • Change existing table from basic to compression

SQL> ALTER TABLE CUST_SOURCE ROW STORE COMPRESS advanced;

Table altered.

SQL> SELECT TABLE_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TABLES where table_name='CUST_SOURCE';

TABLE_NAME        COMPRESS COMPRESS_FOR
----------------- -------- ------------------------------
CUST_SOURCE       ENABLED  ADVANCED

SQL>

SQL> ALTER TABLE CUST_SOURCE noCOMPRESS;

Table altered.

SQL> SELECT TABLE_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TABLES where table_name='CUST_SOURCE';

TABLE_NAME        COMPRESS COMPRESS_FOR
----------------- -------- ------------------------------
CUST_SOURCE       DISABLED

  • Create tablespace with advanced level of compression
SQL> create tablespace adv_comp datafile 'C:\APP\VARUNYADAV\ORADATA\ORCL2\advcomp01.DMP' size 10m DEFAULT ROW STORE COMPRESS ADVANCED;

Tablespace created.

  • Determining Which Rows Are Compressed

SELECT DECODE(DBMS_COMPRESSION.GET_COMPRESSION_TYPE(OWNNAME => 'SOE',TABNAME => 'SALES_HISTORY',SUBOBJNAME => '',ROW_ID => 'AAAKEIEEGBBADBTDEDD'),
1, 'No Compression',
2, 'Advanced Row Compression',
4, 'Hybrid Columnar Compression for Query High',
8, 'Hybrid Columnar Compression for Query Low',
16, 'Hybrid Columnar Compression for Archive High',
32, 'Hybrid Columnar Compression for Archive Low',
4096, 'Basic Table Compression',
'Unknown Compression Type') COMPRESSION_TYPE
FROM DUAL;


  • Compression Related Statistics

SQL> SELECT N.NAME, S.VALUE FROM V$MYSTAT S, V$STATNAME N WHERE S.STATISTIC# = N.STATISTIC# AND N.NAME LIKE '%HSC%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
HSC OLTP Space Saving                                               1177689
HSC OLTP Compressed Blocks                                              510
HSC IDL Compressed Blocks                                              3379
HSC Compressed Segment Block Changes                                   6691
HSC Heap Segment Block Changes                                        11782
HSC OLTP Non Compressible Blocks                                        508
HSC OLTP positive compression                                          1018
HSC OLTP negative compression                                             0
HSC OLTP recursive compression                                            0
HSC OLTP inline compression                                            1018
HSC OLTP partial compression                                              0

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
HSC OLTP Drop Column                                                      0
HSC OLTP Compression skipped rows                                         0
HSC OLTP compression block checked                                        0
HSC OLTP Compression wide compressed row pieces                           0

15 rows selected.



Monday 11 January 2021

PT - Using Session Waiting Events with Hung or Very Slow Sessions

  •  Using Session Waiting Events with Hung or Very Slow Sessions

Scenario Preview: 

We will update and check wait events of sessions

SQL> conn sys/system123@pdb as sysdba

Connected.

SQL> exit

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0

C:\Users\varun>hostname

DESKTOP-H1NR6BO

C:\Users\varun>sqlplus sys/system123@pdb as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 6 19:39:09 2021

Version 19.3.0.0.0


Copyright (c) 1982, 2019, Oracle.  All rights reserved.



Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0


SQL> conn soe/soe@pdb

Connected.

  • Execute update command on the table salary for scenario.

SQL> UPDATE EMP SET SALARY=SALARY WHERE EMP_NO=104;


1 row updated.


SQL> SELECT SID, EVENT

  2  FROM V$SESSION

  3  WHERE STATE='WAITING' AND USERNAME ='SOE' AND WAIT_CLASS<>'Idle';


       SID EVENT

---------- ----------------------------------------------------------------

       382 log file sync

  • Wait event information of the hung session from the V$SESSION and V$SESSION_EVENT. 

SQL> SELECT SID, EVENT

  2  FROM V$SESSION

  3  WHERE STATE='WAITING' AND USERNAME ='SOE' AND WAIT_CLASS<>'Idle';


       SID EVENT

---------- ----------------------------------------------------------------

         8 enq: TX - row lock contention

       138 log file sync

       260 log file sync

       382 log file sync

       871 log file sync


SQL> col SESSION_WAITS format a100

SQL> SELECT 'SID: '|| SID||

  2  CHR(10)||'USERNAME: '|| USERNAME||

  3  CHR(10)||'STATE: '|| STATE||

  4  CHR(10)||'EVENT: '|| EVENT||

  5  CHR(10)||'WAIT_TIME: '|| WAIT_TIME||

  6  CHR(10)||'SECONDS_IN_WAIT: '|| SECONDS_IN_WAIT||

  7  CHR(10)||'WAIT_CLASS: '|| WAIT_CLASS||

  8  CHR(10)||'P1TEXT: '|| P1TEXT||

  9  CHR(10)||'P1: '|| P1||

 10  CHR(10)||'P2TEXT: '|| P2TEXT||

 11  CHR(10)||'P2: '|| P2 ||

 12  CHR(10)||'P3TEXT: '|| P3TEXT||

 13  CHR(10)||'P3: ' || P3 AS SESSION_WAITS

 14  FROM V$SESSION

 15  WHERE USERNAME='SOE' AND EVENT LIKE 'enq: TX%'

 16  ORDER BY WAIT_TIME;


SESSION_WAITS

--------------------------------------------------------------------------------

SID: 8

USERNAME: SOE

STATE: WAITING

EVENT: enq: TX - row lock contention

WAIT_TIME: 0

SECONDS_IN_WAIT: 87

WAIT_CLASS: Application

P1TEXT: name|mode

P1: 1415053318

P2TEXT: usn<<16 | slot

P2: 524313


SESSION_WAITS

--------------------------------------------------------------------------------

P3TEXT: sequence

P3: 9186



SQL> col EVENT for a30

SQL> SELECT E.EVENT,

  2  TO_CHAR(ROUND(E.TIME_WAITED/100),'999,999,999') TIME_SECONDS

  3  FROM V$SESSION_EVENT E, V$SESSION S

  4  WHERE E.SID=S.SID AND S.USERNAME='SOE' AND E.EVENT LIKE 'enq: TX%'

  5  ORDER BY TIME_WAITED;


EVENT                          TIME_SECONDS

------------------------------ ------------

enq: TX - index contention                0

enq: TX - index contention                0

enq: TX - index contention                0

enq: TX - index contention                0

enq: TX - row lock contention           468


SQL> SELECT COUNT(*) FROM V$SESSION_WAIT_HISTORY

  2  WHERE EVENT LIKE 'enq: TX%';


  COUNT(*)

----------

         0

  • Rollback or commit statement.

SQL> rollback;


Rollback complete.

  • Using v$session now there is no currently waiting events.

SQL> col EVENT format a40

SQL> col WAIT_CLASS format a10

SQL> SELECT SID, EVENT, WAIT_CLASS

  2  FROM V$SESSION

  3  WHERE USERNAME='SOE';


       SID EVENT                                    WAIT_CLASS

---------- ---------------------------------------- ----------

         8 SQL*Net message from client              Idle

       138 SQL*Net message from client              Idle

       260 SQL*Net message from client              Idle

       382 log file sync                            Commit

       505 SQL*Net message to client                Network

       871 SQL*Net message from client              Idle


6 rows selected.

  • View reports the wait event that has been waited by the session using V$SESSION_EVENT

SQL> SELECT E.EVENT,

  2  TO_CHAR(ROUND(E.TIME_WAITED/100),'999,999,999') TIME_SECONDS

  3  FROM V$SESSION_EVENT E, V$SESSION S

  4  WHERE E.SID=S.SID AND S.USERNAME='SOE' AND E.EVENT LIKE 'enq: TX%'

  5  ORDER BY TIME_WAITED;


EVENT                                    TIME_SECONDS

---------------------------------------- ------------

enq: TX - index contention                          0

enq: TX - index contention                          0

enq: TX - index contention                          0

enq: TX - index contention                          0

enq: TX - row lock contention                     497


SQL>

  • Information about the wait event that has just expired from the V$SESSION_WAIT_HISTORY

SQL> col SESSION_WAITS format a100

SQL> SELECT 'SID: '|| SID||

  2  CHR(10)||'EVENT: '|| EVENT||

  3  CHR(10)||'WAIT_TIME: '|| WAIT_TIME||

  4  CHR(10)||'P1TEXT: '|| P1TEXT||

  5  CHR(10)||'P1: '|| P1||

  6  CHR(10)||'P2TEXT: '|| P2TEXT||

  7  CHR(10)||'P2: '|| P2 ||

  8  CHR(10)||'P3TEXT: '|| P3TEXT||

  9  CHR(10)||'P3: ' || P3 AS SESSION_WAITS

 10  FROM V$SESSION_WAIT_HISTORY

 11  WHERE EVENT LIKE 'enq: TX%'

 12  ORDER BY WAIT_TIME;


SESSION_WAITS

--------------------------------------------------------------------------------

SID: 8

EVENT: enq: TX - row lock contention

WAIT_TIME: 49718

P1TEXT: name|mode

P1: 1415053318

P2TEXT: usn<<16 | slot

P2: 524313

P3TEXT: sequence

P3: 9186


SQL>

SELECT COUNT(*) FROM V$SESSION_WAIT_HISTORY WHERE EVENT LIKE 'enq: TX%';

ORA-00382: 32768 not a valid block size, valid range [2048..16384]

 Scenario Preview: 

Recently we perform some row migration and row chaining activity  as we find out on window operating system we are unable to increase block size 32kb might be the reason due to page size in window.

Error: 

ORA-00382: 32768 not a valid block size, valid range [2048..16384] 

C:\Users\varun>sqlplus sys/system123@orcl as sysdba


SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 4 23:07:56 2021

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0


SQL> ALTER SYSTEM SET DB_32K_CACHE_SIZE= 160M;

ALTER SYSTEM SET DB_32K_CACHE_SIZE= 160M

*

ERROR at line 1:

ORA-32017: failure in updating SPFILE

ORA-00382: 32768 not a valid block size, valid range [2048..16384]

SQL> CREATE TABLESPACE TBS16K111 DATAFILE 'C:\APP\VARUN\ORADATA\ORCL\PDB\tbs16k.dbf' SIZE 160M AUTOEXTEND ON MAXSIZE 1000M BLOCKSIZE 32K;

CREATE TABLESPACE TBS16K111 DATAFILE 'C:\APP\VARUN\ORADATA\ORCL\PDB\tbs16k.dbf' SIZE 160M AUTOEXTEND ON MAXSIZE 1000M BLOCKSIZE 32K

*

ERROR at line 1:

ORA-00382: 32768 not a valid block size, valid range [2048..16384]



SQL>


SQL>





SQL> ALTER SYSTEM SET DB_16K_CACHE_SIZE= 160M;

System altered.

SQL> SELECT NAME, BLOCK_SIZE, CURRENT_SIZE FROM V$BUFFER_POOL;

NAME                 BLOCK_SIZE CURRENT_SIZE
-------------------- ---------- ------------
DEFAULT                    8192         3552
DEFAULT                   16384          160

SQL>

SQL> CREATE TABLESPACE TBS16K DATAFILE 'C:\APP\VARUN\ORADATA\ORCL\PDB\tbs16k.dbf' SIZE 160M AUTOEXTEND ON MAXSIZE 1000M BLOCKSIZE 16K;


Tablespace created.


SQL>


Solution Testing : 

  • Set DB_16K_CACHE_SIZE scope is memory 

SQL> ALTER SYSTEM SET DB_16K_CACHE_SIZE= 160M;


System altered.


SQL> SELECT NAME, BLOCK_SIZE, CURRENT_SIZE FROM V$BUFFER_POOL;


NAME                 BLOCK_SIZE CURRENT_SIZE

-------------------- ---------- ------------

DEFAULT                    8192         3552

DEFAULT                   16384          160

  • Create Tablespace TBS16K with block size 16K

SQL> CREATE TABLESPACE TBS16K DATAFILE 'C:\APP\VARUN\ORADATA\ORCL\PDB\tbs16k.dbf' SIZE 160M AUTOEXTEND ON MAXSIZE 1000M BLOCKSIZE 16K;

Tablespace created.

  • Set Quota to schema on tablespace

SQL> ALTER USER SOE QUOTA UNLIMITED ON TBS16K;

User altered.

SQL> conn soe/soe@pdb

Connected.

  • Move table cust to new tablespace

SQL> ALTER TABLE CUST MOVE TABLESPACE tbs16k;


Table altered.



Tuesday 5 January 2021

PT - Fragmentation and Defragmentation Table using shrinking table


Table Defragmentation Methods : - 

  • Shrinking tables

  • Export/Import ( EXPDP | IMPDP - table_exists_action=tuncate  |  Or drop and recreate expdp | impdp )



Fragmentation and Defragmentation Table scenario using shrinking table

C:\Users\varun>sqlplus sys/system123@orcl as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jan 5 21:12:10 2021

Version 19.3.0.0.0


Copyright (c) 1982, 2019, Oracle.  All rights reserved.6

Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0


SQL> conn soe/soe@pdb

Connected.

SQL> set sqlprompt "ADMIN> "

  • Drop and recreate table cust

ADMIN> DROP TABLE CUST CASCADE CONSTRAINTS;


Table dropped.


ADMIN> CREATE TABLE CUST

  2  ( CUSTOMER_NO NUMBER(6),

  3  FIRST_NAME VARCHAR2(20),

  4  LAST_NAME VARCHAR2(20),

  5  NOTE1 VARCHAR2(100),

  6  NOTE2 VARCHAR2(100)

  7  ) PCTFREE 0 TABLESPACE SOETBS;


Table created.

  • Insert values into CUST table 

ADMIN> INSERT INTO CUST

  2  SELECT LEVEL AS CUSTOMER_NO,

  3   DBMS_RANDOM.STRING('A', 15) FIRST_NAME,

  4   DBMS_RANDOM.STRING('A', 12) LAST_NAME,

  5   DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(0,100))) NOTE1,

  6   DBMS_RANDOM.STRING('A', TRUNC(DBMS_RANDOM.value(0,100))) NOTE2

  7  FROM DUAL

  8  CONNECT BY LEVEL <= 100000;


100000 rows created.


ADMIN> COMMIT;


Commit complete.

  • Create Index CUST_NO_IDX, CUST_FNAME_IDX on CUST object

ADMIN> CREATE INDEX CUST_NO_IDX ON CUST (CUSTOMER_NO) NOLOGGING TABLESPACE SOETBS;


Index created.


ADMIN> CREATE INDEX CUST_FNAME_IDX ON CUST(FIRST_NAME) NOLOGGING TABLESPACE SOETBS;


Index created.


ADMIN> BEGIN

  2  FOR I IN 1..100000 LOOP

  3   IF MOD(I,2)=0 THEN

  4   UPDATE CUST SET NOTE1=NULL, NOTE2=DBMS_RANDOM.STRING('A',

  5  TRUNC(DBMS_RANDOM.value(0,10))) WHERE CUSTOMER_NO=I;

  6   IF MOD(I,100)=0 THEN

  7   COMMIT;

  8   END IF;

  9   ELSIF MOD(I,3)=0 THEN

 10   DELETE CUST WHERE CUSTOMER_NO=I;

 11   END IF;

 12  END LOOP;

 13  COMMIT;

 14  END;

 15  /


PL/SQL procedure successfully completed.


ADMIN> -- index dropped because we want to test full table scan (FTS)

ADMIN> DROP INDEX CUST_NO_IDX;


Index dropped.

  • Analyze table cust to detremine status of used and free blocks

ADMIN> ANALYZE TABLE CUST COMPUTE STATISTICS;


Table analyzed.

  • Script to display deleted space on CUST  table

ADMIN> SELECT BLOCKS, BLOCKS*8192/1024 TOTAL_SIZE_KB, AVG_SPACE,

  2  round(BLOCKS*AVG_SPACE/1024,2) FREE_SPACE_KB

  3  FROM USER_TABLES WHERE TABLE_NAME='CUST';


    BLOCKS TOTAL_SIZE_KB  AVG_SPACE FREE_SPACE_KB

---------- ------------- ---------- -------------

      1762         14096       4122       7092.74

  • Query to enable row movement in the CUST table. 
  • ( It means already some update in progress stop or let complete)

ADMIN> ALTER TABLE CUST ENABLE ROW MOVEMENT;

ALTER TABLE CUST ENABLE ROW MOVEMENT

            *

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

  • Again run enable row movement.

ADMIN> ALTER TABLE CUST ENABLE ROW MOVEMENT;

Table altered.

  •  Execute to shrink the CUST table

ADMIN> ALTER TABLE CUST SHRINK SPACE CASCADE;


Table altered.

  • Analyze table CUST

ADMIN> ANALYZE TABLE CUST COMPUTE STATISTICS;


Table analyzed.

  • Check the space status of CUST Table

ADMIN> SELECT BLOCKS, BLOCKS*8192/1024 TOTAL_SIZE_KB, AVG_SPACE,

  2  round(BLOCKS*AVG_SPACE/1024,2) FREE_SPACE_KB

  3  FROM USER_TABLES WHERE TABLE_NAME='CUST';


    BLOCKS TOTAL_SIZE_KB  AVG_SPACE FREE_SPACE_KB

---------- ------------- ---------- -------------

       866          6928         73         61.74


ADMIN>


PT - Row Migration Using Online Redefinition

Row Migration Using Online Redefinition

  • The chaining percentage (CHAIN_PCT) is not gathered using stats gathering. 

SQL> exec DBMS_STATS.GATHER_TABLE_STATS(USER,'CUST');

PL/SQL procedure successfully completed.

  • Using Analyze CHAIN_CNT (row migration and row chaining of blocks will be detected).

SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;

Table analyzed.


SQL> SELECT CHAIN_CNT,
  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,
  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS
  4    FROM USER_TABLES
  5  WHERE TABLE_NAME = 'CUST';

  • Correcting Row Migration Using Online Redefinition

 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS
---------- ---------- ----------- ---------- ---------- ----------
     61267      30.63         431         10                 13036


  • To solve the row migration issue by online redefinition. The script rebuilds the table in its same tablespace.

SQL> BEGIN
  2  DBMS_REDEFINITION.REDEF_TABLE(
  3   UNAME => 'SOE',
  4   TNAME => 'CUST',
  5   TABLE_PART_TABLESPACE => 'SOETBS',
  6   INDEX_TABLESPACE => 'SOETBS');
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;

Table analyzed.

SQL> SELECT CHAIN_CNT,
  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,
  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS
  4    FROM USER_TABLES
  5  WHERE TABLE_NAME = 'CUST';

 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS
---------- ---------- ----------- ---------- ---------- ----------
         0          0         429         10                 13059




Correcting Row Chaining by using Larger Block Size

 Correcting Row Chaining by using Larger Block Size

  • Row chaining Scenario Creation :

SQL> DROP TABLE CUST_ORDERS;

Table dropped.

SQL> DROP TABLE CUST;

Table dropped.

SQL>

SQL> set timing on

SQL> CREATE TABLE SOE.CUST

  2  ( CUSTOMER_NO    NUMBER(6),

  3   FIRST_NAME VARCHAR2(40),

  4   LAST_NAME  VARCHAR2(40),

  5   NOTE1 VARCHAR2(4000),

  6   NOTE2 VARCHAR2(4000)

  7  ) TABLESPACE SOETBS;


Table created.


Elapsed: 00:00:00.00

SQL>

SQL> INSERT INTO SOE.CUST

  2  SELECT LEVEL AS CUSTOMER_NO,

  3         DBMS_RANDOM.STRING('A', 40) FIRST_NAME,

  4         DBMS_RANDOM.STRING('A', 40) LAST_NAME,

  5         DBMS_RANDOM.STRING('A', 4000) NOTE1,

  6         DBMS_RANDOM.STRING('A', 4000) NOTE2

  7  FROM DUAL

  8  CONNECT BY LEVEL <= 10000;


10000 rows created.


Elapsed: 00:00:52.86

SQL> set timing off

SQL> COMMIT;

Commit complete.

SQL>

SQL> CREATE INDEX CUST_NO_IDX ON CUST(CUSTOMER_NO) NOLOGGING TABLESPACE SOETBS;


Index created.

  • Analyze Table CUST

SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;

Table analyzed.

  • Check row chaining using query below. 

SQL> SELECT CHAIN_CNT,

  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,

  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS

  4    FROM USER_TABLES

  5  WHERE TABLE_NAME = 'CUST';


 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS

---------- ---------- ----------- ---------- ---------- ----------

     10000        100        8101         10                 20048


  • Connect database check and create tablespace with db_block_size=16|32. In our case it is window machine we are getting issue by increasing 32 so we use the value to 16.

C:\Users\varun>sqlplus sys/system123@pdb as sysdba


SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 4 23:03:30 2021

Version 19.3.0.0.0


Copyright (c) 1982, 2019, Oracle.  All rights reserved.



Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0


SQL> SELECT VALUE FROM V$PARAMETER WHERE NAME = 'db_block_size';


VALUE

--------------------------------------------------------------------------------

8192

  • Testing curresnt session CPU used by this session and DB time 

SQL> @ test_queries.sql 10000


System altered.

System altered.

PL/SQL procedure successfully completed.

Table created.

old   4: FOR I IN 1..&1 LOOP

new   4: FOR I IN 1..10000 LOOP


PL/SQL procedure successfully completed.

Table created.

MYSTAT

--------------------------------------------------------------------------------

CPU used by this session: 96

DB time: 651

table fetch continued row: 0


Table dropped.


Table dropped.

  • Set DB_16K_CACHE_SIZE scope is memory 

SQL> ALTER SYSTEM SET DB_16K_CACHE_SIZE= 160M;


System altered.


SQL> SELECT NAME, BLOCK_SIZE, CURRENT_SIZE FROM V$BUFFER_POOL;


NAME                 BLOCK_SIZE CURRENT_SIZE

-------------------- ---------- ------------

DEFAULT                    8192         3552

DEFAULT                   16384          160

  • Create Tablespace TBS16K with block size 16K

SQL> CREATE TABLESPACE TBS16K DATAFILE 'C:\APP\VARUN\ORADATA\ORCL\PDB\tbs16k.dbf' SIZE 160M AUTOEXTEND ON MAXSIZE 1000M BLOCKSIZE 16K;

Tablespace created.

  • Set Quota to schema on tablespace

SQL> ALTER USER SOE QUOTA UNLIMITED ON TBS16K;

User altered.

SQL> conn soe/soe@pdb

Connected.

  • Move table cust to new tablespace

SQL> ALTER TABLE CUST MOVE TABLESPACE tbs16k;


Table altered.


SQL> ALTER INDEX CUST_NO_IDX REBUILD;


Index altered.

  • Analyze and check status

SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;


Table analyzed.


SQL> SELECT CHAIN_CNT,

  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,

  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS

  4    FROM USER_TABLES

  5  WHERE TABLE_NAME = 'CUST';


 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS

---------- ---------- ----------- ---------- ---------- ----------

         0          0        8095         10                 10090


  • Testing curresnt session CPU used by this session and DB time

SQL> @ test_queries.sql 10000


System altered.


System altered.


PL/SQL procedure successfully completed.


Table created.


old   4: FOR I IN 1..&1 LOOP

new   4: FOR I IN 1..10000 LOOP


PL/SQL procedure successfully completed.


Table created.


MYSTAT

--------------------------------------------------------------------------------

CPU used by this session: 81

DB time: 544

table fetch continued row: 0

Table dropped.

Table dropped.

SQL>

PT - Row migration and Row Chaining

  •  Row migration caused when no space is in the block for a row update
  •  Row chaining caused by inserting a row larger than block size

Resolving Migrated Rows

  • Export and Import Utilities
  • Using ALTER TABLE MOVE command
  • Online table redefinition
  • Copy migrated rows

                                                                      Comparision





EXPDP | IMPDP - table_exists_action=tuncate  |  Or drop and recreate expdp | impdp 





PT- Correcting Row Migration by Increasing PCTFREE

 Correcting Row Migration by Increasing PCTFREE

Scenario

We have table name CUST, After anlayze table we find out CHAIN_CNT migrated and chained row of table.

One of the method by increasing PCT_FREE, but block size will increase after using it. Stats gather do not capture CHAIN_CNT so we analyze table.

Solution:

SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;

Table analyzed.

SQL> SELECT CHAIN_CNT,

  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,

  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS

  4    FROM USER_TABLES

  5  WHERE TABLE_NAME = 'CUST';


 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS

---------- ---------- ----------- ---------- ---------- ----------

     61267      30.63         431         10                 13036


SQL> ALTER TABLE CUST PCTFREE 20;


Table altered.


SQL> ALTER TABLE cust MOVE TABLESPACE SOETBS ONLINE;


Table altered.


SQL> ANALYZE TABLE CUST COMPUTE STATISTICS;


Table analyzed.


SQL> SELECT CHAIN_CNT,

  2         ROUND(CHAIN_CNT/NUM_ROWS*100,2) CHAIN_PCT,

  3         AVG_ROW_LEN, PCT_FREE , PCT_USED, BLOCKS

  4    FROM USER_TABLES

  5  WHERE TABLE_NAME = 'CUST';


 CHAIN_CNT  CHAIN_PCT AVG_ROW_LEN   PCT_FREE   PCT_USED     BLOCKS

---------- ---------- ----------- ---------- ---------- ----------

         0          0         429         20                 15443




Tuesday 8 December 2020

PT - Extracting Session level trace based on sid and serial#

Session level trace example  based on sid and serial#

  • Checking the database name 

SQL> @d


NAME      INSTANCE_NAME    DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    CURRENT_SCN        FAILOVER_SCN

--------- ---------------- ------------------------------ -------------------- ---------------- ------------------ ----------------------------------------

TC12DEV   TC12DEV          TC12DEV                        READ WRITE           PRIMARY          NO                 0

  • Command to check sessions details  (describing only particular session only for trace generation)

SQL> @sessions


     INST   SID SERIAL# USERNAME     OSUSER           PROGRAM    LOCKED S hh:mm:ss SQL_ID            SEQ# Current/LastEvent         State (sec)

--------- ----- ------- ------------ ---------------- ---------- ------ - -------- --------------- ------ ------------------------- --------------

MODULE                                                                                               ACTION

---------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------



        1   298   33658 INFODBA      varunyadav       SQL Develo        I 00:29:48 cr6axzpwa6byz       62 SQL*Net message from clie WAITING   1788

SQL Developer


 9 rows selected.

  • Extracting trace based on sis and session#

SQL> DEFINE v_sid =298

SQL> DEFINE v_serial =33658

SQL> BEGIN

DBMS_MONITOR.SESSION_TRACE_ENABLE( SESSION_ID => &v_sid, SERIAL_NUM =>

&v_serial, WAITS => TRUE, BINDS => FALSE);

END;

/  2    3    4    5

old   2: DBMS_MONITOR.SESSION_TRACE_ENABLE( SESSION_ID => &v_sid, SERIAL_NUM =>

new   2: DBMS_MONITOR.SESSION_TRACE_ENABLE( SESSION_ID => 298, SERIAL_NUM =>

old   3: &v_serial, WAITS => TRUE, BINDS => FALSE);

new   3: 33658, WAITS => TRUE, BINDS => FALSE);


PL/SQL procedure successfully completed.


SQL> SELECT P.TRACEFILE FROM V$SESSION S JOIN V$PROCESS P ON S.PADDR = P.ADDR WHERE S.SID = &V_SID;

old   1: SELECT P.TRACEFILE FROM V$SESSION S JOIN V$PROCESS P ON S.PADDR = P.ADDR WHERE S.SID = &V_SID

new   1: SELECT P.TRACEFILE FROM V$SESSION S JOIN V$PROCESS P ON S.PADDR = P.ADDR WHERE S.SID = 298


TRACEFILE

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/u01/app/oracle/diag/rdbms/tc12dev/TC12DEV/trace/TC12DEV_ora_20976.trc


SQL> BEGIN

DBMS_MONITOR.SESSION_TRACE_DISABLE( SESSION_ID => &v_sid, SERIAL_NUM =>

&v_serial);

END;

/  2    3    4    5

old   2: DBMS_MONITOR.SESSION_TRACE_DISABLE( SESSION_ID => &v_sid, SERIAL_NUM =>

new   2: DBMS_MONITOR.SESSION_TRACE_DISABLE( SESSION_ID => 298, SERIAL_NUM =>

old   3: &v_serial);

new   3: 33658);


PL/SQL procedure successfully completed.


SQL>


Trace output:




Sunday 29 November 2020

LOG MINER : Log miner_current_scn


LOGMINER - Based on SCN 

Scenario Preview:

We have archive log of particular date, with the help of  logminer we can extract the value based on SCN Number.

In general we can extract object value based on archive log | Timestamp date |  SCN Number

Operating System: OEL 7.7 64 bit

Database Version : 12.2.0.1 

Database : SMRUPGR12QA

Schema : infodba

Log Miner table : PFND0GENERALAUDIT

  • Check UTL_FILE_DIR location below.

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string

  • We need to take bounce of  database as parameter value is not set as dyanamics to set UTL_FILE_DIR  location.

SQL> alter system set utl_file_dir='/u04/db_backup/expdp/SMRUPGR12QA/logminer' scope=spfile;

System altered.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 2147483648 bytes

Fixed Size                  3712904 bytes

Variable Size             822085752 bytes

Database Buffers         1308622848 bytes

Redo Buffers               13062144 bytes

Database mounted.

Database opened.

SQL> @d

NAME                             INSTANCE_NAME    DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    CURRENT_SCN        FAILOVER_SCN

-------------------------------- ---------------- ------------------------------ -------------------- ---------------- ------------------ ----------------------------------------

SMRUPGR1                         SMRUPGR12QA      SMRUPGR12QA                    READ WRITE           PRIMARY          NO                 0

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string      /u04/db_backup/expdp/SMRUPGR12

                                                 QA/logminer

  • Create directory for storing logminer file location 

SQL> CREATE OR REPLACE DIRECTORY LOG_DIR AS '/u04/db_backup/expdp/SMRUPGR12QA/logminer';

Directory created.

  • Optional if we wants to exract from particular users

SQL> GRANT READ, WRITE ON DIRECTORY LOG_DIR TO infodba;

Grant succeeded.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

NO

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

  • Start log miner specifying name and location 

 SQL>  BEGIN

sys.DBMS_LOGMNR_D.build (

dictionary_filename => 'date_lgmnrdict.ora',

dictionary_location => 'LOG_DIR');

END;

/  2    3    4    5    6

PL/SQL procedure successfully completed.

  • Using mention and specify the  archive log values below. 

SQL> BEGIN

DBMS_LOGMNR.add_logfile (

  2    3  options => DBMS_LOGMNR.new,

logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_737_hvcwzj71_.arc');

  4    5

  6  DBMS_LOGMNR.add_logfile (

  7  options => DBMS_LOGMNR.addfile,

  8  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_738_hvd82hth_.arc');

  9

 10  DBMS_LOGMNR.add_logfile (

 11  options => DBMS_LOGMNR.addfile,

 12  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_739_hvfq7xpq_.arc');

 13

 14  END;

 15  /

PL/SQL procedure successfully completed. 

SQL>  BEGIN

sys.DBMS_LOGMNR_D.build (

dictionary_filename => 'date_lgmnrdict.ora',

dictionary_location => 'LOG_DIR');

END;

/  2    3    4    5    6

PL/SQL procedure successfully completed.

  • Using mention and specify the archive log values below. 

SQL> BEGIN

DBMS_LOGMNR.add_logfile (

  2    3  options => DBMS_LOGMNR.new,

logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_737_hvcwzj71_.arc');

  4    5

  6  DBMS_LOGMNR.add_logfile (

  7  options => DBMS_LOGMNR.addfile,

  8  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_738_hvd82hth_.arc');

  9

 10  DBMS_LOGMNR.add_logfile (

 11  options => DBMS_LOGMNR.addfile,

 12  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_739_hvfq7xpq_.arc');

 13

 14  END;

 15  /


PL/SQL procedure successfully completed.

  • Log miner Based on SCN Number

begin

DBMS_LOGMNR.start_logmnr (

dictfilename => '/oradb/logminer/lgmnrdict.ora',

startscn => 20734338,

endscn => 20834345);

END;

PL/SQL procedure successfully completed.

SQL>

SELECT seg_owner, seg_name, count(*) AS Hits
FROM   v$logmnr_contents
WHERE  seg_name NOT LIKE '%$'
GROUP BY seg_owner, seg_name;


SELECT OPERATION, STATUS, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'INFODBA' AND TABLE_NAME = 'PFND0GENERALAUDIT';


SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

PL/SQL procedure successfully completed.

SQL>
 

Log Miner : Date_Timestamp_logminer


LOGMINER - Based on Date and time generation

Scenario Preview:

We have archive log of particular date, with the help of  logminer we can extract the value based on date and time.

In general we can extract object value based on archive log | Timestamp date |  SCN Number

Operating System: OEL 7.7 64 bit

Database Version : 12.2.0.1 

Database : SMRUPGR12QA

Schema : infodba

Log Miner table : PFND0GENERALAUDIT

Check UTL_FILE_DIR location below.

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string

  • We need to take bounce of  database as parameter value is not set as dyanamics to set UTL_FILE_DIR  location.

SQL> alter system set utl_file_dir='/u04/db_backup/expdp/SMRUPGR12QA/logminer' scope=spfile;

System altered.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 2147483648 bytes

Fixed Size                  3712904 bytes

Variable Size             822085752 bytes

Database Buffers         1308622848 bytes

Redo Buffers               13062144 bytes

Database mounted.

Database opened.

SQL> @d

NAME                             INSTANCE_NAME    DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    CURRENT_SCN        FAILOVER_SCN

-------------------------------- ---------------- ------------------------------ -------------------- ---------------- ------------------ ----------------------------------------

SMRUPGR1                         SMRUPGR12QA      SMRUPGR12QA                    READ WRITE           PRIMARY          NO                 0

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string      /u04/db_backup/expdp/SMRUPGR12

                                                 QA/logminer

Create directory for storing logminer file location 

SQL> CREATE OR REPLACE DIRECTORY LOG_DIR AS '/u04/db_backup/expdp/SMRUPGR12QA/logminer';

Directory created.

Optional if we wants to exract from particular users

SQL> GRANT READ, WRITE ON DIRECTORY LOG_DIR TO infodba;

Grant succeeded.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

NO

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;


Database altered.

  • Start log miner specifying name and location 

 SQL>  BEGIN

sys.DBMS_LOGMNR_D.build (

dictionary_filename => 'date_lgmnrdict.ora',

dictionary_location => 'LOG_DIR');

END;

/  2    3    4    5    6


PL/SQL procedure successfully completed.

  • Using mention and specify the  archive log values below. 

SQL> BEGIN

DBMS_LOGMNR.add_logfile (

  2    3  options => DBMS_LOGMNR.new,

logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_737_hvcwzj71_.arc');

  4    5

  6  DBMS_LOGMNR.add_logfile (

  7  options => DBMS_LOGMNR.addfile,

  8  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_738_hvd82hth_.arc');

  9

 10  DBMS_LOGMNR.add_logfile (

 11  options => DBMS_LOGMNR.addfile,

 12  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_739_hvfq7xpq_.arc');

 13

 14  END;

 15  /


PL/SQL procedure successfully completed.

  • Start log mining mentioning date and time

SQL> begin

dbms_logmnr.start_logmnr (

dictfilename => '/u04/db_backup/expdp/SMRUPGR12QA/logminer/date_lgmnrdict.ora',

  2    3    4  starttime => TO_DATE('19-NOV-2020 05:26:00', 'DD-MON-YYYY HH:MI:SS'),

  5  endtime => TO_DATE('19-NOV-2020 08:35:00', 'DD-MON-YYYY HH:MI:SS'));

end;

/  6    7


PL/SQL procedure successfully completed.

  • Example to check the logs contents 

SQL>

SELECT seg_owner, seg_name, count(*) AS Hits
FROM   v$logmnr_contents
WHERE  seg_name NOT LIKE '%$'
GROUP BY seg_owner, seg_name;


SELECT OPERATION, STATUS, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'INFODBA' AND TABLE_NAME = 'PFND0GENERALAUDIT';

  • End log mining operations
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

PL/SQL procedure successfully completed.

SQL>

NEW LOGMINER - Based on archivelog generation

Scenario Preview:

We have archive log of particular date, with the help of  logminer we can extract the value based on archive log .

In general we can extract object value based on archive log | Timestamp date |  SCN Number

Operating System: OEL 7.7 64 bit

Database Version : 12.2.0.1 

Database : SMRUPGR12QA

Schema : infodba

Log Miner table : PFND0GENERALAUDIT

SQL> @d

NAME                             INSTANCE_NAME    DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    CURRENT_SCN        FAILOVER_SCN

-------------------------------- ---------------- ------------------------------ -------------------- ---------------- ------------------ ----------------------------------------

SMRUPGR1                         SMRUPGR12QA      SMRUPGR12QA                    READ WRITE           PRIMARY          NO                 0


Check UTL_FILE_DIR location below.

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string

  • We need to take bounce of  database as parameter value is not set as dyanamics to set UTL_FILE_DIR  location.

SQL> alter system set utl_file_dir='/u04/db_backup/expdp/SMRUPGR12QA/logminer' scope=spfile;

System altered.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 2147483648 bytes

Fixed Size                  3712904 bytes

Variable Size             822085752 bytes

Database Buffers         1308622848 bytes

Redo Buffers               13062144 bytes

Database mounted.

Database opened.

SQL> @d

NAME                             INSTANCE_NAME    DB_UNIQUE_NAME                 OPEN_MODE            DATABASE_ROLE    CURRENT_SCN        FAILOVER_SCN

-------------------------------- ---------------- ------------------------------ -------------------- ---------------- ------------------ ----------------------------------------

SMRUPGR1                         SMRUPGR12QA      SMRUPGR12QA                    READ WRITE           PRIMARY          NO                 0

SQL> sho parameter utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

utl_file_dir                         string      /u04/db_backup/expdp/SMRUPGR12

                                                 QA/logminer

Create directory for storing logminer file location 

SQL> CREATE OR REPLACE DIRECTORY LOG_DIR AS '/u04/db_backup/expdp/SMRUPGR12QA/logminer';

Directory created.

Optional if we wants to exract from particular users

SQL> GRANT READ, WRITE ON DIRECTORY LOG_DIR TO infodba;

Grant succeeded.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

NO

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;


Database altered.

  • Start log miner specifying name and location 

SQL> BEGIN

sys.DBMS_LOGMNR_D.build (

dictionary_filename => 'lgmnrdict.ora',

dictionary_location => 'LOG_DIR');

END;

/  2    3    4    5    6

PL/SQL procedure successfully completed.

SQL> SQL>

SQL> SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/SMRUPGR12QA/redo01.log
/u01/app/oracle/oradata/SMRUPGR12QA/redo02.log
/u01/app/oracle/oradata/SMRUPGR12QA/redo03.log
  • Using mention archive log  values to log. 
SQL> BEGIN
DBMS_LOGMNR.add_logfile (
options => DBMS_LOGMNR.new,
logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_737_hvcwzj71_.arc');

DBMS_LOGMNR.add_logfile (
  2    3    4    5    6    7  options => DBMS_LOGMNR.addfile,
logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_738_hvd82hth_.arc');

DBMS_LOGMNR.add_logfile (
  8    9   10   11  options => DBMS_LOGMNR.addfile,
 12  logfilename => '/u04/db_backup/Flash_recovery_area/SMRUPGR12QA/SMRUPGR12QA/archivelog/2020_11_19/o1_mf_1_739_hvfq7xpq_.arc');
 13
 14  END;
/  15

PL/SQL procedure successfully completed.

SQL> sho user
USER is "SYS"
SQL>
  • Start log mining location 
SQL> sho user
USER is "SYS"
SQL> BEGIN
-- Start using all logs
DBMS_LOGMNR.start_logmnr (
dictfilename => '/u04/db_backup/expdp/SMRUPGR12QA/logminer/lgmnrdict.ora');
END;
/   2    3    4    5    6

PL/SQL procedure successfully completed.

SQL>
  • Check the log mining contents.
SELECT seg_owner, seg_name, count(*) AS Hits
FROM   v$logmnr_contents
WHERE  seg_name NOT LIKE '%$'
GROUP BY seg_owner, seg_name;

  • Check Tablevalue operation information details

SELECT OPERATION, STATUS, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'INFODBA' AND TABLE_NAME = 'PFND0GENERALAUDIT';
  • End log miner execution

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

PL/SQL procedure successfully completed.

SQL>