Invisible Indexes in Oracle Database

Oracle permite ca indecșii să fie marcați ca invizibili. Indecșii invizibili sunt menținuți ca orice alt index, dar sunt ignorați de optimizator, cu excepția cazului în care parametrul OPTIMIZER_USE_INVISIBLE_INDEXES este setat la TRUE la nivel de instanță sau sesiune. Indecșii pot fi creați ca fiind invizibili folosind cuvântul cheie INVISIBLE, iar vizibilitatea lor poate fi comutată folosind comanda ALTER INDEX.

create index index_name on table_name(column_name) invisible;

alter index index_name invisible;
alter index index_name visible;

Indicii invizibili pot fi utili pentru procesele cu nevoi specifice de indexare, unde prezența indicilor poate afecta negativ alte zone funcționale. De asemenea, sunt utile pentru testarea impactului adăugării sau eliminării unui index.

Următorul script creează și populează un tabel, apoi creează un index invizibil pe acesta. create table tab1 as select level as id from dual connect by level <= 10000; create index ind1_id on tab1(id) invisible; exec dbms_stats.gather_table_stats(null, ‘tab1’, cascade=> true);

Starea curentă de vizibilitate a unui index este indicată de coloana VIZIBILITATE a vizualizărilor [DBA|ALL|USER]_INDEXES.

column index_name format a30
column visibility format a10

select index_name, visibility
from   user_indexes;

INDEX_NAME                     VISIBILITY
------------------------------ ----------
IND1_ID                      INVISIBLE

O interogare care utilizează coloana indexată din clauza WHERE ignoră indexul și efectuează o scanare completă a tabelului.

select * from tab1 where id = 9999;

select * from table(dbms_xplan.display_cursor);

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |     7 (100)|          |
|*  1 |  TABLE ACCESS FULL| TAB1   |     1 |     4 |     7   (0)| 00:00:01 |
----------------------------------------------------------------------------

Setarea parametrului OPTIMIZER_USE_INVISIBLE_INDEXES face ca indexul să fie disponibil pentru optimizator.

alter session set optimizer_use_invisible_indexes=true;

select * from tab1 where id = 9998;

select * from table(dbms_xplan.display_cursor);

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |       |       |     1 (100)|          |
|*  1 |  INDEX RANGE SCAN| IND1_ID |     1 |     4 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------

Dacă faceți indexul vizibil, acesta este încă disponibil pentru optimizator atunci când parametrul OPTIMIZER_USE_INVISIBLE_INDEXES este resetat.

alter session set optimizer_use_invisible_indexes=false;
alter index ii_tab_id visible;

select * from TAB1 where id = 9997;

select * from table(dbms_xplan.display_cursor);

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |          |       |       |     1 (100)|          |
|*  1 |  INDEX RANGE SCAN| IND1_ID  |     1 |     4 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------
 

Dacă faceți din nou indexul invizibil, acesta nu mai este disponibil pentru optimizator.

alter index ind1_id invisible;

select * from tab1 where id = 9996;

select * from table(dbms_xplan.display_cursor);

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |       |       |     7 (100)|          |
|*  1 |  TABLE ACCESS FULL| TAB1  |     1 |     4 |     7   (0)| 00:00:01 |
----------------------------------------------------------------------------
[mai mult...]

Enterprise Manager Database Express in Database 12c Release 1

Key things to remember about Enterprise Manager Database Express.

  • EM DB Express is not Cloud Control or Grid Control!
  • EM DB Express is not a replacement for the DB Control from 11g, as it has significantly less functionality.
  • A DBA will not be able to administer the database using just EM DB Express.

If your organisation uses Cloud Control, which it should, you will probably never use EM Database Express. If on the other hand you are playing around with the database and want a pretty interface to perform some tasks, the EM Database Express might be your answer.

Configuration

If you’ve done the sort of database installations described here, you’ve probably already got EM Database Express configured. Unlike the DB Control, it runs from inside the database using the XML DB infrastructure, so there are no additional parts to install or executables to start.

To get up and running, you just need to check the HTTPS port is set for the XML DB.

SQL> SELECT DBMS_XDB_CONFIG.gethttpport FROM dual;

GETHTTPPORT
-----------
          0

SQL> SELECT DBMS_XDB_CONFIG.gethttpsport FROM dual;

GETHTTPSPORT
------------
        5500

SQL> EXEC DBMS_XDB_CONFIG.sethttpsport(5500);

PL/SQL procedure successfully completed.


Once that is done, EM Database Express is accessible using the following type of URL.

https://<hostname>:<port>/em/

Example:

https://ol6-121.localdomain:5500/em/

 

Enter your database login details and click the “Login” button.

You are presented with the home page for the database.

