Post

Visualizzazione dei post da ottobre, 2020

SQL*Loader Discard file

Immagine
Vogliamo caricare in una tabella i dati presenti in un file esterno che ha formato csv con delimitatore tra le colonne uguale alla virgola. L'obiettivo è caricare solo alcune righe che soddisfano una determinata condizione.  Il file esterno è un csv così fatto. 1) Salvare il file csv sotto una directory a piacere come  /u01/app/oracle/file_ext. 2) Collegarsi ad un pdb come amministratore e creaimo una tabella esterna: SQL>  CON_NAME          -----------------        ORCLPDB SQL> show user        USER è "HR" SQL> create table emp_load (                id number,                nome varchar2(100),                cognome varchar2(100)); 3) Creae un control file (con estensione ctl) con il seguente codice che contiene riferimento a righe da scartare durante il carimaneto (discarded). Salvare il file sotto il path contenente il file esterno. [oracle@test file_ext]$  vi /u01/app/oracle/file_ext/ emp.ctl  Load Data INFILE '/u01/app/oracle/file_ext/emp.csv' APPEN

EXPDP - IMPDP pluggable database

Esportare uno schema x1 da un PDB1. Creare una directory logica associata alla directory fisica datapump. #export ORACLE_SID=orcl  SQL> connect pdbx1_admin/pdb1_admin@pdb1; SQL> CREATE DIRECTORY  d_pdb1 AS '/u01/app/oracle/admin/orcl/dpdump'; SQL> GRANT read, write ON DIRECTORY d_pdbx1 TO x1; #expdp x1/x1@pdb1 SCHEMAS=x1 DIRECTORY= d_pdb1 DUMPFILE=exp_X1.dmp In questo modo il file dump non contiene l'istruzione "create user x1" al suo interno se x1 non ha la grant create user. Allora conviene effettuare l'export con l'utente amministratore di PDB1. #expdp  pdbx1_admin/pdb1_admin@pdb1  SCHEMAS=x1 DIRECTORY=d_pdb1 DUMPFILE=exp_X1.dmp Per importare il file dump sul un altro pdb (PDB2) accedere come utente amministratore del pdb2 e creare una directory logica contente il file file dump da importare.  Impostare il SID del database root container. #export ORACLE_SID=orcl Accedere come aministratore del pdb2. # sqlplus pdb2_admin/pdb2_admin@pdb2 ; SQL&

External Table - ORACLE_LOADER ORACLE_DATAPUMP

Immagine
Una External Table è una tabella di sola lettura i cui metadata sono conservati nel database mentre i dati sono esterni al db. Non si possono eseguire DML ne creare indici. Puoi accedere ai dati in due modi: oracle_loader o oracle_datapump. Utilizziamo ORACLE_LOADER 1) Creare una directory fiscia e logica dove salvare il file esterno contente i dati. Colleghiamoci al pluggable database  SQL > conn /as sysdba SQL> alter session set container=orclpdb; SQL> grant create any directory to hr; Accediamo come hr e creaimo la directory su file system e sul db. SQL> conn hr/hr@orclpdb SQL> CREATE DIRECTORY EXT_DIR as '/u01/app/oracle/file_ext';  SQL> select * from ALL_DIRECTORIES where directory_name='EXT_DIR'; 2) Creare il file contenente i dati   separato da "," all'interno della directory "file_ext". [oracle@test file_ext]$ vi ext_table.csv 1,spider,man 2,bat,man 3,super,man 4,x,men 3) Accedere come hr e creare la tabella che deve leg

SQL*Loader

Immagine
SQL*Loader è un utility oracle che permette di caricare i dati presenti in un file esterno all'interno di una tabella. Questa utility prevede due metodi di caricamento: 1 - Conventional Load 2 - Direct Path Load Il file esterno è un csv così fatto. 1) Salvare il file csv sotto una directory a piacere come  /u01/app/oracle/file_ext. 2) Collegarsi ad un pluggable database come amministratore e creare una tabella: SQL> show user      USER è "PDBTSADM" SQL> create table emp_load (                id number,                nome varchar2(100),                cognome varchar2(100)); 3) Creae un file con estensione ctl contente il seguente codice sotto il path contenente il file esterno. [oracle@test file_ext]$ vi /u01/app/oracle/file_ext/emp.ctl  Load Data INFILE '/u01/app/oracle/file_ext/emp.csv' APPEND INTO Table emp_load FIELDS TERMINATED BY ','  (id, nome, cognome ) Metodo Conventional Load 4) Eseguire dal server Oracle la seguente linea di codice [oracl

