duplicate database to another host

pre-duplicate

alter system set cluster_database=false scope=spfile sid='*';

duplicate

-- shutdown auxiliary database
-- startup nomount

-- rman script
run
{
}

-- run command
rman catalog rcat/rcat@rcatdb auxiliary / msglog= cmdfile=

post-duplicate

alter system set cluster_database=true scope=spfile sid='*';

create physical standby in oracle 12

prepare standby

prepare primary

rman duplicate

-- backup primary
run
{
sql "alter system switch logfile";
sql "alter system checkpoint";
backup database;
backup archivelog all delete input;
backup current controlfile for standby;
}

-- duplicate to auxiliary
run
{
  duplicate target database for standby nofilenamecheck dorecover;
}

dataguard broker setup

enable/disable log transport

validation

oracle enable archivelog mode

SQL> ALTER SYSTEM SET log_archive_dest_1='location=+DG1' SCOPE=spfile sid='*';
SQL> ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=spfile sid='*';

srvctl stop database -d ORCL -o immediate
srvctl start database -d ORCL -o mount

SQL> ALTER DATABASE ARCHIVELOG;

srvctl stop database -d ORCL -o immediate
srvctl start database -d ORCL

oracle emcli usage

emcli get_threshold 
      -target_name="DBNAME.XYZ.COM" 
      -target_type="rac_database" 
      -metric="problemTbsp" 

emcli modify_threshold 
      -target_name='DBNAME.XYZ.COM' 
      -target_type='rac_database' 
      -metric='problemTbsp' 
      -column='bytesFree' 
      -key_columns='USERS;' 
      -warning_threshold='3000' 
      -critical_threshold='1500' 
      -prevent_override='1'

oracle database services configuration

using srvctl command

srvctl add service -db CDB1 -s SALES.XYZ.COM -pdb PDB1 -preferred CDB11,CDB12
srvctl start service -db CDB1 -s SALES.XYZ.COM -instance CDB11
srvctl start service -db CDB1 -s SALES.XYZ.COM -instance CDB12

srvctl config service -db CDB1
srvctl status service -db CDB1

srvctl stop service -db CDB1 -s SALES.XYZ.COM -instance CDB11
srvctl stop service -db CDB1 -s SALES.XYZ.COM -instance CDB12
srvctl remove service -db CDB1 -s SALES.XYZ.COM

using packages

exec DBMS_SERVICE.STOP_SERVICE('SALES.XYZ.COM','CDB11');
exec DBMS_SERVICE.STOP_SERVICE('SALES.XYZ.COM','CDB12');
exec DBMS_SERVICE.DELETE_SERVICE('SALES.XYZ.COM');

exec DBMS_SERVICE.CREATE_SERVICE('SALES.XYZ.COM', 'SALES.XYZ.COM');
exec DBMS_SERVICE.START_SERVICE('SALES.XYZ.COM', 'CDB11');
exec DBMS_SERVICE.START_SERVICE('SALES.XYZ.COM', 'CDB12');

DBMS_SERVICE.STOP_SERVICE(service_name   IN VARCHAR2, instance_name  IN VARCHAR2);
DBMS_SERVICE.DELETE_SERVICE(service_name IN VARCHAR2);
DBMS_SERVICE.CREATE_SERVICE(service_name IN VARCHAR2, network_name IN VARCHAR2);
DBMS_SERVICE.START_SERVICE(service_name  IN VARCHAR2, instance_name IN VARCHAR2);

oracle RMAN script

RMAN configuration

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 15 DAYS;
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO SBT_TAPE;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE SBT_TAPE TO '%F';
CONFIGURE DEVICE TYPE SBT_TAPE PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 2;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 2;
CONFIGURE CHANNEL DEVICE TYPE SBT_TAPE TRACE 0 PARMS 'BLKSIZE=, SBT_LIBRARY=,ENV=(STORAGE_UNIT=,BACKUP_HOST=)';
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DISKG1/rman/<>';

RMAN script

run {
  set command id to 'COLD_BACKUP';
  backup tag 'cold_backup_yymmdd'
    filesperset 4
    format 'D_%d_%p_%u','tape2.xyz.com/D_%d_%p_%u'
    database;
  backup current controlfile format 'C_%d_%p_%u','tape2.xyz.com/C_%d_%p_%u';
  backup spfile format 'S_%d_%p_%u','tape2.xyz.com/S_%d_%p_%u';
}

oracle datapump parfile

-- exp.par
DIRECTORY=
SCHEMAS=SCOTT,\"ABC.XYZ\"
PARALLEL=
EXCLUDE=STATISTICS
dumpfile=name_00_%u.dmp
FLASHBACK_TIME=systimestamp
compression=all

-- imp.par
DIRECTORY=
SCHEMAS=SCOTT,\"ABC.XYZ\"
PARALLEL=
JOB_NAME=
LOGFILE=name_imp.log
dumpfile=name_00_%u.dmp

-- imp_net.par
DIRECTORY=
SCHEMAS=SCOTT,\"ABC.XYZ\"
PARALLEL=
JOB_NAME=
LOGFILE=name_imp.log
NETWORK_LINK=

using LONG datatype in sql

In order to use LONG datatype, first convert to xml, then extract value from xml.
One example is DBA_TAB_PARTITIONS.HIGH_VALUE,

with xml as (
  select dbms_xmlgen.getxmltype('
         select table_owner,
                table_name, 
                tablespace_name,
                partition_name,
                partition_position,
                round((blocks * 8192)/1024/1024,0) size_mb, 
                high_value 
           from dba_tab_partitions 
          where table_name = ''&table'' 
            and table_owner = ''&schema''') as x
  from   dual)
  select  extractvalue(rws.object_value, '/ROW/TABLE_OWNER') table_owner,
          extractvalue(rws.object_value, '/ROW/TABLE_NAME') table_name,
          extractvalue(rws.object_value, '/ROW/TABLESPACE_NAME') tablespace_name,
          extractvalue(rws.object_value, '/ROW/PARTITION_NAME') partition_name,
          extractvalue(rws.object_value, '/ROW/PARTITION_POSITION') partition_POSITION,
          extractvalue(rws.object_value, '/ROW/SIZE_MB') size_mb,
          extractvalue(rws.object_value, '/ROW/HIGH_VALUE') high_value
   from   xml x,
          table(xmlsequence(extract(x.x, '/ROWSET/ROW'))) rws 

oracle DML session progress

To find out the progress of a DML session, you can run the following query.

select s.inst_id,
       s.username,
       sid,
       serial#, 
       substr(s.program, 1, 19) program, 
       t.used_urec,
       t.used_ublk
  from gv$session s, 
       gv$transaction t
where s.saddr = t.ses_addr
;

exchange table partition

The basic steps are, create temporary table, insert data into temporary table, create all indexes on temporary table, exchange partition, drop temporary table.

create table sales.weekly_sale_part_891 
tablespace tbsp_name;
as 
select * 
from sales.weekly_sale 
where 1=2
;

insert /*+ append */ 
into sales.weekly_sale_part_891  
select * 
from sales.weekly_sale partition (SYS_P891) 
;

create index sales.weekly_sale_idx_p891 
on sales.weekly_sale_part_891 (c1, c2, ..) 
tablespace tbsp_name;
;


alter table sales.weekly_sale 
exchange partition SYS_P891 
with table sales.weekly_sale_part_891
; 

alter index sales.weekly_sale_idx
rebuild partition SYS_P891 
tablespace tbsp_name; 
;

drop table sales.weekly_sale_part_891;