Multitenant Configuration

For pluggable databases the configuration is a little different.

-- In the root container.
conn sys/SysPassword1@//localhost:1521/cdb1 as sysdba
exec dbms_xdb_config.sethttpsport(0);
exec dbms_xdb_config.setglobalportenabled(TRUE);

-- In each pluggable database.
conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba
exec dbms_xdb_config.sethttpsport(5500);
Usage

The menu structure for DB Express is quite simple.

Configuration
  - Initialization Parameters
  - Memory
  - Database Feature Usage
  - Current Database Properties

Storage
  - Undo Management
  - Redo Log Groups
  - Archive Logs
  - Control Files

Security
  - Users
  - Roles

Performance
  - Performance Hub
  - SQL Tuning Advisor

You will notice, there is very little in the way of administration screens. This is not a tool a DBA will use to administer the database. Most of the screens are self explanatory. The only really interesting screen is the Performance Hub, which actually looks nicer than the Cloud Control equivalent.

[mai mult...]

Instalare baza de date Oracle 19c pe Oracle Linux 8 (OL8)

Situatie

Acest articol descrie instalarea bazei de date Oracle 19c pe Oracle Linux 8 X64 (OL8)

1: Download Software
Download the Oracle software from OTN or My Oracle Support

2 Fișierul hosts
Fișierul „/etc/hosts” trebuie să conțină un nume complet calificat pentru server.

De exemplu.

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.100 oel8.localdomain oel8

Setați numele de gazdă corect în fișierul „/etc/hostname”.

oel7.localdomain

3: Cerințe preliminare de instalare Oracle ( prerechizite)

Efectuați fie Configurarea automată, fie Configurarea manuală pentru a îndeplini cerințele preliminare de bază. Configurarea suplimentară este necesară pentru toate instalările

3.1 Automatic Setup

Folosirea packetului oracle-database-preinstall-19c va instala si va configura automat o parte din cerintele necesare instalarii  bazei de date oracle 19c. Pentru instalare acestuia rulati conectat ca root urmatoarea comanda:

# yum install -y oracle-database-preinstall-19c

Configurare manuală

Dacă nu ați folosit pachetul „oracle-database-preinstall-19c” pentru a îndeplini toate cerințele preliminare, va trebui să efectuați manual următoarele configurari. Adăugați următoarele linii în fișierul „/etc/sysctl.conf” sau într-un fișier numit „/etc/sysctl.d/98-oracle.conf”.

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

Rulați una dintre următoarele comenzi pentru a modifica parametrii systemului de operare (kernel), în funcție de fișierul pe care l-ați editat.

/sbin/sysctl -p
# Or
/sbin/sysctl -p /etc/sysctl.d/98-oracle.conf

Adăugați următoarele linii într-un fișier numit „/etc/security/limits.d/oracle-database-preinstall-19c.conf”.

oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728

Următoarele pachete sunt necesare pentru instalarea Oracle.

dnf install -y bc    
dnf install -y binutils
#dnf install -y compat-libcap1
dnf install -y compat-libstdc++-33
#dnf install -y dtrace-modules
#dnf install -y dtrace-modules-headers
#dnf install -y dtrace-modules-provider-headers
#dnf install -y dtrace-utils
dnf install -y elfutils-libelf
dnf install -y elfutils-libelf-devel
dnf install -y fontconfig-devel
dnf install -y glibc
dnf install -y glibc-devel
dnf install -y ksh
dnf install -y libaio
dnf install -y libaio-devel
#dnf install -y libdtrace-ctf-devel
dnf install -y libXrender
dnf install -y libXrender-devel
dnf install -y libX11
dnf install -y libXau
dnf install -y libXi
dnf install -y libXtst
dnf install -y libgcc
dnf install -y librdmacm-devel
dnf install -y libstdc++
dnf install -y libstdc++-devel
dnf install -y libxcb
dnf install -y make
dnf install -y net-tools # Clusterware
dnf install -y nfs-utils # ACFS
dnf install -y python # ACFS
dnf install -y python-configshell # ACFS
dnf install -y python-rtslib # ACFS
dnf install -y python-six # ACFS
dnf install -y targetcli # ACFS
dnf install -y smartmontools
dnf install -y sysstat

# Added by me.
dnf install -y unixODBC

# New for OL8
dnf install -y libnsl
dnf install -y libnsl.i686
dnf install -y libnsl2
dnf install -y libnsl2.i686

Creați noile grupuri de utilizatori și utilizatorii.

groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
#groupadd -g 54324 backupdba
#groupadd -g 54325 dgdba
#groupadd -g 54326 kmdba
#groupadd -g 54327 asmdba
#groupadd -g 54328 asmoper
#groupadd -g 54329 asmadmin
#groupadd -g 54330 racdba

