Oracle Query Varie: differenze tra le versioni

Da Emigar.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 164: Riga 164:


=Sessioni=
=Sessioni=
[[Oracle_Sessioni_e_processi]]
[[Oracle_Sessioni_e_processi | Sessioni e processi]]

=Gestione Spazio Disco=
[[Oracle_Spazio#Controllo_Allocazione_Spazio | Gestione Spazio]]


=Ricerca files orfani ASM=
=Ricerca files orfani ASM=

Versione attuale delle 13:37, 18 set 2026

Tracciare operazioni nell'alert log

EXEC SYS.DBMS_SYSTEM.kfnwrt(1, 'NOTA OPERATORE: Inizio manutenzione di Mario Rossi');

ACL

creazione acl

interrogazioni acl

col host for a40
col acl for a45
col acl_owner for a10
set pagesize 200 linesize 200
SELECT * FROM DBA_NETWORK_ACLS order by host,lower_port;


col principal for a25
col privilege for a20
col start_date for a4
col end_date for a4
SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES order by principal,privilege;


select a.host,a.lower_port,p.acl,p.principal,p.privilege,p.is_grant
 from DBA_NETWORK_ACLS a inner join DBA_NETWORK_ACL_PRIVILEGES p on (a.aclid=p.aclid)
 order by p.acl,p.principal,a.host,a.lower_port;


SELECT PRINCIPAL, HOST, lower_port, upper_port, acl, 'connect' AS PRIVILEGE, 
   DECODE(DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, PRINCIPAL, 'connect'), 1,'GRANTED', 0,'DENIED', NULL) PRIVILEGE_STATUS
FROM DBA_NETWORK_ACLS
   JOIN DBA_NETWORK_ACL_PRIVILEGES USING (ACL, ACLID)  
UNION ALL
SELECT PRINCIPAL, HOST, NULL lower_port, NULL upper_port, acl, 'resolve' AS PRIVILEGE, 
   DECODE(DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, PRINCIPAL, 'resolve'), 1,'GRANTED', 0,'DENIED', NULL) PRIVILEGE_STATUS
FROM DBA_NETWORK_ACLS
   JOIN DBA_NETWORK_ACL_PRIVILEGES USING (ACL, ACLID);

Job

job in esecuzione

SELECT job_name, state, running_instance, session_id 
FROM dba_scheduler_running_jobs 
WHERE owner = '&1';

Elenco Job

col job_name for a40
col owner for a15
col last_start_date for a30
col next_run_date for a30
col start_date for a30
alter session set nls_timestamp_tz_format='DD/MM/YYYY HH24:MI:SS.FF TZH';
select job_name, owner, enabled, state, failure_count, LAST_START_DATE, NEXT_RUN_DATE, START_DATE from dba_scheduler_jobs order by last_start_date;


col job_name for a50
col owner for a20
select job_name, owner, enabled from dba_scheduler_jobs;

abilitare e disabilitare job

BEGIN
  DBMS_SCHEDULER.ENABLE(name => 'nome_schema.nome_job' );
END;
/

Job Immediato

Per creare un indice:

 begin
   dbms_scheduler.create_job(
     job_name    => 'il_mio_job',
     job_type    => 'PLSQL_BLOCK',
     job_action  => 'begin execute immediate ''create index owner.index_name on owner.table(col01) online nologging''; end;',
     enabled     => TRUE,
     auto_drop   => TRUE,
     comments    => 'crea indice'
   );
 end;
 /

Per analizzare uno schema:

begin
   dbms_scheduler.create_job(
     job_name    => 'analyze_schema',
     job_type    => 'PLSQL_BLOCK',
     job_action  => 'begin dbms_stats.gather_schema_stats(ownname=>''SCHEMA'',cascade=>true); end;',
     enabled     => TRUE,
     auto_drop   => TRUE,
     comments    => 'analyze'
   );
 end;
/

Piano della query per sql_id

