Zamong은 SGA 메모리를 직접 액세스 하는 방법을 사용하는 무료의 실시간 오라클 모니터링 솔루션입니다.

Zamong is free oracle monitoring software with DMA method.

dma_picture

이 솔루션은 쿼리를 사용하지 않고, 모니터링 할 정보를 OS 메모리에서 직접 읽어오기 때문에 오라클 장애 순간에도,
심지어 ORACLE이 HANG 상태에 있어도, 오라클 instance 의 상태와 지표값, 실행되고 있는 sql 쿼리를 비롯하여  SGA에 올라와 있는 각 세션의 모든 정보를 os 메모리에서 읽어 저장할 수 있습니다.

메모리에서 직접 읽는 방법( DMA )은 매우 빠르고 부하가 거의 없는게 특징입니다.
실제로 테스트해보면 1초에 100 회 이상 OS 메모리 읽으면서 오라클 관련 중요 정보를 추출할 수 있을 정도입니다.
하지만 성능분석이나 장애 원인 분석을 위한 데이터 추출은 1초에 1번 추출하는것으로도 충분합니다.
자몽은 1초에 1번 메모리에서 데이터를 읽고 있습니다.

일반적인 쿼리 방식의 모니터링 솔루션은 주기적으로 쿼리를 실행시켜 DB 인스턴스 나 Active Session의 상세 정보를 추출하는 방법을 사용하는데, 이 방법은 매우 위험할 수 있습니다.
쿼리 수도 많고, 또 쿼리를 수행하기위해 DB에서 내부적으로 많은 recursive 쿼리가 실행되고, 이러한 recursive 쿼리는 shared pool에서 latch 경합을 일으킬 수 있습니다. 더구나 cpu 사용률이 높고, 실시간 트랜잭션이 많은 계정계 db나 쇼핑몰 db, PG VAN사의 결제 db 등 민감한 db에서는 이런 쿼리 방식의 모니터링은 매우 위험합니다.
예전 얘기지만 Oracle 9i 때는 v$session를 반복적으로 조회하는 것만으로도 shared pool 내의 latch를 유발시켜 instance hang 까지 발생했었습니다.

Zamong 을 사용하면 대시보드에서 DB instance의 중요 통계(stat) 항목을 실시간으로 차트로 보여주고, 또 Active 세션들의 상세 정보도 2초 단위로 refresh 해줍니다. 이렇게 실시간적으로 주요 statistics 변화 추이를 차트로 보여주기 때문에 db에 어떤 성능 지연이 나타나면 바로 인지할 수 있고, 하단에 보여주는 active session 정보까지 같이 확인하면, 어떤 세션들로 인해 db에 부하가 가고 있는지 직관적으로 확인 할 수 있습니다. 무엇보다도 1초 간격으로 모니터링 된 정보들이 수집서버로 전송되고 저장되고 있어, 과거 장애 난 시점의 각 엑티브 세션들의 Wait Event와 쿼리, 프로그램 등 상세정보들을 분석 뷰에서 1초 간격으로 시간을 이동시키면서 분석할 수 있습니다. 그래서 세션들의 전/후 움직임을 직접 확인 할 수 있습니다. 간단하게 설명드리면 어느 서버의 어떤 프로그램에서 db에 접속했고 어떤 쿼리를 실행시켰고 그 쿼리가 어떤 wait event를 발생시키고 있고, 어느 데이터 파일의 어느 블럭을 엑세스 하고 있는지 체크가 가능하며, 그 시점의 백그라운드 프로세스의 엑티브한 wait event까지 확인이 가능합니다.
바로 빠른 장애 원인 분석과 성능 저하 분석을 위한 툴입니다.