useradd -u 54321 -g oinstall -G dba,oper oracle

 

  • Additional Setup

Setați parola pentru utilizatorul „oracle”.

#passwd oracle

Setați Linux securizat la permisiv prin editarea fișierului „/etc/selinux/config”, asigurându-vă că marcajul SELINUX este setat după cum urmează.

SELINUX=permissive

Odată ce modificarea este completă, reporniți serverul sau executați următoarea comandă.

# setenforce Permissive

Dacă aveți paravanul de protecție Linux activat, va trebui să îl dezactivați sau sa il configurati. Pentru dezactivare folositi urmatoarele comenzi:

# systemctl stop firewalld
# systemctl disable firewalld

Creați directoarele în care va fi instalat software-ul Oracle.

mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02

Setati variabilele de system

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/19.0.0/dbhome_1

  • Instalarea

Conectați-vă la utilizatorul Oracle. Dacă utilizați X display, setați variabila de mediu DISPLAY.

DISPLAY=<server-name>:0.0; export DISPLAY

Dezarhivați software-ul direct in foldderul ORACLE_HOME și porniți Oracle Universal Installer (OUI) lansând una dintre următoarele comenzi în directorul ORACLE_HOME. Modul interactiv va afișa ecrane de instalare a GUI pentru a permite intrarea utilizatorului, în timp ce modul silențios va instala software-ul fără a afișa niciun ecran, deoarece toate opțiunile necesare sunt deja specificate pe linia de comandă.

# Unzip software.
cd $ORACLE_HOME
unzip -oq /path/to/software/LINUX.X64_193000_db_home.zip

# Fake Oracle Linux 7.
export CV_ASSUME_DISTID=OEL7.6

# Interactive mode.
./runInstaller

# Silent mode.
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${ORA_INVENTORY} \
SELECTED_LANGUAGES=en,en_GB \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSBACKUPDBA_GROUP=dba \
oracle.install.db.OSDGDBA_GROUP=dba \
oracle.install.db.OSKMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true

Rulați scripturile de administrare (root) când vi se solicită.

Ca utilizator root, executați următoarele scripturi:

1. /u01/app/oraInventory/orainstRoot.sh
2. /u01/app/oracle/product/19.0.0/dbhome_1/root.sh

Acum sunteți gata să creați o bază de date.

[mai mult...]

How to Trace Data Pump Using a Logon Trigger

The purpose of this document it to explain how Data Pump can be traced using a database logon trigger.

1. Create a database after logon trigger to enable Event 10046 for Data Pump  DM and DW processes :

sqlplus 

connect / as sysdba

 

CREATE OR REPLACE TRIGGER sys.DATA_PUMP_TRIGGER
AFTER LOGON ON DATABASE
DECLARE
  v_program v$session.program%TYPE;
  v_dyn_sql VARCHAR2(100)
BEGIN
  SELECT    substr (program, -5, 2)
  INTO   v_program
  FROM   v$session
  WHERE  sid = (SELECT DISTINCT sid FROM v$mystat);
  IF v_program = ‘DW’ or v_program= ‘DM’ THEN
    EXECUTE IMMEDIATE ‘alter session set tracefile_identifier = ‘||’datapump’;
    EXECUTE IMMEDIATE ‘alter session set statistics_level=ALL’;
    EXECUTE IMMEDIATE ‘alter session set max_dump_file_size=UNLIMITED’;
    EXECUTE IMMEDIATE ‘alter session set events ”10046 trace name context forever, level 12”’;
  END IF;
END;
/

2. Run Data Pump Export/Import with the following parameters added to the command line:

expdp/impdp …  METRICS=Y TRACE=480300

3. Check trace files generated in USER_DUMP_DEST or DIAGNOSTIC_DEST/diag/rdbms/<dbname>/<sid>/trace. Traces have the DPTRC identifiers enclosed in the name.

Example:

-rw-r—–. 1 oracle oinstall 24K Mar 20 17:15 <SID>_dw01_1233_datapump.trm
-rw-r—–. 1 oracle oinstall  7M Mar 20 17:15 <SID>_dw01_1233_datapump.trc
-rw-r—–. 1 oracle oinstall 40K Mar 20 17:15 <SID>_dm00_1234_datapump.trm
-rw-r—–. 1 oracle oinstall  5M Mar 20 17:15 <SID>_dm00_1234_datapump.trc

4. Run TKPROF on the trace files after Data Pump ends.

Example:

[oracle@<HOST> trace]$  tkprof <SID>_dw01_1233_datapump.trc <FILESYSTEM_PATH>/<SID>_dw01_1233_datapump.out waits=yes sort=exeela     