--
set autotrace off
set pagesize 200
set linesize 200
select DBMS_LOB.substr(sql_fulltext, 3000) from v$sql where sql_id = '&1';
-- select plan_table_output from table(dbms_xplan.display_cursor('&1',null,'basic'));
-- select plan_table_output from table(dbms_xplan.display_cursor('&1'));
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(sql_id=>'&1',cursor_child_no=>&2));

Storico query che hanno usato più TEMP

Richiede AWR.

select sql_id,max(TEMP_SPACE_ALLOCATED)/(1024*1024*1024) gig
  from DBA_HIST_ACTIVE_SESS_HISTORY
 where sample_time > sysdate-2
   and TEMP_SPACE_ALLOCATED > (500*1024*1024)
group by sql_id order by 2;

Versione per statspack:

Segment Advisor

--
set pagesize 200
set linesize 200
set autotrace off
-- select tablespace_name, segment_name, segment_type, partition_name,
-- recommendations, c1 from
-- table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));
spool segadv.txt
select '/*' || recommendations || ' */ ' || c1 || ';' from
 table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE')) where c1 is not null order by segment_type,reclaimable_space;
spool off

Per eseguire lo shrink delle tabelle:

--
set verify off echo off
alter table &1 enable row movement;
-- non mette lock esclusivo ma non libera lo spazio
alter table &1 shrink space compact;
-- libera lo spazio ma mette lock esclusivo per liberare spazio alla fine
alter table &1 shrink space;         
alter table &1 disable row movement;

Logging

-- tabelle
set pagesize 0 linesize 200 trim on trims on feedback off echo off timing off
select 'alter table ' || owner || '.' || table_name || ' logging;' from dba_tables where owner!='SYS' and logging='NO';
select 'alter index ' || owner || '.' || index_name || ' logging;' from dba_indexes where owner!='SYS' and logging='NO';
select 'alter table ' || owner || '.' || table_name || ' modify lob (' || column_name || ') (cache logging);' from dba_lobs where owner!='SYS' and logging='NO';
-- tabelle partizionate
select 'alter table ' || owner || '.' || table_name || ' modify default attributes logging; ' from dba_part_tables where owner!='SYS' and def_logging='NO';
select 'alter index ' || owner || '.' || index_name || ' modify default attributes logging; ' from dba_part_indexes where owner!='SYS' and def_logging='NO';
select 'alter table ' || table_owner || '.' || table_name || ' modify default attributes lob (' || column_name || ') (cache logging);' from dba_part_lobs where table_owner!='SYS' and def_logging='NO';
-- partizioni
select 'alter table ' || table_owner || '.' || table_name || ' modify partition ' || partition_name || ' logging;' from dba_tab_partitions where table_owner!='SYS' and logging='NO';
select 'alter index ' || index_owner || '.' || index_name || ' modify partition ' || partition_name || ' logging;' from dba_ind_partitions where index_owner!='SYS' and logging='NO' and status='USABLE';
 select 'alter table ' || table_owner || '.' || table_name || ' modify partition ' || partition_name || ' lob (' || column_name || ') (cache logging);' from dba_lob_partitions where table_owner!='SYS' and logging='NO';

Sessioni

Sessioni e processi

Gestione Spazio Disco

Gestione Spazio

Ricerca files orfani ASM

http://anjo.pt/wp/keyword-oracle/2013/02/26/find-orphan-asm-files/

DEFINE ASMGROUP="DGDATA"
 
set linesize 200
set pagesize 50000
col reference_index noprint
col type format a15
col files format a80

WITH v_asmgroup AS (SELECT group_number FROM v$asm_diskgroup WHERE name='&ASMGROUP'),
     v_parentindex AS (SELECT parent_index 
                    FROM v$asm_alias 
              WHERE group_number = (SELECT group_number FROM v_asmgroup) 
                AND alias_index=0),
  v_asmfiles AS (SELECT file_number, type 
              FROM v$asm_file 
           WHERE group_number = (SELECT group_number FROM v_asmgroup)),
 v_dbname AS (SELECT '/'||upper(db_unique_name)||'/' dbname from v$database)