이 툴의 최고 장점은 응답지연이나 장애 원인의 명확한 증거를 찾아낼 때 입니다.
지금까지는 과거 시점에 장애 원인이나 성능저하를 분석하기위해서 고가의 모니터링 솔루션을 이용하거나, 그런 모니터링 솔루션이 없다면 ASH( active session history) 뷰를 조회하는 방법을 사용하곤 했습니다.
ASH 뷰 하나면 믿고 DB를 운영하는 DBA는 없을 겁니다. 정작 중요시점의 정보는 조회해도 없을 때가 많다는 것을 대부분의 DBA는 알고 있기 때문입니다.
그리고 ASH( active session history) 기능을 사용하려면 Enterprise edition 라이선스 외에 Diagnostics pack 이라는 추가적인 라이선스가 필요합니다.  이 부분은 DBA에게 매우 중요한 포인트인데,  만일 Standard edition일 경우에 ASH( active session history) 기능을 enable 해서 사용할 경우,  요즘 핫하게 이슈되고 있는 LMS의 타겟이 될 수 있습니다. 이 경우는 diagnostics pack 뿐만이 아니라 enterprise edition 라이선스 위반이 되기 때문에 standard edition 의 구매 금액대와는 차원이 다르게 심각해질 수 있게 됩니다.   이 부분은 여기를 참조해보세요 https://docs.oracle.com/database/121/DBLIC/options.htm#DBLIC165

간단한 사용 방법 링크.

how to access oracle sga directly with c code

Zamong is free  oracle monitoring software with DMA method.

dma_picture

What is Direct oracle sga Memory Access ?

This example is from an AIX environment.
On linux, address value is differ from aix.

SQL>  select * from x$ksmmem  where rownum < 10 ;

ADDR                   INDX    INST_ID KSMMMVAL
---------------- ---------- ---------- ----------------
0700000000000000          0          1 00
0700000000000008          1          1 0700000514334020
0700000000000010          2          1 00
0700000000000018          3          1 00
0700000000000020          4          1 00
0700000000000028          5          1 00
0700000000000030          6          1 00
0700000000000038          7          1 00
0700000000000040          8          1 00

9 rows selected.

“0700000000000000” address is sga start address.

oracle@PaCG:/oracle> ipcs -mba
IPC status from /dev/mem as of Thu 
T        ID     KEY        MODE       OWNER    GROUP  CREATOR   CGROUP NATTCH     SEGSZ  CPID  LPID   ATIME    DTIME    CTIME 
Shared Memory:
m   1048576   00000000 --rw-r-----     grid      dba     grid      dba     32 318767104 4456886 58524018 21:41:51 21:41:51  5:38:14
m   5242882   00000000 --rw-r-----     grid      dba     grid      dba     32   3678208 4456886 58524018 21:41:51 21:41:51  5:38:14
m         3 0x8895c820 --rw-r-----     grid      dba     grid      dba     32      8192 4456886 58524018 21:41:51 21:41:51  5:38:14
m   1048581 0x3bea2a94 --rw-r-----   oracle      dba   oracle      dba   2404     16384 9371670 23593476 21:55:27 21:55:27  6:00:24
m   1048582   00000000 --rw-r-----   oracle      dba   oracle      dba   2404 21340618752 9371670 23593476 21:55:27 21:55:27  6:00:24
m   3145735   00000000 --rw-r-----   oracle      dba   oracle      dba   2404 134217728 9371670 23593476 21:55:27 21:55:27  6:00:24

shared memory id : 3145735

This is simple example of attaching oracle shared memory.

linux firewall command example

you can use linux firewall to open a port.
Linux operating systems using firewall utility ‘Iptables’ service is built for Linux operating systems(centos 5.x ~ 6.x).
In Centos 7.x, The default firewall system has changed.
CentOS 7, a firewall system called ‘firewalld’ was installed by default.

[example - iptables command for centos5.x ~ 6.x.    as root user]
1) iptables configuration for mariadb or mysql 

    iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT 
    service iptables save
    service iptables restart

2) iptables configuration for apatch http 

    iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
    service iptables save 
    service iptables restart 



[example - firewalld command for centos7.x]
1) stop firewalld 

    systemctl stop firewalld

2) prevent the firewall from running when rebooting 

    systemctl disable firewalld

3) open ports 

    firewall-cmd --zone=public --add-port=3306/tcp --permanent 
    firewall-cmd --zone=public --add-port=80/tcp --permanent 
    firewall-cmd --reload 

4) check list of opened ports 

    firewall-cmd --list-ports


What is Direct oracle sga Memory Access ?