5. Drop SET_DP_TRIGGER

SQL> DROP TRIGGER SYS.SET_DP_TRACE;

[mai mult...]

How to Release Ownership of an ocfs2 Repository Force in Oracle VM

You are unable to release ownership of the problematic repository from the old environment, nor are you able to take ownership of the problematic repository from the new environment.

a. Identify LUN

# mounted.ocfs2 -d | grep xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
/dev/mapper/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx o2cb xxxxxxxxxxxxxxxx G xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx

b. Clean LUN with fsck and stamp it’s cluster’s ownership

# fsck.ocfs2 -y /dev/mapper/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

c. Mount LUN to /mnt temporarily

# mount /dev/mapper/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /mnt

d. Change OVS_REP_MGR_UUID to NONE:

# vi /mnt/.ovsrepo

OVS_REPO_UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OVS_REPO-VERSION=X.X
OVS_REP_MGR_UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OVS_REPO_ALIAS=Repository Name

change to

OVS_REPO_UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OVS_REPO-VERSION=X.X
OVS_REP_MGR_UUID=NONE
OVS_REPO_ALIAS=Repository Name

e. Unmount temporary mount at /mnt

# unmount /mnt

f. Log into the OVM CLI and list the filesystem

# ssh -l admin localhost -p 10000

OVM> list fileSystem

g. Log into the OVM Manager BUI

Go to Repositories tab.

Identify the repository disk (by disk lun) — In this example we choose 2, as it’s the 2nd disk or the 3rd repository disk.

h. From the previous output of the filesystem, identify 2nd

id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx name: fs on SAN Name (2)

i. From the CLI, refresh the repository disk:

OVM> refresh fileSystem id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

j. List repository

OVM> list repository

k. Identify the repository in question

id:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx name: Name of Repository

l. Go back to the OVM Manager BUI

  • Right-click on repository “Name of Repository’ and check the box “Take ownership”.
  • Now in the OVM Manager, refresh the repository “Name of Repository”.
[mai mult...]

Cum efectuați un export complet și să excludeți anumite scheme utilizând API-ul Data Pump?

Doriți să efectuați un export complet și să excludeți anumite scheme folosind API-ul Data Pump (dbms_datapump). Următorul exemplu demonstrează cum se efectuează această operație.

Doriți să exportați întreaga bază de date, dar doriți să excludeți SYSTEM și SYS folosind API-ul DataPump. Comanda pentru a efectua această operație din linia de comandă (expdp) arată astfel:

expdp system/<parolă> directory=DATA_PUMP_DIR dumpfile=EXPDAT%U.DMP FULL=y exclude=schemă:\”IN \(\’SYS\’,\’SYSTEM\’\)\”

Operația echivalentă folosind codul PL/SQL Data Pump API pentru a efectua aceeași operațiune ar arăta astfel:

connect system/parola

declare
h1 number; — Datapump handle
dir_name varchar2(30); — Directory Name

begin
dir_name := ‘DATA_PUMP_DIR’;
h1 := dbms_datapump.open(operation =>’EXPORT’,
job_mode =>’FULL’,
job_name =>’FULL MINUS SCHEMAS’,
version => ‘COMPATIBLE’);

 

dbms_datapump.set_parallel(handle => h1, degree => 1);
dbms_datapump.add_file(handle => h1,
filename => ‘EXPDAT.LOG’,
directory => dir_name,
filetype => 3);

dbms_datapump.set_parameter(handle => h1,
name => ‘KEEP_MASTER’,
value=> 0);

dbms_datapump.add_file(handle => h1,
filename => ‘EXPDAT%U.DMP’,
directory => dir_name,
filetype => 1);

dbms_datapump.set_parameter(handle => h1,
name => ‘INCLUDE_METADATA’,
value => 1);

dbms_datapump.set_parameter(handle => h1,
name => ‘DATA_ACCESS_METHOD’,
value => ‘AUTOMATIC’);

dbms_datapump.metadata_filter(handle => h1,
name => ‘NAME_EXPR’,
value =>’NOT IN(”SYS”,”SYSTEM”)’,
object_type => ‘SCHEMA’);

dbms_datapump.set_parameter(handle => h1,
name => ‘ESTIMATE’,
value =>’BLOCKS’);

dbms_datapump.start_job(handle => h1,
skip_current => 0, abort_step =>0);
dbms_datapump.detach(handle => h1);
end;
/

După examinarea logului de export (EXPDAT.LOG), veți putea vedea că schemele SYSTEM și SYS au fost excluse.

[mai mult...]

Cum faci refresh tabelelor locale utilizând API-ul DataPump

Aveți două baze de date (una locală și una la distanță) și intenționați să reîmprospătați unele tabele locale cu date din tabele la distanță. Pentru a demonstra acest lucru este creat următorul mediu:

connect / as sysdba

— test user
create user test identified by <password> default tablespace users temporary tablespace temp;
grant connect, resource to test;

— facem obiecte in schema TEST
connect test/parola

— test tables
create table a_tab
(
id number,
text varchar2(50)
);

create table b_tab
(
id number,
text varchar2(50)
);

— populare tabele de test
insert into a_tab values (1, ‘Remote schema, table A_TAB – Row 1’);
insert into a_tab values (2, ‘Remote schema, table A_TAB – Row 2’);
insert into b_tab values (1, ‘Remote schema, table B_TAB – Row 1’);
insert into b_tab values (2, ‘Remote schema, table B_TAB – Row 2’);
commit; 

 

create table transfer_objects
(
owner varchar2(30),
table_name varchar2(30),
object_type varchar2(30)
);

—  tabele ce for fi actualizate in  baza locala 
insert into transfer_objects values (‘TEST’, ‘A_TAB’, ‘TABLE’);
insert into transfer_objects values (‘TEST’, ‘B_TAB’, ‘TABLE’);
commit;

 

Baza de date locala (target)

 

connect / as sysdba

— directorul folosit pentru logurile DataPump 
create directory refresh as ‘<PATH>’;

— test user
create user test identified by <password> default tablespace users temporary tablespace temp;
grant connect, resource, create database link to test;
grant read, write on directory refresh to test;

— creare obiecte in schema TEST
connect test/parola

–Creare database link din local in remote
create database link link_to_remote connect to test identified by <password> using ‘<TNS alias to remote>’;

create table a_tab
(
id number,
text varchar2(50)
);

create table b_tab
(
id number,
text varchar2(50)
);

— populare tabele de tes
insert into a_tab values (1, ‘Local schema, table A_TAB – Row 1’);
insert into b_tab values (1, ‘Local schema, table B_TAB – Row 1’);
commit;

Porniți următorul bloc PL/SQL care apelează API-ul DataPump în baza de date locală pentru a reîmprospăta tabelele A_TAB/B_TAB de la distanță:

set serverout on size 1000000
declare
my_handle number; — Data Pump job handle
my_db_link varchar2(30) := ‘LINK_TO_REMOTE’;
ind NUMBER; — Loop index
percent_done NUMBER; — Percentage of job complete
job_state VARCHAR2(30); — To keep track of job state
le ku$_LogEntry; — For WIP and error messages
js ku$_JobStatus; — The job status from get_status
jd ku$_JobDesc; — The job description from get_status
sts ku$_Status; — The status object returned by get_status

begin
— creare job 
my_handle := dbms_datapump.open
(
operation => ‘IMPORT’,
job_mode => ‘TABLE’,
remote_link => my_db_link
);

dbms_output.put_line (‘Opened DataPump job with handle: ‘||to_char (my_handle));dbms_datapump.set_parallel (my_handle, 1);
dbms_output.put_line (‘Added parallel’);

dbms_datapump.set_parameter
(
handle => my_handle,
name => ‘TABLE_EXISTS_ACTION’,
value => ‘REPLACE’
);
dbms_output.put_line (‘Added parameter REPLACE’);

dbms_datapump.add_file
(
handle => my_handle,
filename => ‘impdp_test.log’,
directory => ‘REFRESH’,
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE
);
dbms_output.put_line (‘Added log file’);

dbms_datapump.metadata_filter
(
handle => my_handle,
name => ‘NAME_EXPR’,
value => ‘IN (SELECT TABLE_NAME FROM TEST.TRANSFER_OBJECTS WHERE OWNER = ”TEST” AND OBJECT_TYPE = ”TABLE”)’,
object_type => ‘TABLE’
);
dbms_output.put_line (‘Added metadata filter’);

dbms_datapump.start_job (my_handle);

percent_done := 0;
job_state := ‘UNDEFINED’;
while (job_state != ‘COMPLETED’) and (job_state != ‘STOPPED’) loop
dbms_datapump.get_status
(
my_handle,
dbms_datapump.ku$_status_job_error +
dbms_datapump.ku$_status_job_status +
dbms_datapump.ku$_status_wip, -1 , job_state, sts
);
js := sts.job_status;

if js.percent_done != percent_done then
dbms_output.put_line (‘*** Job percent done = ‘||to_char (js.percent_done));
percent_done := js.percent_done;
end if;

if (bitand (sts.mask, dbms_datapump.ku$_status_wip) != 0) then
le := sts.wip;
else
if (bitand (sts.mask, dbms_datapump.ku$_status_job_error) != 0) then
le := sts.error;
else
le := null;
end if;
end if;