Create Table as select

 L'istruzione seguente SQL> create table emp_copy           as           select * from employees; Crea una tabella che contiene solo i dati della tabella originaria ma non copia le contraints ad eccezione della c onstraint NOT NULL. SQL > select dBMS_metadata.get_ddl('TABLE','EMPLOYEES','HR') FROM DUAL; CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID" NUMBER(6,0), "FIRST_NAME" VARCHAR2(20), "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL NABLE, "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE, "PHONE_NUMBER" VARCHAR2(20), "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE, "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE, "SALARY" NUMBER(8,2), "COMMISSION_PCT" NUMBER(2,2), "MANAGER_ID" NUMBER(6,0), "DEPARTMENT_ID" NUMBER(4,0), CONS

ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux

Questo errore si ha se la ORACLE_HOME e la ORACLE_BASE non sono settate correttamente. [oracle@oradb04 ~]$ export ORACLE_HOME=/u01/app/oracle/product/9.2.0/ [oracle@oradb04 ~]$ sqlplus / SQL*Plus: Release 9.2.0.8.0 - Production on Tue Oct 13 11:35:06 2020 Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved. ERROR: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux-x86_64 Error: 2: No such file or directory La Oracle_home settata correttamente non ha lo "/" finale. [oracle@oradb04 ~]$ export ORACLE_HOME=/u01/app/oracle/product/9.2.0 [oracle@oradb04 ~]$ sqlplus / SQL*Plus: Release 9.2.0.8.0 - Production on Tue Oct 13 11:36:07 2020 Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name:  oracle_sid + oracle_home sono usate per generare un shared memory segment id.

Local UNDO and Shared Undo

Immagine
 Ricordiamo che il Container DB contiene o solo un container root o un container root e almeno un pluggable database. Il tablespace Undo può essere configurato in due modi: - Shared : prevede un solo tablespace undo nel container root comune a tutti i pluggable database. - Local : prevede un datafile undo nel container root e uno per ogni pluggable. Questa impostazione è di default nella versione 18c. Nel secondo caso il parametro del database LOCAL_UNDO_ENABLED è impostato a true. SQL>    select * from database_properties         where lower(property_name) ='local_undo_enabled'; PROPERTY_NAME         PROPERTY_VALUE   DESCRIPTION

CREATE UNDO TABLESPACE

Colleghimoci ad un pluggable database come amministratore. SQL> show con_name;                CON_NAME               ----- ---------------------                PDBUNDO SQL> show user;            USER è "PDBUNDO_ADMIN" Query per estrarre la ddl del tablespace  SQL> select dbms_metadata.get_ddl('TABLESPACE','UNDOTBS1') from dual; "  CREATE UNDO TABLESPACE "UNDOTBS1" DATAFILE    '/u01/app/oracle/oradata/ORCL/pdbundo/undotbs01.dbf' SIZE 104857600   AUTOEXTEND ON NEXT 5242880 MAXSIZE 32767M   BLOCKSIZE 8192   EXTENT MANAGEMENT LOCAL AUTOALLOCATE" SQL> show parameter undo_tablespace NAME                      TYPE              VALUE     --------------- ------ --------------------------------- undo_tablespace      string           UNDOTBS1  SQL>CREATE UNDO TABLESPACE       UNDOTBS_02       DATAFILE '/u01/app/oracle/oradata/ORCL/pdbundo/undotbs02.dbf'         SIZE 10M; Impostarlo come tablespace di undo SQL>    alte

Managing Resumable Space Allocation