DMA method for oracle monitoring collects Oracle DB internal status(v$sysstat, v$system_event) and active session details(v$session, sql-text .. ) without accessing Oracle DB.
Direct memory access is really fast and light enough to be done more than 100 times per second.
how to access oracle sga directly with c code

Query based DB monitoring method is performed by executing many recursive queries internally in the DB in order to execute queries for db monitoring. These recursive queries can cause latch contention in the shared pool.

Query-based DB monitoring solution might be a good idea if these indicators are normal, such as the server’s query response time, cpu usage, active session count, etc.
However, as the db response time increases, the number of active sessions increases, using a query-based DB monitoring method is dangerous because it can further increase the latch contention in the shared pool.

Zamong is free  oracle monitoring software with DMA method.

How to give non-DBA user kill session privileges ?

Sometimes developers want to have ability to kill their own sessions.
Apparently it is not safe to let a non-DBA user to have a right to execute the “ALTER SYSTEM” command.

connect scott/XXXXX

select 
     sid,  
     serial#,  
     username,  
     machine,  
     program ,  
     (select sql_text  from v$sql b where b.sql_id=a.sql_id and rownum <= 1 ) current_sql_str,
     (select sql_text  from v$sql b where b.sql_id=a.prev_sql_id and rownum <= 1 ) previous_sql_str
from v$session  a
--   where 
--       username = 'SCOTT'
---  and event like '%enq%'
--   and machine like '%WORKGROUP%'
order by username, machine, sid  ;


SID     SERIAL#    USERNAME     MACHINE              PROGRAM               CURRENT_SQL_STR                          PREVIOUS_SQL_STR
4241    64469       SCOTT       DESKTOP-MONITOR      SQL Developer         select * from TB_SALE_ACCEPT_HIS        select count(*) from   TB_SALE_ACCEPT_HIS 
2573    42393       SALEAP      IK_APP_SER           JDBC Thin Client                                              select value$ from props$ where name = 'GLOBAL_DB_NAME'


  

begin
sys.sp_kill_dev_session( 4241 , 64469  )  ;
end ;
/

How to safely grant ALTER SYSTEM KILL SESSION privileg to non-DBA users

SQL> connect /as sysdba
Connected.



CREATE OR REPLACE PROCEDURE sys.sp_kill_dev_session(p_sid NUMBER, p_serial NUMBER)
AS
    v_user VARCHAR2(30);