if le is not null then
ind := le.FIRST;
while ind is not null loop
dbms_output.put_line (le(ind).LogText);
ind := le.NEXT(ind);
end loop;
end if;
end loop;

dbms_output.put_line (‘Job has completed’);
dbms_output.put_line (‘Final job state = ‘||job_state);
dbms_datapump.detach (my_handle);
end;
/

Outputul ar trebui sa fie ca in exemplul de mai jos:

Opened DataPump job with handle: 18
Added parallel
Added parameter REPLACE
Added log file
Added metadata filter
Starting “TEST”.”SYS_IMPORT_TABLE_01″:
Estimate in progress using BLOCKS method…
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 128 KB
. . imported “TEST”.”A_TAB” 2 rows
. . imported “TEST”.”B_TAB” 2 rows
*** Job percent done = 100
Job “TEST”.”SYS_IMPORT_TABLE_01″ successfully completed at 13:22:54
Job has completed
Final job state = COMPLETED

PL/SQL procedure successfully completed.

Conținutul tabelelor locale după importul DataPump este următorul:

SQL> select * from a_tab;

ID TEXT
————— ————————————————–
1 Remote schema, table A_TAB – Row 1
2 Remote schema, table A_TAB – Row 2

SQL> select * from b_tab;

ID TEXT
————— ————————————————–
1 Remote schema, table B_TAB – Row 1
2 Remote schema, table B_TAB – Row 2

[mai mult...]

Configure RMAN to purge archivelogs after applied on standby

To automatically purge the archivelogs from the FRA, using RMAN, once they are applied to the standby database we have to:

Configure the following parameter in RMAN (standby):

RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;

Starting from 11g, we have enhanced the configure archivelog deletion policy to include TO APPLIED ON [ALL] STANDBY [BACKED UP n TIMES TO DEVICE TYPE ]. This will ensure that the archivelogs is applied as well as backed up on primary before it is being purged.

The archivelog must have been applied to the standby. Run the following query to list all archivelogs applied to the standby:

select a.thread#, a.sequence#, a.applied
from v$archived_log a, v$database d
where a.activation# = d.activation#
and a.applied=’YES’
/

If there is space pressure in the FRA, the archive logs will be automaticly deleted. When an archivelog is automatically deleted from the FRA, you will see this in the database’s alert.log:

Sat Feb 04 12:16:35 2023
Deleted Oracle managed file /opt/app/oracle/FRA/<DB_NAME>/archivelog/2023_01_30/o1_mf_1_22_a12fds3a_.arc
Deleted Oracle managed file /opt/app/oracle/FRA/<DB_NAME>/archivelog/2023_01_31/o1_mf_1_22_a12fds3b_.arc

[mai mult...]

Partial Indexes for Partitioned Tables in Oracle Database

Table: INDEXING [ON | OFF] Clause

Decizia despre ce partiții sunt indexate se ia folosind INDEXING [ON | OFF] asociată fiecărei partiții, implicit fiind INDEXING ON. Creăm un tabel partiționat cu trei partiții. Primele două partiții au indexarea activată. Una implicit și alta în mod explicit. A treia partiție are indexarea dezactivată.

— Creați și completați tabelul partiționat.

drop table t1 purge;

create table t1 (
id number,
description varchar2(50),
created_date date
)
partition by range (created_date) (
partition part_2021 values less than (date ‘2021-01-01’),
partition part_2022 values less than (date ‘2022-01-01’) indexing on,
partition part_2023 values less than (date ‘2023-01-01’) indexing off
);

insert into t1 values (1, ‘t1 one’, date ‘2021-07-01’);
insert into t1 values (2, ‘t1 two’, date ‘2023-07-01’);
insert into t1 values (3, ‘t1 three’, date ‘2023-01-01’);
commit;

Coloana INDEXING a viewului USER_TAB_PARTITIONS ne arată starea de indexare a fiecărei partiții. Doar partiția 2023 are INDEXING dezactivat.

column table_name format a20
column partition_name format a20

select table_name,
partition_name,
indexing
from user_tab_partitions
where table_name = ‘T1’
order by 1,2;

TABLE_NAME PARTITION_NAME INDE
——————– ——————– —-
T1 PART_2021 ON
T1 PART_2022 ON
T1 PART_2023 OFF

SQL>

Schimbăm clauza de indexare pentru o partiție folosind comanda ALTER TABLE … MODIFY PARTITION. Dezactivăm indexarea pentru partițiile 2021 și 2022 și activăm indexarea pentru partiția 2023.

alter table t1 modify partition part_2021 indexing off;
alter table t1 modify partition part_2022 indexing off;
alter table t1 modify partition part_2023 indexing on;