Resumable statement è un istruzione che dice al server Oracle, in caso di errori legati al superamento della quota associata ad un utente oppure al superamento dello di spazio del tablespace associato all'user, di sospendere lo script finchè non viene risolto il problema.  Normalmente Oracle risponde con un messaggio di errore e blocca lo statement.   La sospenzione di uno script è dovuta alle seguenti condizioni: - Out of space - Maximum extents reached - Space quota exceeded Colleghiamaoci ad un pluggable database. SQL> show con_name;                CON_NAME                ------------------------------                PDBTS SQL> show user;                USER è "PDBTSADM" SQL>  create tablespace tbsalert datafile '/u01/app/oracle/oradata/ORCL/pdbts/tbsalert01.dbf'                size 10M                 logging                extent  management local                segment space management auto; SQL> create table test06 (x number, y varchar2(100)) ta

Managing Storage Space - Segment Shrink

Immagine
 Ongi volta che viene effettuato un'update, una delete su oggetti di un tablespace, possono essere creati degli spazio vuoti che non sono sufficentmente grandi da contenere nuovi dati. Questi spazi vuoti vengono chiamati fragmented free space.  Gli oggetti che hanno queste sacche di spazio vuoto possono avere un impatto negativo sulle performance del database, pertanto esistono delle tecniche che individuano questi spazi vuoti, li deframmentano e li recalamano: si parla di online segment shrink .  Nel Data Dictionary oltre ad essere tracciato l'allocazione degli extent è tracciato lo spazio usato rispetto a quello allocato, tramite il parametro HIGH WATER MARK. Questo parametro indica l'ultima posizione nell'ultimo extent usato all'interno di un segment associato ad una tabella (ad esempio): lo spazio al di sopra di HWM è libero, al di sotto è occupato. Il segment shrink consiste nel recuperare spazio al di sotto delll'hwm (liberando spazio e resettando il valor

Monitoring Tablespace - creare un warning e critical alert

Colleghiamoci ad un pluggable database in stato read e write. show con_name; CON_NAME ------------------------------ PDBTS show user; USER è "PDBTSADM" Creiamo un tablespace da mettere sotto monitororaggio. create tablespace tbsalert datafile '/u01/app/oracle/oradata/ORCL/pdbts/tbsalert.dbf' size 50M logging extent management local segment space management auto; Dimensione del tbs BYTES = 52428800 SELECT *  FROM    DBA_DATA_FILES WHERE tablespace_name='TBSALERT'; Spazio libero BYTES = 51380224 che è minore della dimensione del tbs per via dei metadata SELECT * FROM     DBA_FREE_SPACE WHERE   tablespace_name='TBSALERT'; La percentuale di spazio libero del tbs è 98%. SELECT  df.tablespace_name tablespace, fs.bytes free, df.bytes,  fs.bytes*100/ df.bytes pct_free FROM     DBA_DATA_FILES df , DBA_FREE_SPACE fs WHERE  df.tablespace_name = fs.tablespace_name AND       df.tablespace_name = 'TBSALERT'; Creiamo una warning e un critical alert con la s

Error in invoking target 'install' of makefile '$ORACLE_HOME/ctx/lib/ins_ctx.mk'

Immagine
 Durante l'installazione del software  Oracle 11.2.0.2 è comparso il seguente messaggio di errore: Error in invoking target 'install' of makefile '/oracle/product/11gR2/ctx/lib/ins_ctx.mk'. See '/oraInventory/logs/installActions2020-10-06_10-40-16AM.log' for details. L'errore si verifica perché l'installer cerca di chiamare un target nel file "ins_ctx.mk". Il messaggio di errore  è:   INFO: //usr/lib64/libstdc++.so.5: undefined reference to `memcpy@GLIBC_2.14' collect2: error: ld returned 1 exit status potrebbe essere causato da una versione più alta del pacchetto glibc (higher than 2.14) installata. Soluzione: Download e install glibc-static-2.17-292.el7.x86_64.rpm Modifica il file  $ORACLE_HOME/ ctx/lib/ins_ctx.mk come segue: DA ctxhx: $(CTXHXOBJ) $(LINK_CTXHX) $(CTXHXOBJ) $(INSO_LINK) A ctxhx: $(CTXHXOBJ) -static $(LINK_CTXHX) $(CTXHXOBJ) $(INSO_LINK) /usr/lib64/stdc.a Modifica il file   $ORACLE_HOME/sysman/lib/ins_emagent.mk  c