SELECT 'rm '|| files files FROM -- this line show the delete command
(
  SELECT '+&ASMGROUP'||files files, type 
  FROM (SELECT upper(sys_connect_by_path(aa.name,'/')) files, aa.reference_index, b.type
        FROM (SELECT file_number,alias_directory,name, reference_index, parent_index 
        FROM v$asm_alias) aa,
             (SELECT parent_index FROM v_parentindex) a,
             (SELECT file_number, type FROM v_asmfiles) b
  WHERE aa.file_number=b.file_number(+)
    AND aa.alias_directory='N'
   -- missing PARAMETERFILE, DATAGUARDCONFIG
   AND b.type in ('DATAFILE','ONLINELOG','CONTROLFILE','TEMPFILE')
  START WITH aa.PARENT_INDEX=a.parent_index
  CONNECT BY PRIOR aa.reference_index=aa.parent_index)
  WHERE substr(files,instr(files,'/',1,1),instr(files,'/',1,2)-instr(files,'/',1,1)+1) = (select dbname FROM v_dbname)
MINUS (
  SELECT upper(name) files, 'DATAFILE' type FROM v$datafile
    UNION ALL 
  SELECT upper(name) files, 'TEMPFILE' type FROM v$tempfile
    UNION ALL
 SELECT upper(name) files, 'CONTROLFILE' type FROM v$controlfile WHERE name like '+&ASMGROUP%'
    UNION ALL
 SELECT upper(member) files, 'ONLINELOG' type FROM v$logfile WHERE member like '+&ASMGROUP%'
)
);


constraints

Per vedere le colonne. Va raffinata:

select c.constraint_name || ' ' || c.table_name || '(' ||  u.column_name || ')'
from dba_constraints c
inner join dba_cons_columns u on (u.owner=c.owner and u.constraint_name=c.constraint_name)
where c.constraint_type='R';

Per vedere le referenze tra tabelle:

select c.constraint_name || ' ' || c.table_name || ' -> ' ||  u.table_name
from dba_constraints c
inner join dba_constraints u on (u.owner=c.r_owner and u.constraint_name=c.r_constraint_name)
where c.constraint_type='R'
and (c.table_name = '&&1' or u.table_name='&&1');
select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS,VALIDATED from dba_constraints where table_name='&&1';

Get DDL

set long 2000000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
begin
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',true);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PARTITIONING',true);
end;
/

Tabelle

select dbms_metadata.get_ddl(object_type=>'TABLE',schema=>'SCHEMA_NAME',name=>'TABLE_NAME') from dual;

Reverse Grants

Elenco delle grants concesse all'utente. Utile quando l'utente va ricreato, ad esempio in caso di import.

Vecchio metodo (si può migliorare gestendo la grant option):

--
set pagesize 0 linesize 200 trim on trims on tab off feedback off
spool privilegi_esportati.sql
select 'grant ' || privilege || ' to ' || grantee || ';' from dba_sys_privs where grantee in ('USER1');
select 'grant ' || GRANTED_ROLE || ' to ' || grantee || ';' from dba_role_privs where grantee in ('USER1');
select 'grant ' || privilege || ' on ' || owner || '."' || table_name || '" to ' || grantee || ';' from dba_tab_privs where grantee in ('USER1');
spool off
set pagesize 200 feedback on

Metodo più efficace:


set long 2000000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
 
begin
     dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
     dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/
 
variable v_username VARCHAR2(30);
 
exec:v_username := upper('UTENTE01');
 
spool grants_UTENTE01.sql

SELECT dbms_metadata.get_ddl('USER','UTENTE01') FROM dual;

select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
  from   dba_role_privs rp
  where  rp.grantee = :v_username
  and    rownum = 1
 union all
  select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
  from   dba_sys_privs sp
  where  sp.grantee = :v_username
  and    rownum = 1
 union all
  select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
  from   dba_tab_privs tp
  where  tp.grantee = :v_username
  and    rownum = 1
 /

spool off;


clear screen
accept uname prompt 'Enter User Name : '
accept outfile prompt  ' Output filename : '

spool &&outfile..gen

SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON

BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
END;
/

SELECT dbms_metadata.get_ddl('USER','&&uname') FROM dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','&&uname') from dual;

spool off

Reverse Grants 2

Elenco delle grants concesse all'utente. Utile quando l'utente va ricreato, ad esempio in caso di import.


set long 2000000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
 
begin
     dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
     dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/
 
variable v_username VARCHAR2(30);
 
exec:v_username := upper('UTENTE01');
 
spool grants_UTENTE01.sql

SELECT dbms_metadata.get_ddl('USER','UTENTE01') FROM dual;

select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
  from   dba_role_privs rp
  where  rp.grantee = :v_username
  and    rownum = 1
 union all
  select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
  from   dba_sys_privs sp
  where  sp.grantee = :v_username
  and    rownum = 1
 union all
  select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
  from   dba_tab_privs tp
  where  tp.grantee = :v_username
  and    rownum = 1
 /

spool off;


clear screen
accept uname prompt 'Enter User Name : '
accept outfile prompt  ' Output filename : '

spool &&outfile..gen

SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON

BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
END;
/

SELECT dbms_metadata.get_ddl('USER','&&uname') FROM dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','&&uname') from dual;
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','&&uname') from dual;

spool off

Locked Objects

alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';

col object_name for a30
col machine for a30

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, s.inst_id, P.SPID, S.PROGRAM,S.USERNAME,S.MACHINE, S.PORT, 
S.LOGON_TIME, SQ.SQL_FULLTEXT 
FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION S, GV$PROCESS P, GV$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND (L.SESSION_ID = S.SID  and l.inst_id=s.inst_id)
AND (S.PADDR = P.ADDR  and s.inst_id=p.inst_id)
AND (S.SQL_ADDRESS = SQ.ADDRESS and s.inst_id=sq.inst_id)
;


SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,S.MACHINE, S.PORT, 
S.LOGON_TIME, SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND (L.SESSION_ID = S.SID)
AND (S.PADDR = P.ADDR)
AND (S.SQL_ADDRESS = SQ.ADDRESS)
;

lock

--

set linesize 190
set pagesize 200
col blocker for a30
col sid_serial for a15
col blockee for a30

col object_name for a30
col machine for a45
col osuser for a15

select c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c,
   v$lock l
where b.sid = a.session_id
  and a.object_id = c.object_id
  and l.sid=b.sid
  and (l.block=1 or l.request > 0 )
;