Putem vedea modificările reflectate în rezultatul din vizualizarea USER_TAB_PARTITIONS. Indexarea este dezactivată pentru partițiile 2021 și 2022. Indexarea este activată pentru partiția 2023.

select table_name,
partition_name,
indexing
from user_tab_partitions
where table_name = ‘T1’
order by 1,2;

TABLE_NAME PARTITION_NAME INDE
——————– ——————– —-
T1 PART_2021 OFF
T1 PART_2022 OFF
T1 PART_2023 ON

SQL>

Index: INDEXING [FULL | PARTIAL] Clause

Chiar și cu setările de indexare a partiției activate, în mod implicit, indecșii sunt creați ca INDEXING FULL, deci setarea partiției este ignorată.

Creăm un index local pe coloana CREATED_DATE. Dacă nu specificăm clauza INDEXING în timpul creării indexului, acțiunea implicită este INDEXING FULL.

drop index t1_local_partial_idx;

— create index t1_local_partial_idx on t1(created_date) local indexing full;
create index t1_local_partial_idx on t1(created_date) local;

Verificând coloana STATUS a viewului USER_IND_PARTITIONS, vedem că toate partițiile indexului sunt utilizabile. În mod implicit, crearea indexului ignoră setarea INDEXARE a partițiilor de tabel.

column index_name format a25

select index_name,
partition_name,
status
from user_ind_partitions
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1,2;

INDEX_NAME PARTITION_NAME STATUS
————————- ——————– ——–
T1_LOCAL_PARTIAL_IDX PART_2021 USABLE
T1_LOCAL_PARTIAL_IDX PART_2022 USABLE
T1_LOCAL_PARTIAL_IDX PART_2023 USABLE

SQL>

Verificând coloana INDEXING a vizualizării USER_INDEXES, vedem că indexul este marcat ca indexare COMPLET.

column indexing format a8

select index_name,
indexing
from user_indexes
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_LOCAL_PARTIAL_IDX FULL

SQL>

Stergem indexul și îl creăm din nou, de data aceasta folosind clauza INDEXING PARTIAL.

drop index t1_local_partial_idx;
create index t1_local_partial_idx on t1(created_date) local indexing partial;

Acum vedem că partițiile de tabel marcate ca INDEXING OFF nu sunt indexate și au partiții de index marcate ca inutilizabile. Partiția de tabel din 2023 a fost marcată ca INDEXING ON, deci este indexată și vedem o partiție de index utilizabilă.

select index_name,
partition_name,
status
from user_ind_partitions
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1,2;

INDEX_NAME PARTITION_NAME STATUS
————————- ——————– ——–
T1_LOCAL_PARTIAL_IDX PART_2021 UNUSABLE
T1_LOCAL_PARTIAL_IDX PART_2022 UNUSABLE
T1_LOCAL_PARTIAL_IDX PART_2023 USABLE

SQL>

Verificând coloana INDEXING a vizualizării USER_INDEXES, vedem că indexul este marcat ca indexare PARTIAL.

column indexing format a8

select index_name,
indexing
from user_indexes
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_LOCAL_PARTIAL_IDX PARTIAL

SQL>

Indecșii globali pot fi creați și ca indecși parțiali, doar cu partițiile marcate incluse în index.
Creăm un index global parțial. Observați utilizarea clauzei de indexare “partial”. Indexul rezultat este marcat ca INDEXING PARTIAL.

create index t1_global_partial_idx on t1(description) global indexing partial;

— Verificati statusul indexului

select index_name,
indexing
from user_indexes
where index_name like ‘T1%’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_GLOBAL_PARTIAL_IDX PARTIAL
T1_LOCAL_PARTIAL_IDX PARTIAL

SQL>

[mai mult...]

Instalare baza de date Oracle 19c pe Oracle Linux 7 (OL7)

Acest articol descrie instalarea bazei de date Oracle 19c pe Oracle Linux 7 X64 (OL7)

1: Download Software
Download the Oracle software from OTN or My Oracle Support

2 Fișierul hosts
Fișierul „/etc/hosts” trebuie să conțină un nume complet calificat pentru server.

De exemplu.

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.100 oel7.localdomain oel7

Setați numele de gazdă corect în fișierul „/etc/hostname”.

oel7.localdomain

3: Cerințe preliminare de instalare Oracle ( prerechizite)

Efectuați fie Configurarea automată, fie Configurarea manuală pentru a îndeplini cerințele preliminare de bază. Configurarea suplimentară este necesară pentru toate instalările

3.1 Automatic Setup

Folosirea packetului oracle-database-preinstall-19c va instala si va configura automat o parte din cerintele necesare instalarii  bazei de date oracle 19c. Pentru instalare acestuia rulati conectat ca root urmatoarea comanda:

# yum install -y oracle-database-preinstall-19c

Configurare manuală

Dacă nu ați folosit pachetul „oracle-database-preinstall-19c” pentru a îndeplini toate cerințele preliminare, va trebui să efectuați manual următoarele configurari

Adăugați următoarele linii în fișierul „/etc/sysctl.conf” sau într-un fișier numit „/etc/sysctl.d/98-oracle.conf”.

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

Rulați una dintre următoarele comenzi pentru a modifica parametrii systemului de operare (kernel), în funcție de fișierul pe care l-ați editat.

/sbin/sysctl -p
# Or
/sbin/sysctl -p /etc/sysctl.d/98-oracle.conf

Adăugați următoarele linii într-un fișier numit „/etc/security/limits.d/oracle-database-preinstall-19c.conf”.

oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728

Următoarele pachete sunt necesare pentru instalarea Oracle.

yum install -y bc
yum install -y binutils
yum install -y compat-libcap1
yum install -y compat-libstdc++-33
#yum install -y dtrace-modules
#yum install -y dtrace-modules-headers
#yum install -y dtrace-modules-provider-headers
yum install -y dtrace-utils
yum install -y elfutils-libelf
yum install -y elfutils-libelf-devel
yum install -y fontconfig-devel
yum install -y glibc
yum install -y glibc-devel
yum install -y ksh
yum install -y libaio
yum install -y libaio-devel
yum install -y libdtrace-ctf-devel
yum install -y libXrender
yum install -y libXrender-devel
yum install -y libX11
yum install -y libXau
yum install -y libXi
yum install -y libXtst
yum install -y libgcc
yum install -y librdmacm-devel
yum install -y libstdc++
yum install -y libstdc++-devel
yum install -y libxcb
yum install -y make
yum install -y net-tools # Clusterware
yum install -y nfs-utils # ACFS
yum install -y python # ACFS
yum install -y python-configshell # ACFS
yum install -y python-rtslib # ACFS
yum install -y python-six # ACFS
yum install -y targetcli # ACFS
yum install -y smartmontools
yum install -y sysstat

# Added by me.
yum install -y unixODBC

Creați noile grupuri de utilizatori și utilizatorii.

groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
#groupadd -g 54324 backupdba
#groupadd -g 54325 dgdba
#groupadd -g 54326 kmdba
#groupadd -g 54327 asmdba
#groupadd -g 54328 asmoper
#groupadd -g 54329 asmadmin
#groupadd -g 54330 racdba

useradd -u 54321 -g oinstall -G dba,oper oracle

 

Additional Setup

Setați parola pentru utilizatorul „oracle”.

#passwd oracle

Setați Linux securizat la permisiv prin editarea fișierului „/etc/selinux/config”, asigurându-vă că marcajul SELINUX este setat după cum urmează.

SELINUX=permissive

Odată ce modificarea este completă, reporniți serverul sau executați următoarea comandă.

# setenforce Permissive

Dacă aveți paravanul de protecție Linux activat, va trebui să îl dezactivați sau sa il configurati. Pentru dezactivare folositi urmatoarele comenzi:

# systemctl stop firewalld
# systemctl disable firewalld

Creați directoarele în care va fi instalat software-ul Oracle.

mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02

Setati variabilele de system

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/19.0.0/dbhome_1

  • Instalarea

Conectați-vă la utilizatorul Oracle. Dacă utilizați X display, setați variabila de mediu DISPLAY.

DISPLAY=<server-name>:0.0; export DISPLAY

Dezarhivați software-ul direct in foldderul ORACLE_HOME și porniți Oracle Universal Installer (OUI) lansând una dintre următoarele comenzi în directorul ORACLE_HOME. Modul interactiv va afișa ecrane de instalare a GUI pentru a permite intrarea utilizatorului, în timp ce modul silențios va instala software-ul fără a afișa niciun ecran, deoarece toate opțiunile necesare sunt deja specificate pe linia de comandă.

# Unzip software.
cd $ORACLE_HOME
unzip -oq /path/to/software/LINUX.X64_193000_db_home.zip

# Interactive mode.
./runInstaller

# Silent mode.
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${ORA_INVENTORY} \
SELECTED_LANGUAGES=en,en_GB \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSBACKUPDBA_GROUP=dba \
oracle.install.db.OSDGDBA_GROUP=dba \
oracle.install.db.OSKMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true

Rulați scripturile de administrare (root) când vi se solicită.

Ca utilizator root, executați următoarele scripturi:

1. /u01/app/oraInventory/orainstRoot.sh
2. /u01/app/oracle/product/19.0.0/dbhome_1/root.sh

Acum sunteți gata să creați o bază de date.

[mai mult...]