BEGIN
    SELECT MAX(username)
    INTO v_user
    FROM v$session
    WHERE sid = p_sid
      AND serial# = p_serial;

    IF v_user IN ('SCOTT') THEN --the list can be extended
         EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || p_sid || ',' || p_serial || '''';
    ELSIF v_user IS NULL THEN
         RAISE_APPLICATION_ERROR(-20001,'Session has Expired or Invalid sid/serial Arguments Passed');
    ELSE
         RAISE_APPLICATION_ERROR(-20002,'Unauthorized Attempt to Kill a Non-Dev Session has been Blocked.');
    END IF;
END sp_kill_dev_session;
/

Procedure created.


SQL> grant execute on sys.sp_kill_dev_session  to scott;


SQL> grant select on sys.v_$session to scott ;
 

Source of PL/SQL procedure : https://sqlpatterns.wordpress.com/2015/03/02/how-to-safely-grant-alter-system-kill-session-privilege-to-non-dba-users/

How to kill pid of oracle session processes immediately

How to create immediately “kill -9 pid “command that can be used when server is in high cpu usage.

select  'kill -9 '|| b.spid from v$session a, v$process b
where a.paddr=b.addr
--and a.program  = 'oracle@SALESDB (TNS V1-V3)'
--and a.machine  = 'pamsaser01'
--and a.sqlid    = 'g6u556kt6pvb3'
--and a.username = 'SCOTT'
and a.status ='ACTIVE'
;
 
 
kill -9 14987
kill -9 14989
kill -9 14991
kill -9 14995
kill -9 14997
kill -9 14999
kill -9 15001
kill -9 15003
kill -9 15005
kill -9 15007
 

aix oracle 12c Installation Fails, rtld: 0712-001 Symbol CreateIoCompletionPort was referenced

when you create database with dbca

UnsatisfiedLinkError exception loading native library: njni12
java.lang.UnsatisfiedLinkError: njni12 (rtld: 0712-001 Symbol CreateIoCompletionPort was referenced
from module /u01/products/rdbms_12102/lib/libnjni12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-001 Symbol GetMultipleCompletionStatus was referenced
from module /u01/products/rdbms_12102/lib/libnjni12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-002 fatal error: exiting.)
Exception in thread "main" java.lang.UnsatisfiedLinkError: oracle/net/common/NetGetEnv.get(Ljava/lang/String;)Ljava/lang/String;

The installation logs shows the following relink error:

exec(): 0509-036 Cannot load program sqlplus because of the following errors:
rtld: 0712-001 Symbol CreateIoCompletionPort was referenced
from module /appl/oracle/product/12.1.0/dbhome_1/lib/libttsh12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-001 Symbol GetMultipleCompletionStatus was referenced
from module /appl/oracle/product/12.1.0/dbhome_1/lib/libttsh12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-002 fatal error: exiting.

sqlplus , lsnrctl command fails with below error

exec(): 0509-036 Cannot load program sqlplus because of the following errors:
rtld: 0712-001 Symbol CreateIoCompletionPort was referenced
from module /appl/oracle/product/12.1.0/dbhome_1/lib/libttsh12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-001 Symbol GetMultipleCompletionStatus was referenced
from module /appl/oracle/product/12.1.0/dbhome_1/lib/libttsh12.so(), but a runtime definition
of the symbol was not found.
rtld: 0712-002 fatal error: exiting.


IOCP module should be enabled on the server.

$ lsdev | grep iocp
  iocp0       Defined  I/O Completion Ports

   By default, IOCP is set to Defined.

Enable the “iocp” option and relink the oracle binaries.
To enable IOCP, set IOCP to Available using the following procedure:

Log in as root and run the following command:

# smitty iocp
Select Change / Show Characteristics of I/O Completion Ports.

Change configured state at system restart from Defined to Available.

Run the lsdev command to confirm the IOCP status is set to Available:

$ lsdev | grep iocp
iocp0 Available I/O Completion Ports

Perform a system restart to make the changes permanent.

Relink the binaries using " relink all " and then root.sh as root user.

There is no impact on Existing Oracle Databases installed on server if IOCP status is set to Available.

Zamong is free  oracle monitoring software with DMA method.

dma_picture

AIX “oslevel -s ” numbers mean

If your system is running AIX 5.3 TL 6 or anything later, “oslevel -s” will look something like this: 6100-02-06-0943. Breaking that down, the first four numbers show the AIX base level. In this example, it’s 6100, which means we’re running AIX 6.1. Next is the Technology Level (TL), followed by the number of the Service Pack (SP).The last four digits show the release date of the Service Pack using the format YYWW (YY for the year, then WW for the week of the year). So, if your “oslevel -s” command reports 6100-02-06-0943, then you know you’re on AIX 6.1, running TL 2, with SP 6. The “0943” tells you that Service Pack came out in week 43 of 2009. It’s time to update your system.

How to send mail using PL/SQL

First, You must have mail server and port 25 should be open.
You can check if the port is open with the telnet command as follows:
telnet 192.10.1.160 25
Second, You need to create access control list (ACL) in oracle database 11g.
In 10g, you do not have to do that.
Oracle Database 12c has deprecated many of the procedures and functions in the DBMS_NETWORK_ACL_ADMIN package.
Although deprecated, the old functionality is retained for backwards compatibility.
You can use access control entry (ACE) in 12c.

CREATE OR REPLACE PROCEDURE SYSTEM.TEST_SEND_MAIL
IS

  time_str       varchar2(20) ;
  c             utl_smtp.connection;
  v_line        varchar2(4000);
  v_status      number ;
  n             number := 1;
  err_msg       varchar2(4000);

BEGIN

   dbms_output.enable(1000000);
   dbms_output.put_line('');
   dbms_output.put_line('-----------------start-----------------------');



   select to_char(sysdate,'yyyymmdd hh:mi:ss') into time_str from dual ;
   dbms_output.put_line( time_str) ;

   dbms_output.put_line('--------------------end---------------------');
 
   c := utl_smtp.open_connection('192.10.1.160');  -- mail server ip

   utl_smtp.mail(c, 'jeniffer@abc.com');
   utl_smtp.rcpt(c, 'scott@abc.com');
   utl_smtp.rcpt(c, 'stella@abc.com');

  utl_smtp.open_data(c);
  utl_smtp.write_raw_data(c, UTL_RAW.CAST_TO_RAW('From: jeniffer@abc.com'||chr(13)||chr(10)));
  utl_smtp.write_raw_data(c, UTL_RAW.CAST_TO_RAW('To: scott@abc.com'||chr(13)||chr(10)));
  utl_smtp.write_raw_data(c, UTL_RAW.CAST_TO_RAW('Subject: this is a test mail'||chr(13)||chr(10)));

  loop

    dbms_output.get_line(v_line, v_status);
    if v_status = 0
      then
        utl_smtp.write_raw_data(c, UTL_RAW.CAST_TO_RAW(v_line||chr(13)||chr(10)));
        n := n + 1;
      else
      exit;
    end if;

  end loop;

  utl_smtp.close_data(c);
  utl_smtp.quit(c);

END ;
/




sql> execute SYSTEM.TEST_SEND_MAIL ;
PL/SQL procedure successfully completed.
  
  

 

In 11g, If you get error messages like the following
ERROR at line 1:
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at “SYS.UTL_TCP”, line 17

you must create acl and assign connect privilege

1. create your custom procedure

connect / as sysdba

set serveroutput on

create or replace procedure test_mailserver_acl(
 aacl varchar2,
 acomment varchar2,
 aprincipal varchar2,
 aisgrant boolean,
 aprivilege varchar2,
 aserver varchar2,
 aport number)
is

begin

 begin
    DBMS_NETWORK_ACL_ADMIN.DROP_ACL(aacl);
    dbms_output.put_line('ACL dropped.....');

    exception
    when others then
    dbms_output.put_line('Error dropping ACL: '||aacl);
    dbms_output.put_line(sqlerrm);
 end;

 begin
    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(aacl,acomment,aprincipal,aisgrant,aprivilege);
    dbms_output.put_line('ACL created.....');

    exception
    when others then
    dbms_output.put_line('Error creating ACL: '||aacl);
    dbms_output.put_line(sqlerrm);
 end;

 begin
    DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(aacl,aserver,aport);
    dbms_output.put_line('ACL assigned.....');

    exception
    when others then
    dbms_output.put_line('Error assigning ACL: '||aacl);
    dbms_output.put_line(sqlerrm);
 end;

 commit;
 dbms_output.put_line('ACL commited.....');
end;
/

2. create acl and assign privilege on ip 192.10.1.160 port 25 with your custom procedure.

begin
 test_mailserver_acl(
 'mailserver_acl.xml',
 'ACL for used Email Server to connect',
 'SCOTT',
  TRUE,
 'connect',
 '192.10.1.160',
 25);
end;
/

 

Zamong is free  oracle monitoring software with DMA method.

dma_picture

운영환경에서 테이블의 Range 파티션 추가 절차 -1

[ Procedure for adding range partitions in production environment ] DBA 들은 12월이 되면 파티션 테이블에 대해 다음년도의 파티션 추가 작업을 하게 되는데, 파티션 테이블들은 대용량 테이블일 경우가 많고, 쿼리에 자주 사용되는 메인 테이블일 경우가 많아, 연말 파티션 추가 작업시 여러가지 고려해야 할 사항들이 많다.
아마 가장 큰 이슈는 지금 추가 할 파티션이, 3~4년 후 진행될 파티션 drop 작업 후, 그 테이블스페이스가 차지하고 있던 공간을 회수해야 하는 이슈가 있거나(디스크 용량 관리 차원), 2017년 12월에 신규 파티션이 추가됨으로 인해서, 2018년 1월 1일부터는 2018년 1월 파티션 데이터를 조회하게 될때, 빈 파티션 통계정보로 인해 SQL PLAN이 변경되어 그로인한 서비스 장애 이슈가 핵심일 것이다.
먼저 파티션 추가 작업의 예이다.

파티션 키 정보 확인

SELECT A.OWNER, TABLE_NAME, A.COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM DBA_TAB_COLUMNS A,
    (
    select OWNER,NAME,COLUMN_NAME from DBA_PART_KEY_COLUMNS
    WHERE (OWNER,NAME )IN (
         select OWNER,TABLE_NAME from dba_part_tables
         where owner not in ('SYS', 'SYSTEM')
        )
    ) B
WHERE A.OWNER=B.OWNER
AND   A.TABLE_NAME= B.NAME
AND  A.COLUMN_NAME=B.COLUMN_NAME
ORDER BY A.OWNER, TABLE_NAME, A.COLUMN_NAME  ;
 
 
OWNER      TABLE_NAME        COLUMN_NAME      DATA_TYPE     DATA_LENGTH
------     ----------        -----------      ---------     ----------
SCOTT      TB_ORDER          OR_DATE          VARCHAR2       8
SCOTT      TB_SALE           SALE_DATE        VARCHAR2       8
SCOTT      TB_SUM            SUM_ID           NUMBER         22

그외 체크해야 할 뷰
SELECT * FROM DBA_PART_INDEXES ;
SELECT * FROM DBA_PART_TABLES ;
SELECT * FROM DBA_TAB_PARTITIONS ;
SELECT * FROM DBA_IND_PARTITIONS ;

작업 순서

1) MAX 파티션에 데이터가 있는지 체크
   SELECT COUNT(*) FROM SCOTT.TB_SALE PARTITION (P_MAX) ;

2) MAX 파티션에 데이터가 있으면 데이터를 임시 테이블에 저장한 후 MAX 파티션을 DROP
   alter table SCOTT.TB_SALE drop partition P_MAX;
 
3) 새로운 파티션이 저장될 TABLESPACE를 생성
   (만약 대용량 테이블이라면 각 파티션의 테이블스페이스를 특정한 기준별로 분리해준다.
    그러면 나중에 과거 파티션을 삭제하게 될 때, 해당 테이블스페이스만 DROP 할수 있어, 쉽게 공간을 회수할 수 있다) 
   create tablespace TBS_SALE_2018_DAT datafile '/data1/KDB/TBS_SALE_2018_DAT_01.DBF' size 1G autoextend on next 500m ;
   create tablespace TBS_SALE_2018_IDX datafile '/data1/KDB/TBS_SALE_2018_IDX_01.DBF' size 1G autoextend on next 500m ;
 
4) 새로 생성될 파티션이 저장될 곳을 지정한다. 
    (파티션 테이블의 테이블스페이스 속성변경 )
    alter table SCOTT.TB_SALE MODIFY DEFAULT ATTRIBUTES TABLESPACE TBS_SALE_2018_DAT;
    이 부분은 아래 파티션 ADD 스크립트처럼 TABLESPACE 명을 직접 스크립트에 명시해도 된다. 

5)  파티션 인덱스는 아래처럼 인덱스의 각 파티션이 저장될 곳을 지정한다 
    (파티션 인덱스의 테이블스페이스 속성변경 )
    alter index SCOTT.TB_SALE_IX01 MODIFY DEFAULT ATTRIBUTES TABLESPACE TBS_SALE_2018_IDX;
    alter index SCOTT.TB_SALE_IX02 MODIFY DEFAULT ATTRIBUTES TABLESPACE TBS_SALE_2018_IDX;
    alter index SCOTT.TB_SALE_IX03 MODIFY DEFAULT ATTRIBUTES TABLESPACE TBS_SALE_2018_IDX;

6)  파티션을 추가한다.
 
    alter table SCOTT.TB_SALE add partition P_201801 values less than ('20180201') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201802 values less than ('20180301') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201803 values less than ('20180401') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201804 values less than ('20180501') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201805 values less than ('20180601') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201806 values less than ('20180701') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201807 values less than ('20180801') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201808 values less than ('20180901') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201809 values less than ('20181001') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201810 values less than ('20181101') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201811 values less than ('20181201') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_201812 values less than ('20190101') tablespace TBS_SALE_2018_DAT;
    alter table SCOTT.TB_SALE add partition P_MAX    values less than (MAXVALUE)   tablespace TBS_SALE_2018_DAT;

 

Zamong is free  oracle monitoring software with DMA method.

dma_picture