select
(select username || ' - ' || osuser from v$session where sid=a.sid) blocker,
a.sid || ', ' ||
(select serial# from v$session where sid=a.sid) sid_serial,
' is blocking ',
(select username || ' - ' || osuser from v$session where sid=b.sid) blockee,
b.sid || ', ' ||
(select serial# from v$session where sid=b.sid) sid_serial
from v$lock a, v$lock b
where a.block = 1
and b.request > 0
and a.id1 = b.id1
and a.id2 = b.id2;


select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' )  is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) '
AS blocking_status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
 and l1.BLOCK=1 and l2.request > 0
 and l1.id1 = l2.id1
 and l2.id2 = l2.id2 ;
set heading off
select 'SQL STATEMENT BLOCCANTI:' as SQL_STATEMENT_BLOCCANTI from dual;
set heading on
select a.username,a.sid, a.serial#, b.sql_text
from v$session a, v$sqlarea b
where a.sql_address=b.address and a.sid in ( select
s1.sid
 from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
 and l1.BLOCK=1 and l2.request > 0
 and l1.id1 = l2.id1
 and l2.id2 = l2.id2) ;


row cache lock

SELECT 
   s1.username AS waiting_user, 
   s1.sid AS waiting_sid, 
   s1.serial# AS waiting_serial,
   s1.event AS wait_event,
   s2.username AS holding_user, 
   s2.sid AS holding_sid, 
   s2.serial# AS holding_serial,
   s2.sql_id AS holding_sql_id
FROM v$session s1, v$lock l1, v$lock l2, v$session s2
WHERE s1.lockwait = l1.kaddr
 AND l1.id1 = l2.id1
 AND l1.id2 = l2.id2
 AND l2.addr = s2.lockwait
 AND s1.sid != s2.sid
 AND s1.event LIKE '%row cache%';

Tablespaces Read Only

select 'alter tablespace ' || tablespace_name || ' read only;' from dba_tablespaces where contents='PERMANENT' 
 and status='ONLINE' and tablespace_name not in ('SYSTEM','SYSAUX');
 
select 'alter tablespace ' || tablespace_name || ' read write;' from dba_tablespaces where contents='PERMANENT' 
 and status='READ ONLY' and tablespace_name not in ('SYSTEM','SYSAUX');

Character Set

col PROPERTY_NAME for a30
col PROPERTY_VALUE for a40
col DESCRIPTION for a60
select * from database_properties where PROPERTY_NAME in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

Gestione stringhe con caratteri unicode

SQL> select asciistr('Fernando, tre caffè! Olé!') as fernando from dual;

FERNANDO
--------------------------------------------------------------------------------
Fernando, tre caff\00E8! Ol\00E9!

SQL> select unistr('Fernando, tre caff\00E8! Ol\00E9!') as fernando from dual;

FERNANDO
---------------------------------------------------------------------------
Fernando, tre caffè! Olé!

SQL> select asciistr('èéà°òç½€') from dual;

ASCIISTR('ÈÉÀ°Òǽ€')
--------------------------------------------------------------------------------
\00E8\00E9\00E0\00B0\00F2\00E7\00BD\20AC

SQL> 

Redefine Online

--
set timing on
drop table USER.EESKFILECOMUNICAZIONE_CP;
purge dba_recyclebin;

-- verifica se è utilizzabile
BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE('USER','EESKFILECOMUNICAZIONE',DBMS_REDEFINITION.CONS_USE_PK);
END;
/

-- organization index tablespace ODSSOLTBS overflow tablespace ODSSOLTBS
create table USER.EESKFILECOMUNICAZIONE_CP (IDSKFILE NUMBER(18),FBODY BLOB)
 lob(FBODY) store as securefile (enable storage in row nocache nologging deduplicate compress high tablespace ODSLOBTBS)
 partition by range (IDSKFILE) interval (5000000) ( partition values less than (5000000) )
 compress for oltp tablespace ODSLOBTBS nologging;

-- insert /*+ append */ into USER.EESKFILECOMUNICAZIONE_CP
-- select * from USER.EESKFILECOMUNICAZIONE;

alter table USER.EESKFILECOMUNICAZIONE_CP enable row movement;
alter session force parallel dml parallel 8;
alter session force parallel query parallel 8;

EXEC DBMS_REDEFINITION.start_redef_table(uname=>'USER', orig_table=>'EESKFILECOMUNICAZIONE', int_table=>'EESKFILECOMUNICAZIONE_CP');

EXEC DBMS_REDEFINITION.sync_interim_table(uname=>'USER', orig_table=>'EESKFILECOMUNICAZIONE', int_table=>'EESKFILECOMUNICAZIONE_CP');

-- Copy dependents.
SET SERVEROUTPUT ON
DECLARE
  l_num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.copy_table_dependents(
    uname               => 'USER',
    orig_table          => 'EESKFILECOMUNICAZIONE',
    int_table           => 'EESKFILECOMUNICAZIONE_CP',
    copy_indexes        => 1,             -- Default
    copy_triggers       => TRUE,          -- Default
    copy_constraints    => TRUE,          -- Default
    copy_privileges     => TRUE,          -- Default
    ignore_errors       => FALSE,         -- Default
    num_errors          => l_num_errors,
    copy_statistics     => FALSE,         -- Default
    copy_mvlog          => FALSE);        -- Default
    
  DBMS_OUTPUT.put_line('num_errors=' || l_num_errors); 
END;
/

EXEC DBMS_REDEFINITION.finish_redef_table(uname=>'USER', orig_table=>'EESKFILECOMUNICAZIONE', int_table=>'EESKFILECOMUNICAZIONE_CP');