dba:oracle:basic_oracle_sql_querys
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
dba:oracle:basic_oracle_sql_querys [2023/01/31 08:17] – removed dodger | dba:oracle:basic_oracle_sql_querys [2023/07/03 08:37] (current) – dodger | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== [DOC] Oracle basic queries ====== | ||
+ | |||
+ | ====== [SECTION] PRE-basics ====== | ||
+ | ===== NOT owned by oracle ===== | ||
+ | This is really useful to remove " | ||
+ | <code sql> | ||
+ | and NOT owner in ( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== [SECTION] STATUS====== | ||
+ | ===== Hora de la bbdd ===== | ||
+ | <code sql> | ||
+ | ===== SCN ===== | ||
+ | ==== get scn ==== | ||
+ | <code sql> | ||
+ | select current_scn from v$database; | ||
+ | </ | ||
+ | ==== convert de/a timestamp ==== | ||
+ | <code sql> | ||
+ | select timestamp_to_scn(to_timestamp(' | ||
+ | </ | ||
+ | <code sql> | ||
+ | select scn_to_timestamp(7705798324) as timestamp from dual; | ||
+ | </ | ||
+ | |||
+ | =====Status genérico===== | ||
+ | <code sql> | ||
+ | set lines 110 | ||
+ | col strtd hea ' | ||
+ | col instance_name for a8 hea ' | ||
+ | col host_name for a15 hea ' | ||
+ | col version for a10 | ||
+ | |||
+ | select instance_name, | ||
+ | from v$instance; | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | col instnace format a35 | ||
+ | select instance, status, enabled, open_time, checkpoint_time from v$thread; | ||
+ | </ | ||
+ | |||
+ | =====Memoria===== | ||
+ | ====SGA==== | ||
+ | Configuración actual: | ||
+ | <code sql>SHOW SGA;</ | ||
+ | <code sql> | ||
+ | <code sql> | ||
+ | COL COMPONENT FORMAT A30 | ||
+ | select * from v$sga_dynamic_components;</ | ||
+ | |||
+ | |||
+ | ====PGA==== | ||
+ | <code sql> | ||
+ | show parameter PGA; | ||
+ | </ | ||
+ | or | ||
+ | <code sql> | ||
+ | set pages 999; | ||
+ | column pga_size format 999,999,999 | ||
+ | select | ||
+ | 1048576+a.value+b.value | ||
+ | from | ||
+ | | ||
+ | | ||
+ | where | ||
+ | | ||
+ | and | ||
+ | | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | =====Archivelog Mode===== | ||
+ | <code sql> | ||
+ | SELECT LOG_MODE FROM SYS.V$DATABASE; | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | SELECT GROUP#, ARCHIVED FROM SYS.V$LOG; | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | ARCHIVE LOG LIST | ||
+ | </ | ||
+ | =====Ficheros/ | ||
+ | |||
+ | ====Localizar spfile==== | ||
+ | <code sql>show parameter spfile ;</ | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | col value format a200 | ||
+ | select name, value from v$parameter where name = ' | ||
+ | </ | ||
+ | |||
+ | ====Listar controlfiles==== | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A200; | ||
+ | select NAME from V$CONTROLFILE ; | ||
+ | </ | ||
+ | o en RAC: | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A200; | ||
+ | select NAME from GV$CONTROLFILE ; | ||
+ | </ | ||
+ | |||
+ | Y también: | ||
+ | <code sql> | ||
+ | COL VALUE FORMAT A200; | ||
+ | SELECT value | ||
+ | FROM gv$parameter | ||
+ | WHERE name = ' | ||
+ | </ | ||
+ | |||
+ | ====Directorios==== | ||
+ | === Listar === | ||
+ | |||
+ | <code sql> | ||
+ | COL DIRECTORY_NAME FORMAT A40; | ||
+ | COL DIRECTORY_PATH FORMAT A180; | ||
+ | select DIRECTORY_NAME, | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Hubicación de trazas y alert===== | ||
+ | <code sql>SHOW PARAMETER BACKGROUND_DUMP_DEST ; </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =====Debugging===== | ||
+ | |||
+ | ====ASM alert y trazas==== | ||
+ | No he conseguido query para sacarlo, solo mediante variables de sistema: | ||
+ | <code sql> | ||
+ | Hay que cargar las variables de '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ====Debug de otra sesión==== | ||
+ | Se puede debugar otra sesión a la nuestra mediante: | ||
+ | <code sql> | ||
+ | oradebug setospid 3885 | ||
+ | oradebug unlimit | ||
+ | oradebug event 10046 trace name context forever, | ||
+ | </ | ||
+ | El event 10046 está sacado de Doc ID 1198753.1 (para rman), se puede usar cualquier otro | ||
+ | ====== [SECTION] Config ====== | ||
+ | =====Nombre de la bd===== | ||
+ | <code sql>show parameter db_name ;</ | ||
+ | |||
+ | =====DBID de la bd===== | ||
+ | <code sql> | ||
+ | En caso de que la bbdd esté down, podemos verlo en los logs de RMAN | ||
+ | <code sql> | ||
+ | $rman TARGET / | ||
+ | Recovery Manager: Release 10.2.0.1.0 - Production on Tue May 6 01:25:48 2008 | ||
+ | Copyright (c) 1982, 2005, Oracle. All rights reserved. | ||
+ | connected to target database: ARJU (DBID=2869417476) | ||
+ | </ | ||
+ | |||
+ | Mas info: [[http:// | ||
+ | |||
+ | =====Versión===== | ||
+ | <code sql> select | ||
+ | |||
+ | |||
+ | ==== charset ==== | ||
+ | <code sql> | ||
+ | COL VALUE FORMAT A50 | ||
+ | COL PARAMETER FORMAT A50 | ||
+ | select * from nls_database_parameters ; | ||
+ | </ | ||
+ | |||
+ | ===== REDO's ===== | ||
+ | ==== Status de los REDO (all in one query) ==== | ||
+ | |||
+ | <code sql> | ||
+ | col members format a150 | ||
+ | col status format a20 | ||
+ | select vl.group#, | ||
+ | vl.thread#, | ||
+ | vl.sequence#, | ||
+ | vl.bytes/ | ||
+ | vl.archived, | ||
+ | vl.status, | ||
+ | gm.type status, | ||
+ | gm.members | ||
+ | from v$log vl, | ||
+ | (select group#, type, listagg(vlf.member, | ||
+ | from v$logfile vlf | ||
+ | group by vlf.group#, type) gm | ||
+ | where | ||
+ | vl.group# | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== Status de los REDO ==== | ||
+ | <code sql> | ||
+ | select * from v$log; | ||
+ | </ | ||
+ | |||
+ | ==== Localización de los REDO ==== | ||
+ | |||
+ | <code sql> | ||
+ | col member format a100 | ||
+ | select * from v$logfile ; | ||
+ | </ | ||
+ | |||
+ | ==== Destino de los redos ==== | ||
+ | Dónde se envían los redos: | ||
+ | <code sql> | ||
+ | col DEST_NAME FORMAT A20; | ||
+ | COL STATUS FORMAT A15; | ||
+ | COL NAME_SPACE FORMAT A15; | ||
+ | COL SCHEDULE FORMAT A15; | ||
+ | COL DESTINATION FORMAT A30; | ||
+ | SELECT DEST_NAME, STATUS, NAME_SPACE, SCHEDULE, DESTINATION FROM V$ARCHIVE_DEST WHERE ROWNUM < 10 ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Parametros===== | ||
+ | Por regla general: | ||
+ | * <code sql>show parameter < | ||
+ | * <code sql> | ||
+ | * <code sql> | ||
+ | |||
+ | |||
+ | =====Resetear un parámetro===== | ||
+ | <code sql> | ||
+ | ALTER SYSTEM RESET < | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Standby redo logs ===== | ||
+ | This query will show '' | ||
+ | |||
+ | <code sql> | ||
+ | COL member format 150 | ||
+ | select lf.group#, | ||
+ | from v$logfile lf | ||
+ | join ( | ||
+ | | ||
+ | union | ||
+ | | ||
+ | on lf.group# | ||
+ | order by lf.group# | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== [SECTION] | ||
+ | |||
+ | =====Listar tablespaces===== | ||
+ | <code sql> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES ;</ | ||
+ | |||
+ | =====Listar datafiles con la BBDD not open===== | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A200 | ||
+ | select * from v$dbfile order by 1; | ||
+ | </ | ||
+ | |||
+ | ===== List datafiles (simple)===== | ||
+ | <code sql> | ||
+ | col FILE_NAME FORMAT A80; | ||
+ | COL tablespace_name FORMAT A30; | ||
+ | select FILE_ID, | ||
+ | file_name, | ||
+ | Tablespace_name, | ||
+ | bytes/ | ||
+ | MAXBYTES/ | ||
+ | AUTOEXTENSIBLE " | ||
+ | from dba_data_files | ||
+ | order by FILE_ID | ||
+ | ;</ | ||
+ | or super simple: | ||
+ | <code sql> | ||
+ | select file_name from dba_data_files order by 1; | ||
+ | </ | ||
+ | |||
+ | ===== Tablespace creation ===== | ||
+ | ==== Without ASM==== | ||
+ | <code sql> | ||
+ | TABLESPACE " | ||
+ | DATAFILE '/ | ||
+ | SIZE 500M AUTOEXTEND | ||
+ | ON MAXSIZE 5000M | ||
+ | ; | ||
+ | </ | ||
+ | ==== With ASM==== | ||
+ | <code sql> | ||
+ | CREATE SMALLFILE | ||
+ | TABLESPACE " | ||
+ | DATAFILE ' | ||
+ | SIZE 500M AUTOEXTEND | ||
+ | ON MAXSIZE 5000M | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ===== View Tablespace DDL===== | ||
+ | <code sql> | ||
+ | select dbms_metadata.get_ddl(' | ||
+ | </ | ||
+ | |||
+ | ===== Add space to Tablespace ===== | ||
+ | <code sql> | ||
+ | add datafile / | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Space Information ===== | ||
+ | |||
+ | === ASM Diskgroup information==== | ||
+ | <code sql> | ||
+ | o | ||
+ | <code sql> | ||
+ | select | ||
+ | from v$asm_disk | ||
+ | order by group_number | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Tablespace information==== | ||
+ | Mi query, tiene en cuenta si el tablespace tiene autoextend o es de tamaño fijo para computar el espacio REAL: | ||
+ | <code sql> | ||
+ | COL TABLESPACE_NAME FORMAT A40 | ||
+ | COL MAX_MB FORMAT 99999999999 | ||
+ | COL REAL_FREE_MB FORMAT 99999999999 | ||
+ | COL PERCENT FORMAT 999.99 | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | MAX_MB, | ||
+ | REAL_FREE_MB FREE_MB, | ||
+ | MAX_MB-REAL_FREE_MB USED_MB, | ||
+ | (MAX_MB-REAL_FREE_MB)/ | ||
+ | FROM ( | ||
+ | SELECT MAXUSAGE.TABLESPACE_NAME, | ||
+ | MAXUSAGE.MAX_MB, | ||
+ | CASE WHEN MAXUSAGE.ACTUAL_DATAFILE_MB < MAXUSAGE.MAX_MB THEN | ||
+ | MAX_MB-(ACTUAL_DATAFILE_MB-FREE_MB) | ||
+ | ELSE | ||
+ | FREE_MB | ||
+ | END REAL_FREE_MB | ||
+ | FROM | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | SUM(case when MAXBYTES > 0 then MAXBYTES else BYTES END)/ | ||
+ | SUM(BYTES)/ | ||
+ | FROM DBA_DATA_FILES | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) MAXUSAGE, | ||
+ | ( | ||
+ | select TABLESPACE_NAME, | ||
+ | FROM dba_free_space | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) FREEUSAGE | ||
+ | WHERE MAXUSAGE.TABLESPACE_NAME=FREEUSAGE.TABLESPACE_NAME) | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Query " | ||
+ | <code sql>SET PAGES 999 | ||
+ | COL TABLESPACE_NAME FORMAT A40 | ||
+ | COL " | ||
+ | COL " | ||
+ | COL " | ||
+ | COL " | ||
+ | |||
+ | |||
+ | SELECT | ||
+ | CEIL(USED.USED_MB) " | ||
+ | USED.USED_MB-FREE.FREE_MB " | ||
+ | DECODE(CEIL(FREE.FREE_MB), | ||
+ | DECODE(100 - CEIL(FREE.FREE_MB/ | ||
+ | FROM ( | ||
+ | SELECT | ||
+ | SUM(BYTES)/ | ||
+ | FROM DBA_DATA_FILES | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | UNION ALL | ||
+ | SELECT TABLESPACE_NAME || ' | ||
+ | FROM DBA_TEMP_FILES | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) USED, | ||
+ | ( | ||
+ | SELECT | ||
+ | SUM(BYTES)/ | ||
+ | FROM DBA_FREE_SPACE | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) FREE | ||
+ | WHERE USED.TABLESPACE_NAME=FREE.TABLESPACE_NAME | ||
+ | ORDER BY 1 | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Space used by tables, indexes... ==== | ||
+ | |||
+ | Column format | ||
+ | <code SQL> | ||
+ | COL OWNER FORMAT A10; | ||
+ | COL SEGMENT_NAME FORMAT A35; | ||
+ | COL TABLESPACE_NAME FORMAT A35; | ||
+ | COL TOTAL_MB FORMAT 99999990.9999 ; | ||
+ | COL SUM_BYTES FORMAT 999999999999999999.9999 ; | ||
+ | </ | ||
+ | * Tables: | ||
+ | <code SQL> | ||
+ | SELECT | ||
+ | SUM(BYTES) SUM_BYTES, | ||
+ | NVL(SUM(BYTES)/ | ||
+ | FROM DBA_EXTENTS | ||
+ | WHERE OWNER=' | ||
+ | AND SEGMENT_TYPE=' | ||
+ | GROUP BY SEGMENT_NAME, | ||
+ | ORDER BY SEGMENT_NAME, | ||
+ | ; | ||
+ | </ | ||
+ | * Indexes: | ||
+ | <code SQL> | ||
+ | SELECT | ||
+ | SUM(BYTES) SUM_BYTES, | ||
+ | NVL(SUM(BYTES)/ | ||
+ | FROM DBA_EXTENTS | ||
+ | WHERE OWNER=' | ||
+ | AND SEGMENT_TYPE=' | ||
+ | GROUP BY SEGMENT_NAME, | ||
+ | ORDER BY SEGMENT_NAME, | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Sort by size: | ||
+ | * Tables: | ||
+ | <code sql> | ||
+ | SELECT SEGMENT_NAME, | ||
+ | ( | ||
+ | SELECT | ||
+ | SUM(BYTES) SUM_BYTES | ||
+ | FROM DBA_EXTENTS | ||
+ | WHERE OWNER=' | ||
+ | AND SEGMENT_TYPE=' | ||
+ | GROUP BY SEGMENT_NAME, | ||
+ | ) | ||
+ | ORDER BY SUM_BYTES | ||
+ | ; | ||
+ | </ | ||
+ | * Indixes: | ||
+ | <code sql> | ||
+ | SELECT SEGMENT_NAME, | ||
+ | ( | ||
+ | SELECT | ||
+ | SUM(BYTES) SUM_BYTES | ||
+ | FROM DBA_EXTENTS | ||
+ | WHERE OWNER=' | ||
+ | AND SEGMENT_TYPE=' | ||
+ | GROUP BY SEGMENT_NAME, | ||
+ | ) | ||
+ | ORDER BY SUM_BYTES | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== REAL space taken by a table ==== | ||
+ | Based on: | ||
+ | How To Find The Size Of A Number Of Rows Of A Table (Doc ID 1370050.1): | ||
+ | |||
+ | Se puede usar el AVG_ROW_LEN de DBA_TABLES, que es espacio medio en BYTES de cada row en la tabla. | ||
+ | |||
+ | Primero hay que lanzar el cálculo de stats: | ||
+ | <code sql> | ||
+ | ANALYZE TABLE < | ||
+ | </ | ||
+ | |||
+ | |||
+ | Necesitamos también el tamaño de bloque: | ||
+ | <code sql> | ||
+ | SHOW PARAMETER DB_BLOCK_SIZE | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | SELECT ( | ||
+ | (SELECT COUNT(*) FROM < | ||
+ | / | ||
+ | ((< | ||
+ | ) as ESTIMATED_MB | ||
+ | FROM DBA_TABLES | ||
+ | WHERE TABLE_NAME LIKE '< | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Space used by a table with LOB columns ==== | ||
+ | <code sql> | ||
+ | SELECT segment_name, | ||
+ | FROM dba_segments | ||
+ | WHERE ( | ||
+ | owner = ' | ||
+ | AND segment_name = ' | ||
+ | OR segment_name IN ( | ||
+ | SELECT segment_name | ||
+ | FROM all_lobs | ||
+ | WHERE table_name = ' | ||
+ | UNION | ||
+ | SELECT index_name | ||
+ | FROM all_lobs | ||
+ | WHERE table_name = ' | ||
+ | ) | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | ==== Space DELTA of a table ==== | ||
+ | Based on AWR tables: | ||
+ | <code sql> | ||
+ | |||
+ | SELECT | ||
+ | h.BEGIN_INTERVAL_TIME | ||
+ | FROM | ||
+ | DBA_OBJECTS o, | ||
+ | DBA_HIST_SNAPSHOT h, | ||
+ | ( | ||
+ | SELECT | ||
+ | SNAP_ID, | ||
+ | TS#, | ||
+ | OBJ#, | ||
+ | SPACE_USED_DELTA | ||
+ | FROM | ||
+ | DBA_HIST_SEG_STAT | ||
+ | where SPACE_USED_DELTA >0 | ||
+ | ) s, | ||
+ | v$tablespace t | ||
+ | WHERE | ||
+ | s.OBJ# = o.OBJECT_ID | ||
+ | AND s.TS# = t.TS# | ||
+ | and | ||
+ | and | ||
+ | and s.SNAP_ID = h.SNAP_ID | ||
+ | ORDER BY | ||
+ | 1 desc | ||
+ | ; | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== TEMP tablespace Management ===== | ||
+ | |||
+ | ==== TEMP tablespace datafiles ==== | ||
+ | <code SQL> | ||
+ | col file_name format a150 | ||
+ | |||
+ | SELECT | ||
+ | file_id, | ||
+ | file_name, | ||
+ | tablespace_name, | ||
+ | status | ||
+ | FROM | ||
+ | dba_temp_files; | ||
+ | </ | ||
+ | ==== New TEMP ==== | ||
+ | <code sql> | ||
+ | CREATE TEMPORARY TABLESPACE TEMP tempfile '/ | ||
+ | </ | ||
+ | |||
+ | ==== Add space to TEMP ==== | ||
+ | <code sql> | ||
+ | ALTER TABLESPACE TEMP ADD TEMPFILE | ||
+ | </ | ||
+ | |||
+ | ==== Switch TEMP tablespace ==== | ||
+ | <code sql> | ||
+ | ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== TEMP space usage ===== | ||
+ | |||
+ | Based on the following docs: | ||
+ | * Doc ID 793380.1 | ||
+ | * Doc ID 317441.1 | ||
+ | |||
+ | Both based on trying to solve ORA-1652 | ||
+ | |||
+ | Check the status of the sort segment utilization : | ||
+ | <code sql> | ||
+ | select TABLESPACE_NAME, | ||
+ | </ | ||
+ | |||
+ | And overall: | ||
+ | <code sql> | ||
+ | |||
+ | COL USERNAME FORMAT A33 | ||
+ | COL SID_SERIAL FORMAT A15 | ||
+ | COL OSUSER FORMAT A33 | ||
+ | COL TABLESPACE FORMAT A40 | ||
+ | COL sql_text format A100 word wrapped | ||
+ | |||
+ | SELECT a.username, | ||
+ | a.sid || ',' | ||
+ | a.osuser, | ||
+ | b.tablespace, | ||
+ | b.blocks, | ||
+ | c.sql_text | ||
+ | FROM v$session a, | ||
+ | v$tempseg_usage b, | ||
+ | v$sqlarea c | ||
+ | WHERE a.saddr = b.session_addr | ||
+ | AND c.address= a.sql_address | ||
+ | AND c.hash_value = a.sql_hash_value | ||
+ | ORDER BY b.tablespace, | ||
+ | </ | ||
+ | |||
+ | ==== Space used by TEMP==== | ||
+ | <code SQL> | ||
+ | COL TABLESPACE_SIZE FOR 999, | ||
+ | COL ALLOCATED_SPACE FOR 999, | ||
+ | COL FREE_SPACE FOR 999, | ||
+ | |||
+ | SELECT * | ||
+ | FROM | ||
+ | / | ||
+ | </ | ||
+ | Resumido en MB: | ||
+ | <code SQL> | ||
+ | SELECT | ||
+ | | ||
+ | | ||
+ | SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used, | ||
+ | | ||
+ | FROM | ||
+ | | ||
+ | ( | ||
+ | SELECT | ||
+ | | ||
+ | | ||
+ | SUM (C.bytes) / 1024 / 1024 mb_total | ||
+ | FROM | ||
+ | | ||
+ | | ||
+ | WHERE | ||
+ | | ||
+ | GROUP BY | ||
+ | | ||
+ | | ||
+ | ) D | ||
+ | WHERE | ||
+ | | ||
+ | GROUP by | ||
+ | | ||
+ | | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | =====Managing ASM===== | ||
+ | ==== Connection ==== | ||
+ | Export vars: | ||
+ | <code sql> | ||
+ | export ORACLE_BASE=/ | ||
+ | export ORACLE_SID=+ASM | ||
+ | export ORACLE_HOME=/ | ||
+ | export TNS_ADMIN=/ | ||
+ | export PATH=/ | ||
+ | sqlplus '/ as sysasm' | ||
+ | </ | ||
+ | O usar el " | ||
+ | |||
+ | Asm cli/ | ||
+ | <code sql> | ||
+ | |||
+ | ====Main views==== | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | | <code sql> | ||
+ | |||
+ | |||
+ | ==== Disk list ==== | ||
+ | <code sql> | ||
+ | COL PATH FORMAT A100 | ||
+ | COL NAME FORMAT A40 | ||
+ | COL FAILGROUP FORMAT A30 | ||
+ | SELECT | ||
+ | PATH, | ||
+ | OS_MB, | ||
+ | TOTAL_MB, | ||
+ | FREE_MB, | ||
+ | STATE, | ||
+ | REDUNDANCY, | ||
+ | FAILGROUP | ||
+ | FROM V$ASM_DISK | ||
+ | ORDER BY NAME | ||
+ | ; | ||
+ | </ | ||
+ | ==== Diskgroup list==== | ||
+ | <code sql> | ||
+ | COLUMN DISKGROUP FORMAT A20; | ||
+ | COLUMN CAPACITY FORMAT 999999999; | ||
+ | COLUMN TOTAL_MB FORMAT 999999999; | ||
+ | COLUMN FREE_MB FORMAT 999999999; | ||
+ | COLUMN SYS_PATH FORMAT A80; | ||
+ | SELECT D.NAME AS DISK_NAME, | ||
+ | G.NAME AS DISKGROUP, | ||
+ | D.OS_MB AS CAPACITY, | ||
+ | D.TOTAL_MB AS TOTAL_MB, | ||
+ | D.FREE_MB AS FREE_MB, | ||
+ | D.STATE AS STATE, | ||
+ | D.PATH AS SYS_PATH | ||
+ | FROM V$ASM_DISK D, V$ASM_DISKGROUP G | ||
+ | WHERE D.GROUP_NUMBER=G.GROUP_NUMBER ; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Diskgroups space==== | ||
+ | <code sql> | ||
+ | COLUMN DISKGROUP FORMAT A20; | ||
+ | COLUMN CAPACITY_GB FORMAT 999999999.99; | ||
+ | COLUMN FREE_GB FORMAT 999999999.99; | ||
+ | SELECT G.NAME AS DISKGROUP, | ||
+ | SUM(D.TOTAL_MB)/ | ||
+ | SUM(D.FREE_MB)/ | ||
+ | FROM V$ASM_DISK D, V$ASM_DISKGROUP G | ||
+ | WHERE D.GROUP_NUMBER=G.GROUP_NUMBER | ||
+ | GROUP BY G.NAME | ||
+ | ; | ||
+ | </ | ||
+ | ==== Diskgroups Info==== | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A60 | ||
+ | COL VALUE FORMAT A30 | ||
+ | SELECT dg.name AS diskgroup, | ||
+ | a.name, | ||
+ | A.VALUE, | ||
+ | READ_ONLY | ||
+ | FROM V$ASM_DISKGROUP dg, V$ASM_ATTRIBUTE a | ||
+ | WHERE dg.group_number = a.group_number | ||
+ | ORDER BY DG.NAME | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== Diskgroup Creation ==== | ||
+ | Para crear el diskgroup, debemos hacer un : | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | El dispositivo tiene que ser una partición de disco (no directamente un sdX) | ||
+ | |||
+ | Después, listamos el path desde ASM: | ||
+ | <code sql> | ||
+ | SELECT NAME, PATH FROM V$ASM_DISK ; | ||
+ | </ | ||
+ | Y con el path hacemos la query de create: | ||
+ | <code sql> | ||
+ | ' | ||
+ | ' | ||
+ | </ | ||
+ | ==== Diskgroup deletion==== | ||
+ | <code sql> | ||
+ | DROP DISKGROUP ' | ||
+ | </ | ||
+ | O | ||
+ | <code sql> | ||
+ | DROP DISKGROUP ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====ACFS===== | ||
+ | Documentación básica: | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== FRA ===== | ||
+ | Flash recovery area | ||
+ | |||
+ | ==== FRA reserved size ==== | ||
+ | <code sql> | ||
+ | show parameter db_recovery; | ||
+ | </ | ||
+ | |||
+ | ==== FRA space usage==== | ||
+ | <code sql> select * from v$flash_recovery_area_usage; | ||
+ | </ | ||
+ | y | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A100; | ||
+ | SELECT NAME, | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM V$RECOVERY_FILE_DEST ; | ||
+ | </ | ||
+ | ===== UNDO ===== | ||
+ | ==== Undo Info ==== | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A20; | ||
+ | COL VALUE FORMAT A60; | ||
+ | SELECT name, value | ||
+ | FROM gv$parameter | ||
+ | WHERE name LIKE ' | ||
+ | </ | ||
+ | |||
+ | ==== UNDO Space usage ==== | ||
+ | Very simple: | ||
+ | <code sql> | ||
+ | select tablespace_name, | ||
+ | from dba_undo_extents group by tablespace_name, | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | select | ||
+ | NVL(USEDSPACE.USED, | ||
+ | 100 - trunc(NVL(USEDSPACE.USED, | ||
+ | FROM ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = (SELECT value FROM v$parameter WHERE name LIKE ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) TOTALSPACE | ||
+ | LEFT OUTER JOIN | ||
+ | ( | ||
+ | SELECT TABLESPACE_NAME, | ||
+ | FROM DBA_UNDO_EXTENTS | ||
+ | WHERE (STATUS=' | ||
+ | AND TABLESPACE_NAME = (SELECT value FROM v$parameter WHERE name LIKE ' | ||
+ | GROUP BY TABLESPACE_NAME | ||
+ | ) USEDSPACE | ||
+ | ON TOTALSPACE.TABLESPACE_NAME=USEDSPACE.TABLESPACE_NAME | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== UNDO space usage by sessions | ||
+ | <code sql> | ||
+ | col ROLL_NAME format a30 | ||
+ | col userID format a40 | ||
+ | col sid_serial format a15 | ||
+ | COL PROGRAM FORMAT A50 | ||
+ | COL MACHINE FORMAT A40 | ||
+ | |||
+ | SELECT r.name roll_name, | ||
+ | | ||
+ | s.sid || ' | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM v$lock l, v$rollname r, v$session s | ||
+ | | ||
+ | AND TRUNC (l.id1(+) / 65536) = r.usn | ||
+ | AND l.TYPE(+) = ' | ||
+ | AND l.lmode(+) = 6 | ||
+ | ORDER BY r.name | ||
+ | / | ||
+ | </ | ||
+ | ==== Optimal UNDO retention ==== | ||
+ | <code sql> | ||
+ | col "UNDO RETENTION [Sec]" format a30 | ||
+ | SELECT d.undo_size/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM ( | ||
+ | | ||
+ | FROM v$datafile a, | ||
+ | | ||
+ | | ||
+ | WHERE c.contents = ' | ||
+ | AND c.status = ' | ||
+ | AND b.name = c.tablespace_name | ||
+ | AND a.ts# = b.ts# | ||
+ | ) d, | ||
+ | | ||
+ | | ||
+ | ( | ||
+ | | ||
+ | undo_block_per_sec | ||
+ | FROM v$undostat | ||
+ | ) g | ||
+ | WHERE e.name = ' | ||
+ | AND f.name = ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== UNDO space estimation ==== | ||
+ | |||
+ | <code sql> | ||
+ | SELECT d.undo_size/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | " | ||
+ | FROM ( | ||
+ | | ||
+ | FROM v$datafile a, | ||
+ | v$tablespace b, | ||
+ | dba_tablespaces c | ||
+ | WHERE c.contents = ' | ||
+ | AND c.status = ' | ||
+ | AND b.name = c.tablespace_name | ||
+ | AND a.ts# = b.ts# | ||
+ | ) d, | ||
+ | v$parameter e, | ||
+ | | ||
+ | ( | ||
+ | | ||
+ | | ||
+ | FROM v$undostat | ||
+ | ) g | ||
+ | WHERE e.name = ' | ||
+ | AND f.name = ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Add space to UNDO ==== | ||
+ | <code sql> | ||
+ | ALTER TABLESPACE undotbs_01 | ||
+ | ADD DATAFILE ' | ||
+ | MAXSIZE UNLIMITED; | ||
+ | </ | ||
+ | |||
+ | ==== New UNDO ==== | ||
+ | <code sql> | ||
+ | CREATE UNDO TABLESPACE undotbs_02 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== UNDO switch ==== | ||
+ | <code sql> | ||
+ | ALTER SYSTEM SET undo_tablespace = TESTUNDO SCOPE=BOTH; | ||
+ | </ | ||
+ | |||
+ | ==== Auto tuned " | ||
+ | Si estamos en Automatic UNDO management (lo normal), el parámetro UNDO_RETENTION es IGNORADO, y se gestiona dinámicamente basado en si el tablespace es fijo o dinámico e intentando mantener siempre la máxima retención en el UNDO y el umbral de alerta. | ||
+ | |||
+ | Para ver el auto tune: | ||
+ | <code sql> | ||
+ | COL begin_time format a30 | ||
+ | col end_time format a30 | ||
+ | col MAXQUERYID FORMAT A20 | ||
+ | |||
+ | SELECT to_char(begin_time, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM v$undostat | ||
+ | ORDER BY end_time; | ||
+ | </ | ||
+ | (más simple): | ||
+ | <code sql> | ||
+ | select to_char(begin_time, | ||
+ | | ||
+ | | ||
+ | from v$undostat | ||
+ | order by end_time; | ||
+ | </ | ||
+ | |||
+ | ==== UNDO alert threshold ==== | ||
+ | Cambiar '' | ||
+ | <code sql> | ||
+ | declare | ||
+ | warning_operator binary_integer; | ||
+ | warning_value varchar2(60); | ||
+ | critical_operator binary_integer; | ||
+ | critical_value varchar2(60); | ||
+ | observation_period binary_integer; | ||
+ | consecutive_occurrences binary_integer; | ||
+ | begin | ||
+ | |||
+ | dbms_server_alert.get_threshold( | ||
+ | dbms_server_alert.tablespace_pct_full, | ||
+ | warning_operator, | ||
+ | warning_value, | ||
+ | critical_operator, | ||
+ | critical_value, | ||
+ | observation_period, | ||
+ | consecutive_occurrences, | ||
+ | null, | ||
+ | dbms_server_alert.object_type_tablespace, | ||
+ | object_name => ' | ||
+ | |||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(' | ||
+ | dbms_output.put_line(' | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | y: | ||
+ | <code sql> | ||
+ | COL METRICS_NAME FORMAT A30; | ||
+ | COL WARNING_OPERATOR FORMAT A16; | ||
+ | COL WARNING_VALUE FORMAT A30; | ||
+ | COL CRITICAL_OPERATOR FORMAT A16; | ||
+ | COL CRITICAL_VALUE FORMAT A8; | ||
+ | COL OPERATION_PERIOD FORMAT A10; | ||
+ | COL CONSECUTIVE_OCCURRENCES FORMAT 9999999999; | ||
+ | COL INSTANCE_NAME FORMAT A15; | ||
+ | COL OBJECT_NAME FORMAT A12; | ||
+ | COL OBJECT_TYPE FORMAT A10; | ||
+ | COL STATUS FORMAT A10; | ||
+ | |||
+ | SELECT * FROM DBA_THRESHOLDS ; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== dNFS ===== | ||
+ | |||
+ | ==== List dNFS servers ==== | ||
+ | <code sql> | ||
+ | COL RDMAENABLE FORMAT A10 | ||
+ | COL SVRNAME FORMAT A30 | ||
+ | col DIRNAME FORMAT A120 | ||
+ | select * from V$DNFS_SERVERS ; | ||
+ | </ | ||
+ | |||
+ | ==== List dNFS channels ==== | ||
+ | <code sql> | ||
+ | col path format a40 | ||
+ | col local format a40 | ||
+ | col SVRNAME format a40 | ||
+ | select pnum, svrname, path, local from v$dnfs_channels ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== List dNFS Files ==== | ||
+ | <code sql> | ||
+ | COL FILENAME FORMAT A200 | ||
+ | select * from V$DNFS_FILES ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== [SECTION] | ||
+ | =====Listar===== | ||
+ | * Todos: | ||
+ | <code sql> | ||
+ | * Activos: | ||
+ | <code sql> | ||
+ | |||
+ | =====Profiles===== | ||
+ | <code sql> | ||
+ | col profile format a30 | ||
+ | col resource_name format a50 ; | ||
+ | col limit format a30 | ||
+ | |||
+ | SELECT * | ||
+ | FROM DBA_PROFILES | ||
+ | order by profile, resource_name ; | ||
+ | </ | ||
+ | |||
+ | =====Ver como esta creado===== | ||
+ | Esto se refiere a un " | ||
+ | <code sql> | ||
+ | select dbms_metadata.get_ddl('' | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Grants===== | ||
+ | ==== De sistema ==== | ||
+ | <code sql> | ||
+ | SELECT LPAD(' ', 2*level) || granted_role "USER PRIVS" | ||
+ | FROM ( | ||
+ | SELECT NULL grantee, username granted_role FROM dba_users WHERE username LIKE UPPER(' | ||
+ | UNION | ||
+ | SELECT grantee, granted_role FROM dba_role_privs | ||
+ | UNION | ||
+ | SELECT grantee, privilege FROM dba_sys_privs | ||
+ | ) | ||
+ | START WITH grantee IS NULL | ||
+ | CONNECT BY grantee = prior granted_role | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Plain mode: | ||
+ | <code sql> | ||
+ | SELECT GRANTED_ROLE FROM ( | ||
+ | SELECT grantee, granted_role FROM dba_role_privs | ||
+ | UNION | ||
+ | SELECT grantee, privilege FROM dba_sys_privs | ||
+ | ) | ||
+ | WHERE GRANTEE=' | ||
+ | </ | ||
+ | ====Sobre Objects==== | ||
+ | |||
+ | Mega query para obtener lo que sea: | ||
+ | <code sql> | ||
+ | COL OBJECT_NAME FORMAT A35 | ||
+ | COL OBJECT_TYPE FORMAT A25 | ||
+ | COL OWNER FORMAT A33 | ||
+ | COL GRANTOR FORMAT A33 | ||
+ | COL GRANTEE FORMAT A33 | ||
+ | COL PERMISSION_NAME FORMAT A50 | ||
+ | SELECT | ||
+ | OBJECT_TYPE, | ||
+ | -- | ||
+ | GRANTOR, | ||
+ | GRANTEE, | ||
+ | -- | ||
+ | PERMISSION_NAME | ||
+ | FROM ( | ||
+ | SELECT | ||
+ | decode (OBJECT.TYPE#, | ||
+ | 0, 'NEXT OBJECT', | ||
+ | 3, ' | ||
+ | 7, ' | ||
+ | 11, ' | ||
+ | 14, 'TYPE BODY', 19, 'TABLE PARTITION', | ||
+ | 20, 'INDEX PARTITION', | ||
+ | 23, ' | ||
+ | 29, 'JAVA CLASS', | ||
+ | 32, ' | ||
+ | 34, 'TABLE SUBPARTITION', | ||
+ | 40, 'LOB PARTITION', | ||
+ | 42, ' | ||
+ | 44, ' | ||
+ | 48, ' | ||
+ | 56, 'JAVA DATA', 57, ' | ||
+ | 60, ' | ||
+ | 66, ' | ||
+ | 69, ' | ||
+ | 79, ' | ||
+ | 87, ' | ||
+ | 92, 'CUBE DIMENSION', | ||
+ | 94, ' | ||
+ | 100, 'FILE WATCHER', | ||
+ | ) OBJECT_TYPE, | ||
+ | U.NAME | ||
+ | UR.NAME | ||
+ | UE.NAME | ||
+ | OA.PRIVILEGE# | ||
+ | MIN(TPM.NAME) PERMISSION_NAME | ||
+ | FROM sys.objauth$ oa, | ||
+ | sys." | ||
+ | sys.USER$ U, | ||
+ | sys.USER$ UR, | ||
+ | sys.USER$ UE, | ||
+ | sys.table_privilege_map TPM | ||
+ | WHERE | ||
+ | AND | ||
+ | AND | ||
+ | AND | ||
+ | AND | ||
+ | AND | ||
+ | GROUP BY OBJECT.NAME, | ||
+ | ) | ||
+ | WHERE GRANTOR=' | ||
+ | AND GRANTEE=' | ||
+ | AND OWNER=' | ||
+ | AND OBJECT_TYPE=' | ||
+ | AND OBJECT_NAME=' | ||
+ | ORDER BY OBJECT_NAME, | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Aparte, los grants sobre objects se detallan en las vistas: | ||
+ | * table_privileges | ||
+ | * dba_role_privs | ||
+ | De CADA ESQUEMA. | ||
+ | Es decir, los que concede SYS están en su esquema, los que concede ADMINUSER están en su propio esquema. | ||
+ | Hay que hacer switch a cada esquema para conocer sus grants | ||
+ | |||
+ | * Grants directos: | ||
+ | <code SQL> | ||
+ | SELECT owner, table_name, select_priv, | ||
+ | FROM table_privileges | ||
+ | WHERE grantee = '& | ||
+ | ORDER BY owner, table_name; | ||
+ | </ | ||
+ | * Grants INdirectos: | ||
+ | <code sql> | ||
+ | SELECT DISTINCT owner, table_name, PRIVILEGE | ||
+ | FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role) | ||
+ | WHERE rp.grantee = '& | ||
+ | ORDER BY owner, table_name; | ||
+ | </ | ||
+ | |||
+ | =====quota sobre tablespaces===== | ||
+ | |||
+ | <code sql> | ||
+ | select * from DBA_TS_QUOTAS order by TABLESPACE_NAME, | ||
+ | </ | ||
+ | |||
+ | =====Alta===== | ||
+ | <code sql> | ||
+ | PROFILE " | ||
+ | IDENTIFIED BY " | ||
+ | TEMPORARY TABLESPACE " | ||
+ | ACCOUNT UNLOCK ; | ||
+ | |||
+ | grant CONNECT, RESOURCE to " | ||
+ | </ | ||
+ | =====Re-Crear usuario===== | ||
+ | Si el usuario ya existe/ | ||
+ | <code sql>set serveroutput on size 200000 | ||
+ | |||
+ | declare | ||
+ | stmt varchar2(200); | ||
+ | v_old_hash user$.password%type; | ||
+ | v_new_hash user$.spare4%type; | ||
+ | v_hash varchar2(200); | ||
+ | begin | ||
+ | for user_rec in (select name, password, spare4 from user$ where type#=1 and astatus in(0,1,2)) loop | ||
+ | v_old_hash := user_rec.password; | ||
+ | v_new_hash := user_rec.spare4; | ||
+ | if not ((v_old_hash is null) and (v_new_hash is null)) then | ||
+ | if (v_new_hash is null) then | ||
+ | if v_old_hash <> ' | ||
+ | | ||
+ | else | ||
+ | goto end_loop; | ||
+ | end if; | ||
+ | end if; | ||
+ | if (v_old_hash is null) then | ||
+ | v_hash := '''' | ||
+ | end if; | ||
+ | if ((v_old_hash is not null) and (v_new_hash is not null)) then | ||
+ | v_hash := '''' | ||
+ | end if; | ||
+ | stmt := 'alter user ' | ||
+ | end if; | ||
+ | | ||
+ | << | ||
+ | null; | ||
+ | end loop; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | La columna ASTATUS de USER$ la he limitado a 3 valores: | ||
+ | * 0 = ACCOUNT_STATUS OPEN | ||
+ | * 1 = ACCOUNT_STATUS EXPIRED | ||
+ | * 2 = ACCOUNT_STATUS EXPIRED(GRACE) | ||
+ | |||
+ | Y luego usarlo en la query: | ||
+ | <code sql> | ||
+ | PROFILE " | ||
+ | IDENTIFIED BY VALUES '< | ||
+ | DEFAULT TABLESPACE " | ||
+ | TEMPORARY TABLESPACE " | ||
+ | ACCOUNT UNLOCK ; | ||
+ | </ | ||
+ | |||
+ | Podemos obtener previamente los datos necesarios (tablespace, | ||
+ | <code sql> | ||
+ | ' IDENTIFIED BY VALUES ''' | ||
+ | ''' | ||
+ | ' TEMPORARY TABLESPACE | ||
+ | ' PROFILE ' || D.PROFILE || | ||
+ | ' ACCOUNT UNLOCK ; ' | ||
+ | FROM DBA_USERS D, SYS.USER$ S | ||
+ | WHERE D.USER_ID=S.USER# | ||
+ | AND | ||
+ | USERNAME = ' | ||
+ | </ | ||
+ | |||
+ | Se usa el combo '< | ||
+ | |||
+ | [[http:// | ||
+ | =====Borrar===== | ||
+ | <code sql>drop user USERNAME cascade ;</ | ||
+ | Cuidado con el cascade por el tema de privilegios concedidos (puede seguir el cascade a otros usuarios). | ||
+ | |||
+ | =====Cambiar de usuario===== | ||
+ | <code sql> | ||
+ | ALTER SESSION SET CURRENT_SCHEMA=" | ||
+ | </ | ||
+ | Entre comillas por que lo que se cambia así es el // | ||
+ | |||
+ | Verificar: | ||
+ | <code sql> | ||
+ | select sys_context (' | ||
+ | </ | ||
+ | =====Cambiar password de usuario===== | ||
+ | <code sql> | ||
+ | |||
+ | =====Desbloquear un usuario===== | ||
+ | <code sql> | ||
+ | |||
+ | =====Clonar un usuario===== | ||
+ | Para clonar un usuario sin clonar los datos (remap desde export) se puede usar el siguiente script: | ||
+ | <code sql>-- user_clone.sql | ||
+ | -- Andy Barry/A | ||
+ | -- 20/02/06 | ||
+ | -- modified by dodger | ||
+ | -- 17/02/2010 | ||
+ | |||
+ | set lines 999 pages 999 | ||
+ | set verify off | ||
+ | set feedback off | ||
+ | set heading off | ||
+ | |||
+ | select username from dba_users order by username | ||
+ | / | ||
+ | |||
+ | undefine user | ||
+ | |||
+ | accept userid prompt 'Enter user to clone: ' | ||
+ | accept newuser prompt 'Enter new username: ' | ||
+ | accept passwd prompt 'Enter new password: ' | ||
+ | |||
+ | select username, created | ||
+ | from | ||
+ | where lower(username) = lower('& | ||
+ | / | ||
+ | |||
+ | accept poo prompt ' | ||
+ | spool / | ||
+ | |||
+ | select ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | from | ||
+ | where username = '&& | ||
+ | / | ||
+ | |||
+ | |||
+ | select 'alter user & | ||
+ | | ||
+ | , | ||
+ | ' | ||
+ | from | ||
+ | where username = '&& | ||
+ | / | ||
+ | |||
+ | select 'grant ' ||granted_role || ' to & | ||
+ | | ||
+ | from | ||
+ | where grantee = '&& | ||
+ | / | ||
+ | |||
+ | select 'grant ' || privilege || ' to & | ||
+ | | ||
+ | from | ||
+ | where grantee = '&& | ||
+ | / | ||
+ | |||
+ | select 'grant ' || privilege || ' to & | ||
+ | | ||
+ | from | ||
+ | where grantee = '&& | ||
+ | / | ||
+ | |||
+ | |||
+ | spool off | ||
+ | |||
+ | undefine user | ||
+ | |||
+ | set verify on | ||
+ | set feedback on | ||
+ | set heading on | ||
+ | </ | ||
+ | |||
+ | Esto genera un script SQL "< | ||
+ | Hay que tener en cuenta si queremos que el usuario tenga los datos en un tablespace diferente, para lo cual hay que cambiar el create user por supuesto. | ||
+ | |||
+ | =====Limites===== | ||
+ | ====Estado==== | ||
+ | <code sql> | ||
+ | show parameter resource_limit ; | ||
+ | </ | ||
+ | ====Activar==== | ||
+ | <code sql> | ||
+ | </ | ||
+ | ====Crear profile con limite==== | ||
+ | <code sql> | ||
+ | CREATE PROFILE " | ||
+ | </ | ||
+ | y modificar el usuario: | ||
+ | <code sql> | ||
+ | ALTER USER USERNAME PROFILE LIMIT ; | ||
+ | </ | ||
+ | ====== [SECTION] | ||
+ | |||
+ | ===== UDT: User defined types ===== | ||
+ | |||
+ | ==== List UDTs ==== | ||
+ | <code sql> | ||
+ | col type_name format a40 | ||
+ | col type_oid format a40 | ||
+ | col SUPERTYPE_NAME format a40 | ||
+ | col SUPERTYPE_OWNER format a40 | ||
+ | select owner, | ||
+ | type_name, | ||
+ | type_oid, | ||
+ | SUPERTYPE_OWNER, | ||
+ | SUPERTYPE_NAME | ||
+ | from dba_types | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== List UDTs usage in tables ==== | ||
+ | <code sql> | ||
+ | col type_name format a40 | ||
+ | col type_oid format a40 | ||
+ | |||
+ | select owner, | ||
+ | table_name, | ||
+ | column_name, | ||
+ | data_type, | ||
+ | virtual_column | ||
+ | from dba_tab_cols | ||
+ | where data_type in ( | ||
+ | select | ||
+ | type_name | ||
+ | from dba_types | ||
+ | where NOT owner in ( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ) | ||
+ | group by type_name | ||
+ | ) | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== Compilar ===== | ||
+ | |||
+ | Compile an object: | ||
+ | <code sql> | ||
+ | </ | ||
+ | * Paquete: | ||
+ | <code sql> | ||
+ | * Trigger: | ||
+ | <code sql> | ||
+ | </ | ||
+ | |||
+ | Compile ALL objects (invalid): | ||
+ | See: | ||
+ | [[dba: | ||
+ | |||
+ | ===== DBMS_METADATA ===== | ||
+ | |||
+ | ==== Tuning de la salida de DBMS_METADATA ==== | ||
+ | Excluir las claúsulas de storage: | ||
+ | <code sql> | ||
+ | execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,' | ||
+ | </ | ||
+ | Excluir | ||
+ | <code sql> | ||
+ | execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,' | ||
+ | </ | ||
+ | Que escriba el terminador de objeto (muy recomendado): | ||
+ | <code sql> | ||
+ | execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,' | ||
+ | </ | ||
+ | No Incluir fk's: | ||
+ | <code sql> | ||
+ | execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,' | ||
+ | </ | ||
+ | No incluir constraints: | ||
+ | <code sql> | ||
+ | execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,' | ||
+ | </ | ||
+ | |||
+ | ==== Obtener metadatos ==== | ||
+ | <code sql> | ||
+ | SELECT DBMS_METADATA.GET_DDL(' | ||
+ | </ | ||
+ | |||
+ | Lista de nombre de objects soportados por [[http:// | ||
+ | |||
+ | ==== Obtener metadatos de dependencias ==== | ||
+ | <code sql> | ||
+ | SELECT DBMS_METADATA.GET_DEPENDENT_DDL(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Usar source$ para obtener metadatos ==== | ||
+ | |||
+ | Buscar OBJ# (object identifier): | ||
+ | <code sql> | ||
+ | col name format a40 | ||
+ | col subname format a40 | ||
+ | |||
+ | SELECT obj#, | ||
+ | dataobj#, | ||
+ | name, | ||
+ | subname, | ||
+ | CTIME , | ||
+ | MTIME, | ||
+ | STIME , | ||
+ | STATUS | ||
+ | FROM obj$ | ||
+ | WHERE name LIKE ' | ||
+ | </ | ||
+ | |||
+ | Buscar SOURCE: | ||
+ | <code sql> | ||
+ | SELECT * | ||
+ | FROM source$ | ||
+ | WHERE OBJ# IN | ||
+ | ( | ||
+ | SELECT obj# FROM obj$ WHERE name LIKE ' | ||
+ | ) ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | =====Performance views de oracle===== | ||
+ | <code sql> | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | select name from V$FIXED_TABLE ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Tipos de objects===== | ||
+ | No existe ninguna tabla que determine el nombre de los objects, se pueden obtener (más o menos así): | ||
+ | <code sql> | ||
+ | SELECT OBJECT_TYPE FROM SYS.ALL_OBJECTS GROUP BY OBJECT_TYPE ; | ||
+ | </ | ||
+ | |||
+ | =====Objects por tipo===== | ||
+ | Cualquier owner: | ||
+ | <code sql> | ||
+ | SELECT OBJECT_NAME, | ||
+ | FROM SYS.ALL_OBJECTS | ||
+ | WHERE OBJECT_TYPE LIKE ' | ||
+ | ; | ||
+ | </ | ||
+ | Con un owner determinado: | ||
+ | <code sql> | ||
+ | SELECT OBJECT_NAME, | ||
+ | FROM SYS.ALL_OBJECTS | ||
+ | WHERE OBJECT_TYPE LIKE ' | ||
+ | AND OWNER LIKE ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Varios tipos | ||
+ | <code sql> | ||
+ | SELECT | ||
+ | </ | ||
+ | |||
+ | =====Tablas===== | ||
+ | ====Logado como un usuario==== | ||
+ | Se pueden listar: | ||
+ | | NOMBRE DE LA TABLA | Descripción | | ||
+ | | dba_tables | objects accesibles siendo un dba (todo) | | ||
+ | | user_tables | tablas accesibles por el usuario que estamos usando | | ||
+ | | all_tables | todo | | ||
+ | |||
+ | <code sql> | ||
+ | ====Desde sys==== | ||
+ | <code sql> | ||
+ | |||
+ | ====Query al dict==== | ||
+ | <code sql> | ||
+ | SELECT TABLE_NAME FROM DICT WHERE TABLE_NAME LIKE ' | ||
+ | </ | ||
+ | |||
+ | =====Ver índices de una tabla===== | ||
+ | <code sql> | ||
+ | select index_name from dba_indexes where table_name=' | ||
+ | </ | ||
+ | Y la descripción del índice: | ||
+ | <code sql> | ||
+ | select DBMS_METADATA.GET_DDL(' | ||
+ | </ | ||
+ | |||
+ | O una descripción rápida: | ||
+ | <code sql> | ||
+ | COL INDEX_OWNER | ||
+ | COL INDEX_NAME | ||
+ | COL TABLE_OWNER | ||
+ | COL TABLE_NAME | ||
+ | COL COLUMN_NAME | ||
+ | COL COLUMN_POSITION | ||
+ | COL COLUMN_LENGTH | ||
+ | COL CHAR_LENGTH | ||
+ | COL DESCEND | ||
+ | SELECT * FROM ALL_IND_COLUMNS WHERE OWNER='< | ||
+ | </ | ||
+ | |||
+ | ===== Columnas de las tablas ===== | ||
+ | <code sql> | ||
+ | COL OWNER FORMAT A30; | ||
+ | COL TABLE_NAME FORMAT A30; | ||
+ | COL COLUMN_NAME FORMAT A30; | ||
+ | COL DATA_TYPE FORMAT A50; | ||
+ | SELECT OWNER, | ||
+ | TABLE_NAME, | ||
+ | COLUMN_NAME, | ||
+ | DATA_TYPE, | ||
+ | DATA_LENGTH | ||
+ | FROM ALL_TAB_COLUMNS | ||
+ | WHERE OWNER = '< | ||
+ | ORDER BY OWNER, | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Virtual columns ===== | ||
+ | <code sql> | ||
+ | COL OWNER FORMAT A30; | ||
+ | COL TABLE_NAME FORMAT A30; | ||
+ | COL COLUMN_NAME FORMAT A30; | ||
+ | COL virtual_column FORMAT A5; | ||
+ | |||
+ | select owner, | ||
+ | table_name, | ||
+ | column_name, | ||
+ | virtual_column | ||
+ | from dba_tab_cols | ||
+ | where VIRTUAL_COLUMN=' | ||
+ | and OWNER in ( ' | ||
+ | order by owner, table_name, column_name | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Not owned by system users: | ||
+ | <code sql> | ||
+ | COL OWNER FORMAT A30; | ||
+ | COL TABLE_NAME FORMAT A30; | ||
+ | COL COLUMN_NAME FORMAT A30; | ||
+ | COL virtual_column FORMAT A5; | ||
+ | |||
+ | select owner, | ||
+ | table_name, | ||
+ | column_name, | ||
+ | virtual_column | ||
+ | from dba_tab_cols | ||
+ | where VIRTUAL_COLUMN=' | ||
+ | and NOT owner in ( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ) | ||
+ | order by owner, table_name, column_name | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== Tablas particionadas ===== | ||
+ | ==== Listar tablas particionadas de los usuarios ==== | ||
+ | <code sql> | ||
+ | SELECT TABLE_OWNER, | ||
+ | FROM ALL_TAB_PARTITIONS | ||
+ | WHERE TABLE_OWNER NOT IN (' | ||
+ | GROUP BY TABLE_OWNER, | ||
+ | </ | ||
+ | |||
+ | Más info: | ||
+ | <code sql> | ||
+ | col table_owner format a20 | ||
+ | col COMPRESS_FOR format a30 | ||
+ | |||
+ | SELECT | ||
+ | TABLE_OWNER, | ||
+ | TABLE_NAME, | ||
+ | PARTITION_NAME, | ||
+ | PARTITION_POSITION, | ||
+ | TABLESPACE_NAME, | ||
+ | LOGGING, | ||
+ | COMPRESSION, | ||
+ | COMPRESS_FOR, | ||
+ | AVG_ROW_LEN | ||
+ | FROM DBA_TAB_PARTITIONS | ||
+ | WHERE TABLE_OWNER NOT IN (' | ||
+ | order by PARTITION_NAME | ||
+ | / | ||
+ | </ | ||
+ | ==== Numero de rows de cada partición ==== | ||
+ | <code sql> | ||
+ | COL TABLE_OWNER FORMAT A20; | ||
+ | COL TABLE_NAME FORMAT A20; | ||
+ | SELECT TABLE_OWNER, | ||
+ | FROM ALL_TAB_PARTITIONS | ||
+ | WHERE TABLE_OWNER NOT IN (' | ||
+ | AND NUM_ROWS IS NOT NULL | ||
+ | ORDER BY PARTITION_POSITION DESC, TABLE_NAME ASC ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | =====Jerarquía de tablas===== | ||
+ | dead :-/ | ||
+ | * [[https:// | ||
+ | |||
+ | Encontrar Tablas Maestras/ | ||
+ | <code sql> | ||
+ | SELECT TABLE_NAME | ||
+ | FROM dba_CONSTRAINTS | ||
+ | WHERE owner='< | ||
+ | AND CONSTRAINT_NAME IN ( | ||
+ | SELECT R_CONSTRAINT_NAME | ||
+ | FROM dba_CONSTRAINTS | ||
+ | WHERE owner='< | ||
+ | AND CONSTRAINT_TYPE=' | ||
+ | ) | ||
+ | AND NOT TABLE_NAME IN ( | ||
+ | SELECT TABLE_NAME | ||
+ | FROM dba_CONSTRAINTS | ||
+ | WHERE owner='< | ||
+ | AND CONSTRAINT_TYPE=' | ||
+ | ) | ||
+ | ORDER BY TABLE_NAME | ||
+ | / | ||
+ | </ | ||
+ | =====Dependencias entre objects===== | ||
+ | |||
+ | |||
+ | ==== Query genérica para buscar deps ==== | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A35 | ||
+ | COL OWNER FORMAT A30 | ||
+ | COL TYPE FORMAT A30 | ||
+ | COL REFERENCED_OWNER FORMAT A30 | ||
+ | COL REFERENCED_TYPE FORMAT A30 | ||
+ | COL DEPENDENCY_TYPE FORMAT A20 | ||
+ | COL REFERENCED_NAME FORMAT A33 | ||
+ | select | ||
+ | | ||
+ | | ||
+ | name, | ||
+ | | ||
+ | | ||
+ | | ||
+ | from | ||
+ | | ||
+ | where | ||
+ | | ||
+ | or | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | order by | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Using utldtree.sql ==== | ||
+ | Ejecutar: | ||
+ | < | ||
+ | @${ORACLE_HOME}/ | ||
+ | </ | ||
+ | |||
+ | Después ejecutar para el objects que queramos, el procedure: | ||
+ | <code sql> | ||
+ | EXEC deptree_fill(' | ||
+ | </ | ||
+ | y ver el resultado: | ||
+ | <code sql> | ||
+ | select * from ideptree; | ||
+ | </ | ||
+ | |||
+ | ==== dba_dependencies.sql==== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | |||
+ | //The attached SQL file will show all dependencies for an object, | ||
+ | both forwards and backwards through the heirarchy of objects | ||
+ | in DBA_DEPENDENCIES, | ||
+ | |||
+ | //The LAST_DDL_TIME should help track down why an object became invalid.// | ||
+ | |||
+ | //I'm fairly sure this query will not work in 8i. :(// | ||
+ | |||
+ | //You can circumvent that by logging into some account other than SYS | ||
+ | and creating a table DBA_DEPENDENCIES. | ||
+ | to queries on complex views and ' | ||
+ | |||
+ | '' | ||
+ | as | ||
+ | select * from sys.dba_dependencies ;'' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <code sql> | ||
+ | -- | ||
+ | Jared Still | ||
+ | Certifiable Oracle DBA and Part Time Perl Evangelist | ||
+ | -- dba_dependencies.sql | ||
+ | -- jkstill@xxxxxxxxx | ||
+ | -- base query from Jacques Kilchoer | ||
+ | -- 11/07/2006 - jkstill - added no_merge hints | ||
+ | -- | ||
+ | -- added ' | ||
+ | -- | ||
+ | -- | ||
+ | -- call on the command line: | ||
+ | -- | ||
+ | -- if not on the command line, user will be | ||
+ | -- prompted for values | ||
+ | |||
+ | |||
+ | @clears | ||
+ | @columns | ||
+ | |||
+ | prompt Dependencies for Owner?: | ||
+ | |||
+ | col cowner noprint new_value uowner | ||
+ | set term off feed off | ||
+ | select upper('& | ||
+ | set term on feed on | ||
+ | |||
+ | prompt Dependencies for Object?: | ||
+ | |||
+ | col cobject noprint new_value uobject | ||
+ | set term off feed off | ||
+ | select upper('& | ||
+ | set term on feed on | ||
+ | |||
+ | set line 142 pages 60 | ||
+ | |||
+ | column display_parent format a58 | ||
+ | column display_child format a58 | ||
+ | column referenced_owner noprint | ||
+ | column referenced_object noprint | ||
+ | column referenced_type noprint | ||
+ | column owner noprint | ||
+ | column object noprint | ||
+ | column type noprint | ||
+ | column last_ddl_time format a22 head 'CHILD DDL TIME' | ||
+ | |||
+ | undef 1 2 | ||
+ | |||
+ | with dependencies as ( | ||
+ | -- top down through the heirarchy | ||
+ | select /*+ no_merge */ | ||
+ | referenced_type || ' "' | ||
+ | referenced_name || '"' | ||
+ | type || ' "' | ||
+ | level hlevel, | ||
+ | referenced_owner, | ||
+ | owner, name, type | ||
+ | from dba_dependencies | ||
+ | start with | ||
+ | referenced_owner = '&& | ||
+ | and referenced_name = '&& | ||
+ | connect by | ||
+ | referenced_owner = prior owner | ||
+ | and referenced_name = prior name | ||
+ | and referenced_type = prior type | ||
+ | union | ||
+ | -- bottom up through the heirarchy | ||
+ | select /*+ no_merge */ | ||
+ | referenced_type || ' "' | ||
+ | referenced_name || '"' | ||
+ | type || ' "' | ||
+ | level hlevel, | ||
+ | referenced_owner, | ||
+ | owner, name, type | ||
+ | from dba_dependencies | ||
+ | start with | ||
+ | owner = '&& | ||
+ | and name = '&& | ||
+ | connect by | ||
+ | owner = prior referenced_owner | ||
+ | and name = prior referenced_name | ||
+ | and type = prior referenced_type | ||
+ | order by 1, 2 | ||
+ | ) | ||
+ | select lpad(' ', | ||
+ | display_child, | ||
+ | from dependencies d, dba_objects o | ||
+ | where o.owner = d.owner | ||
+ | and o.object_type = d.type | ||
+ | and d.name = o.object_name | ||
+ | order by parent, child | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== Listar foreign keys de una tabla ==== | ||
+ | |||
+ | <code sql> | ||
+ | COL OWNER FORMAT A30 | ||
+ | COL R_OWNER FORMAT A30 | ||
+ | COL CONSTRAINT_NAME FORMAT A50 | ||
+ | COL R_CONSTRAINT_NAME FORMAT A50 | ||
+ | |||
+ | SELECT OWNER, | ||
+ | CONSTRAINT_NAME, | ||
+ | CONSTRAINT_TYPE, | ||
+ | TABLE_NAME, | ||
+ | R_OWNER, | ||
+ | R_CONSTRAINT_NAME, | ||
+ | STATUS | ||
+ | FROM USER_CONSTRAINTS | ||
+ | WHERE TABLE_NAME LIKE ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== List VIEW dependencies ==== | ||
+ | |||
+ | <code sql> | ||
+ | COL SCHEMA_NAME FORMAT A40 | ||
+ | COL REFERENCED_SCHEMA_NAME FORMAT A40 | ||
+ | COL REFERENCED_NAME FORMAT A40 | ||
+ | col REFERENCED_TYPE | ||
+ | |||
+ | select owner as schema_name, | ||
+ | name as view_name, | ||
+ | | ||
+ | | ||
+ | | ||
+ | from sys.dba_dependencies | ||
+ | where type = ' | ||
+ | -- AND OWNER=' | ||
+ | -- and name LIKE ' | ||
+ | order by owner, name, referenced_name, | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== More info ==== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ====== [SECTION] | ||
+ | =====Listar numero de sesiones===== | ||
+ | <code sql> | ||
+ | rpad(' | ||
+ | ' | ||
+ | ' | ||
+ | from | ||
+ | | ||
+ | | ||
+ | | ||
+ | where | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Usuarios conectados ===== | ||
+ | <code sql> | ||
+ | col ID format a15; | ||
+ | col USERNAME FORMAT A30 ; | ||
+ | col OSUSER FORMAT A40 ; | ||
+ | COL MACHINE FORMAT A20 WORD WRAPPED; | ||
+ | COL " | ||
+ | SELECT USERNAME, | ||
+ | SID || ',' | ||
+ | STATUS, | ||
+ | OSUSER, | ||
+ | MACHINE, | ||
+ | SQL_ID, | ||
+ | LAST_CALL_ET "Last Activity" | ||
+ | from v$session | ||
+ | where username is not null | ||
+ | order by status desc, last_call_et desc | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Numero de sesiones por usuario ===== | ||
+ | <code sql> | ||
+ | COLUMN USERNAME FORMAT A35 WORD_WRAPPED ; | ||
+ | COLUMN num_of_sessions FORMAT 99999999999 ; | ||
+ | SELECT ses.username username, | ||
+ | count(*) num_of_sessions | ||
+ | FROM V$SESSION SES, V$PROCESS P | ||
+ | WHERE SES.paddr = p.addr | ||
+ | AND ses.username IS NOT NULL | ||
+ | group by ses.username | ||
+ | ORDER BY num_of_sessions | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =====Listar sesiones===== | ||
+ | |||
+ | <code sql> | ||
+ | COLUMN SID_SERIAL FORMAT A20 ; | ||
+ | COLUMN OSPID FORMAT A7; | ||
+ | COLUMN SQLID FORMAT A15 WORD_WRAPPED ; | ||
+ | COLUMN USERNAME FORMAT A25 WORD_WRAPPED ; | ||
+ | COLUMN OSUSER FORMAT A45 WORD_WRAPPED ; | ||
+ | COLUMN HOSTNAME FORMAT A33 WORD_WRAPPED ; | ||
+ | col client_info format a40 ; | ||
+ | COLUMN PROGRAM FORMAT A70 WORD_WRAPPED; | ||
+ | SELECT ses.sid || ',' | ||
+ | p.spid as OSPID, | ||
+ | SES.SQL_ID SQLID, | ||
+ | SES.USERNAME USERNAME, | ||
+ | SES.OSUSER OSUSER, | ||
+ | SES.MACHINE HOSTNAME, | ||
+ | SES.PROGRAM PROGRAM, | ||
+ | SES.CLIENT_INFO | ||
+ | FROM V$SESSION SES, V$PROCESS P | ||
+ | WHERE SES.paddr = p.addr | ||
+ | ORDER BY SES.MACHINE | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Con usuario inicializado: | ||
+ | <code sql> | ||
+ | COLUMN SID_SERIAL FORMAT A20 ; | ||
+ | COLUMN OSPID FORMAT A7; | ||
+ | COLUMN SQLID FORMAT A15 WORD_WRAPPED ; | ||
+ | COLUMN USERNAME FORMAT A25 WORD_WRAPPED ; | ||
+ | COLUMN OSUSER FORMAT A45 WORD_WRAPPED ; | ||
+ | COLUMN HOSTNAME FORMAT A33 WORD_WRAPPED ; | ||
+ | COLUMN PROGRAM FORMAT A70 WORD_WRAPPED; | ||
+ | SELECT ses.sid || ',' | ||
+ | p.spid as OSPID, | ||
+ | SES.SQL_ID SQLID, | ||
+ | SES.USERNAME USERNAME, | ||
+ | SES.OSUSER OSUSER, | ||
+ | SES.MACHINE HOSTNAME, | ||
+ | SES.PROGRAM PROGRAM, | ||
+ | SES.CLIENT_INFO | ||
+ | FROM V$SESSION SES, V$PROCESS P | ||
+ | WHERE SES.paddr = p.addr | ||
+ | and ses.username is not null | ||
+ | ORDER BY SES.MACHINE | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | Más: | ||
+ | <code sql>col " | ||
+ | col username format a15 | ||
+ | col osuser format a15 | ||
+ | col program format a80 | ||
+ | select s.sid || ',' | ||
+ | from v$session s, v$process p | ||
+ | Where s.paddr = p.addr | ||
+ | order by to_number(p.spid) | ||
+ | / | ||
+ | </ | ||
+ | =====Listar sesiones ACTIVAS===== | ||
+ | Con status=ACTIVE y SIN sqltext | ||
+ | <code sql> | ||
+ | set linesize 280; | ||
+ | COLUMN SID_SERIAL FORMAT A20 ; | ||
+ | COLUMN OSPID FORMAT A7; | ||
+ | COLUMN SQLID FORMAT A15 WORD_WRAPPED ; | ||
+ | COLUMN USERNAME FORMAT A35 WORD_WRAPPED ; | ||
+ | COLUMN HOSTNAME FORMAT A40 WORD_WRAPPED ; | ||
+ | COLUMN PROGRAM FORMAT A20 WORD_WRAPPED ; | ||
+ | COLUMN EVENT FORMAT A60 WORD_WRAPPED ; | ||
+ | col OSUSER format a30 ; | ||
+ | COLUMN WAITCLASS HEADING ' | ||
+ | COLUMN WAITINGSECS HEADING ' | ||
+ | COLUMN QUERY HEADING ' | ||
+ | select ses.sid || ',' | ||
+ | p.spid OSPID, | ||
+ | SES.SQL_ID SQLID, | ||
+ | SES.USERNAME USERNAME, | ||
+ | SES.OSUSER OSUSER, | ||
+ | SES.MACHINE HOSTNAME, | ||
+ | lpad(SES.PROGRAM, | ||
+ | LPAD(WA.EVENT, | ||
+ | WA.WAIT_CLASS WAITCLASS, | ||
+ | WA.SECONDS_IN_WAIT WAITINGSECS | ||
+ | from V$SESSION SES, V$SQLAREA SQL, V$SESSION_WAIT WA, V$PROCESS P | ||
+ | where SES.STATUS=' | ||
+ | AND SES.SQL_ID=SQL.SQL_ID | ||
+ | AND SES.SID=WA.SID | ||
+ | and SES.paddr = p.addr | ||
+ | / | ||
+ | CLEAR COLUMNS ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | Con status=ACTIVE | ||
+ | <code sql> | ||
+ | set linesize 280; | ||
+ | COLUMN SID FORMAT 99999 ; | ||
+ | COLUMN SERIAL FORMAT 999999 ; | ||
+ | COLUMN OSPID FORMAT A5; | ||
+ | COLUMN SQLID FORMAT A15 WORD_WRAPPED ; | ||
+ | COLUMN USERNAME FORMAT A20 WORD_WRAPPED ; | ||
+ | COLUMN HOSTNAME FORMAT A40 WORD_WRAPPED ; | ||
+ | COLUMN PROGRAM FORMAT A20 WORD_WRAPPED ; | ||
+ | COLUMN EVENT FORMAT A60 WORD_WRAPPED ; | ||
+ | COLUMN P1TEXT FORMAT A20 WORD_WRAPPED; | ||
+ | COLUMN WAITCLASS HEADING ' | ||
+ | COLUMN WAITINGSECS HEADING ' | ||
+ | COLUMN QUERY HEADING ' | ||
+ | select SES.SID SID, | ||
+ | SES.SERIAL# SERIAL, | ||
+ | p.spid OSPID, | ||
+ | SES.SQL_ID SQLID, | ||
+ | SES.USERNAME USERNAME, | ||
+ | SES.MACHINE HOSTNAME, | ||
+ | lpad(SES.PROGRAM, | ||
+ | LPAD(WA.EVENT, | ||
+ | WA.P1TEXT P1TEXT, | ||
+ | WA.WAIT_CLASS WAITCLASS, | ||
+ | WA.SECONDS_IN_WAIT WAITINGSECS, | ||
+ | SQL.SQL_TEXT QUERY | ||
+ | from V$SESSION SES, V$SQLAREA SQL, V$SESSION_WAIT WA, V$PROCESS P | ||
+ | where SES.STATUS=' | ||
+ | AND SES.SQL_ID=SQL.SQL_ID | ||
+ | AND SES.SID=WA.SID | ||
+ | and SES.paddr = p.addr | ||
+ | / | ||
+ | CLEAR COLUMNS ; | ||
+ | </ | ||
+ | |||
+ | Mediante SQL_ID: | ||
+ | <code sql> | ||
+ | SET linesize 280; | ||
+ | COLUMN SID_SERIAL FORMAT A20 ; | ||
+ | COLUMN OSPID FORMAT A7; | ||
+ | COLUMN SQLID FORMAT A15 WORD_WRAPPED ; | ||
+ | COLUMN USERNAME FORMAT A20 WORD_WRAPPED ; | ||
+ | COLUMN HOSTNAME FORMAT A40 WORD_WRAPPED ; | ||
+ | COLUMN PROGRAM FORMAT A20 WORD_WRAPPED ; | ||
+ | COLUMN EVENT FORMAT A60 WORD_WRAPPED ; | ||
+ | COLUMN P1TEXT FORMAT A20 WORD_WRAPPED; | ||
+ | COLUMN WAITCLASS HEADING ' | ||
+ | COLUMN WAITINGSECS HEADING ' | ||
+ | COLUMN QUERY HEADING ' | ||
+ | SELECT ses.sid || ',' | ||
+ | p.spid OSPID, | ||
+ | SES.SQL_ID SQLID, | ||
+ | SES.USERNAME USERNAME, | ||
+ | SES.MACHINE HOSTNAME, | ||
+ | lpad(SES.PROGRAM, | ||
+ | LPAD(WA.EVENT, | ||
+ | WA.P1TEXT P1TEXT, | ||
+ | WA.WAIT_CLASS WAITCLASS, | ||
+ | WA.SECONDS_IN_WAIT WAITINGSECS, | ||
+ | SQL.SQL_TEXT QUERY | ||
+ | FROM V$SESSION SES, V$SQLAREA SQL, V$SESSION_WAIT WA, V$PROCESS P | ||
+ | WHERE SES.SQL_ID IS NOT NULL | ||
+ | AND SES.SQL_ID=SQL.SQL_ID | ||
+ | AND SES.SID=WA.SID | ||
+ | AND SES.paddr = p.addr | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== Tiempo desde la última actividad ===== | ||
+ | <code sql> | ||
+ | SELECT username, MACHINE, last_call_et seconds, STATUS | ||
+ | FROM v$session | ||
+ | WHERE username IS NOT NULL | ||
+ | ORDER BY last_call_et | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Listar sesiones de usuario===== | ||
+ | <code sql> | ||
+ | =====Matar sesion===== | ||
+ | <code sql> | ||
+ | </ | ||
+ | =====Matar todas las sesiones de un usuario===== | ||
+ | <code sql> | ||
+ | select 'ALTER SYSTEM KILL SESSION ''' | ||
+ | FROM V$SESSION | ||
+ | WHERE USERNAME IN (' | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Bloqueos / locks===== | ||
+ | ==== HARD LOCKS ==== | ||
+ | |||
+ | * **v$lock** based: | ||
+ | |||
+ | ^ Human readable ^ plain mode ^ | ||
+ | | <code sql> | ||
+ | select 'SID ' || l1.sid || ' is blocking ->' || l2.sid blocking | ||
+ | from v$lock l1, v$lock l2 | ||
+ | where l1.block =1 and l2.request > 0 | ||
+ | and l1.id1=l2.id1 | ||
+ | and l1.id2=l2.id2 | ||
+ | / | ||
+ | </ | ||
+ | FROM V$LOCK L1, V$LOCK L2 | ||
+ | WHERE | ||
+ | | ||
+ | AND L2.REQUEST > 0 | ||
+ | AND L1.ID1=L2.ID1 | ||
+ | AND L1.ID2=L2.ID2 ; | ||
+ | </ | ||
+ | |||
+ | * **v$session** based: | ||
+ | <code sql> | ||
+ | col wait_class format a40 | ||
+ | col event format a60 | ||
+ | |||
+ | SELECT | ||
+ | sid || ' | ||
+ | username, | ||
+ | osuser, | ||
+ | wait_class_id, | ||
+ | wait_class#, | ||
+ | wait_class, | ||
+ | event | ||
+ | FROM | ||
+ | v$session | ||
+ | WHERE | ||
+ | state = ' | ||
+ | AND | ||
+ | wait_class = ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Bloqueos de usuario (Soft locks) ==== | ||
+ | |||
+ | Formateo: | ||
+ | <code sql> | ||
+ | COL USERNAME FORMAT A23 | ||
+ | COL OSUser FORMAT A23 | ||
+ | COL Machine FORMAT A33 | ||
+ | COL mode_held FORMAT A23 | ||
+ | COL mode_requested FORMAT A23 | ||
+ | COL lock_type format A25 | ||
+ | COL lock_id1 format A10 | ||
+ | COL lock_id2 format a10 | ||
+ | COL object_name format a33 | ||
+ | col object_type format a20 | ||
+ | </ | ||
+ | |||
+ | * Tx enqueue ready2kill: | ||
+ | <code sql> | ||
+ | COLUMN SID_SERIAL FORMAT A15 ; | ||
+ | SELECT | ||
+ | lk.sid || ',' | ||
+ | se.username, | ||
+ | se.OSUser, | ||
+ | se.Machine, | ||
+ | DECODE(lk.TYPE, | ||
+ | DECODE(lk.lmode, | ||
+ | DECODE(lk.request, | ||
+ | TO_CHAR(lk.id1) lock_id1, | ||
+ | TO_CHAR(lk.id2) lock_id2, | ||
+ | DECODE(block, | ||
+ | se.lockwait | ||
+ | FROM | ||
+ | v$lock lk, | ||
+ | v$session se | ||
+ | WHERE | ||
+ | lk.type | ||
+ | AND lk.SID = se.SID | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | * Transaction enqueue (original): | ||
+ | <code sql> | ||
+ | SELECT | ||
+ | lk.SID, | ||
+ | se.username, | ||
+ | se.OSUser, | ||
+ | se.Machine, | ||
+ | DECODE(lk.TYPE, | ||
+ | DECODE(lk.lmode, | ||
+ | DECODE(lk.request, | ||
+ | TO_CHAR(lk.id1) lock_id1, | ||
+ | TO_CHAR(lk.id2) lock_id2, | ||
+ | DECODE(block, | ||
+ | se.lockwait | ||
+ | FROM | ||
+ | v$lock lk, | ||
+ | v$session se | ||
+ | WHERE | ||
+ | lk.type | ||
+ | AND lk.SID = se.SID | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | * DML enqueue & User supplied: | ||
+ | <code sql> | ||
+ | SELECT | ||
+ | lk.SID, | ||
+ | se.username, | ||
+ | se.OSUser, | ||
+ | se.Machine, | ||
+ | DECODE (lk.TYPE, ' | ||
+ | DECODE (lk.lmode, 0, ' | ||
+ | DECODE (lk.request, | ||
+ | TO_CHAR (lk.id1) lock_id1, | ||
+ | TO_CHAR (lk.id2) lock_id2, | ||
+ | ob.owner, | ||
+ | ob.object_type, | ||
+ | ob.object_name, | ||
+ | DECODE(lk.Block, | ||
+ | se.lockwait | ||
+ | FROM | ||
+ | v$lock lk, | ||
+ | dba_objects ob, | ||
+ | v$session se | ||
+ | WHERE | ||
+ | lk.TYPE IN (' | ||
+ | AND lk.SID = se.SID | ||
+ | AND lk.id1 = ob.object_id | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ==== Sid,SERIAL# de los bloqueantes primarios ==== | ||
+ | Sesiones que inician la cadena de bloqueos: | ||
+ | <code sql> | ||
+ | SELECT SID || ',' | ||
+ | FROM V$SESSION | ||
+ | WHERE SID IN ( | ||
+ | SELECT l1.sid | ||
+ | FROM v$lock l1, v$lock l2 | ||
+ | WHERE l1.block =1 AND l2.request > 0 | ||
+ | AND l1.id1=l2.id1 | ||
+ | AND l1.id2=l2.id2 | ||
+ | AND l1.id1 not IN ( | ||
+ | SELECT l2.sid | ||
+ | FROM v$lock l1, v$lock l2 | ||
+ | WHERE l1.block =1 AND l2.request > 0 | ||
+ | AND l1.id1=l2.id1 | ||
+ | AND l1.id2=l2.id2 | ||
+ | ) | ||
+ | ) | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== Bloqueadores ==== | ||
+ | Extrictamente bloqueadores (sesiones que bloquean otras): | ||
+ | <code sql> | ||
+ | </ | ||
+ | ==== lock de DDLS ==== | ||
+ | Mirar objects que se están accediendo: | ||
+ | <code sql> | ||
+ | col object format a50 ; | ||
+ | col type format a20 ; | ||
+ | col owner format a20 ; | ||
+ | select * from V$ACCESS where type LIKE ' | ||
+ | </ | ||
+ | |||
+ | Y el propio bloqueo en sí: | ||
+ | <code sql> | ||
+ | COL SESSION_ID FORMAT 999999; | ||
+ | COL OWNER FORMAT A20; | ||
+ | COL NAME FORMAT A30; | ||
+ | COL TYPE FORMAT A20; | ||
+ | SELECT * FROM DBA_DDL_LOCKS ; | ||
+ | </ | ||
+ | |||
+ | ==== lock de DML ==== | ||
+ | Casi lo mismo que el anterior: | ||
+ | <code sql> | ||
+ | COL SESSION_ID FORMAT 999999; | ||
+ | COL OWNER FORMAT A20; | ||
+ | COL NAME FORMAT A30; | ||
+ | COL TYPE FORMAT A20; | ||
+ | SELECT * FROM DBA_DML_LOCKS ; | ||
+ | </ | ||
+ | |||
+ | ==== Links bloqueos==== | ||
+ | * http:// | ||
+ | |||
+ | =====Consumo por sesiones===== | ||
+ | <code sql> | ||
+ | |||
+ | SELECT TO_CHAR(m.END_TIME, | ||
+ | ROUND(m.cpu) cpu100, m.physical_reads prds, m.logical_reads lrds, m.pga_memory pga, m.hard_parses hp, m.soft_parses sp, m.physical_read_pct prp, | ||
+ | m.logical_read_pct lrp | ||
+ | FROM v$sessmetric m, v$session s | ||
+ | WHERE (m.physical_reads > 100 OR m.cpu > 100 OR m.logical_reads > 100) AND m.session_id = s.sid AND m.session_serial_num = s.serial# | ||
+ | ORDER BY m.physical_reads DESC, m.cpu DESC, m.logical_reads DESC; | ||
+ | </ | ||
+ | |||
+ | A partir del *SID*, podemos saber qué _query_ están lanzando mediante: | ||
+ | <code sql> | ||
+ | SELECT c.sid, d.piece, c.serial#, c.username, d.sql_text | ||
+ | FROM v$session c, v$sqltext d | ||
+ | WHERE c.sql_hash_value = d.hash_value | ||
+ | and c.sid = &SID | ||
+ | ORDER BY c.sid, d.piece; | ||
+ | </ | ||
+ | |||
+ | ===== QUERYS activas ===== | ||
+ | <code sql> | ||
+ | set feedback off | ||
+ | set serveroutput on size 9999 | ||
+ | column username format a20 | ||
+ | column sql_text format a55 word_wrapped | ||
+ | begin | ||
+ | for x in | ||
+ | | ||
+ | to_char(LOGON_TIME,' | ||
+ | to_char(sysdate,' | ||
+ | sql_address, | ||
+ | sql_hash_value | ||
+ | from v$session | ||
+ | where status = ' | ||
+ | and rawtohex(sql_address) <> ' | ||
+ | and username is not null ) loop | ||
+ | for y in (select sql_text | ||
+ | from v$sqlarea | ||
+ | where address = x.sql_address ) loop | ||
+ | if ( y.sql_text not like ' | ||
+ | y.sql_text not like ' | ||
+ | dbms_output.put_line( ' | ||
+ | dbms_output.put_line( x.username ); | ||
+ | dbms_output.put_line( x.logon_time || ' ' || x.current_time || ' SQL#=' || x.sql_hash_value); | ||
+ | dbms_output.put_line( substr( y.sql_text, 1, 250 ) ); | ||
+ | end if; | ||
+ | end loop; | ||
+ | end loop; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | ====== [SECTION] | ||
+ | |||
+ | ====longest querys==== | ||
+ | Las querys con duración de más de 10 segundos: | ||
+ | <code sql> | ||
+ | COL SQL_TEXT FORMAT A130 WORD WRAPPED | ||
+ | SELECT * FROM | ||
+ | ( | ||
+ | SELECT | ||
+ | CPU_TIME/ | ||
+ | CPU_TIME, | ||
+ | EXECUTIONS, | ||
+ | SQL_TEXT | ||
+ | FROM V$SQLAREA | ||
+ | WHERE EXECUTIONS> | ||
+ | ORDER BY EXECUTIONS DESC, TIME_PER_EXECUTION DESC, CPU_TIME DESC | ||
+ | ) | ||
+ | WHERE ROWNUM <31; | ||
+ | </ | ||
+ | |||
+ | |||
+ | Ver también: | ||
+ | * V$SQL | ||
+ | * V$SESSION | ||
+ | |||
+ | |||
+ | ====Long operations==== | ||
+ | La vista LONGOPS nos da información de las operaciones largas/ | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | |||
+ | COL UNITS FORMAT A12 | ||
+ | COL opname FORMAT A30 | ||
+ | COL target FORMAT A30 | ||
+ | COL message FORMAT A70 | ||
+ | COL SID_SERIAL FORMAT A15 | ||
+ | |||
+ | select * from | ||
+ | ( | ||
+ | select | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | from | ||
+ | v$session_longops | ||
+ | order by start_time desc | ||
+ | ) | ||
+ | where rownum <=1; | ||
+ | </ | ||
+ | |||
+ | ====Bind variables de querys==== | ||
+ | |||
+ | <code sql> | ||
+ | COL SQL_ID FORMAT A15 | ||
+ | COL NAME FORMAT A30 | ||
+ | COL POSITION FORMAT 999 | ||
+ | COL DATATYPE_STRING FORMAT A20 | ||
+ | COL VALUE_STRING FORMAT A100 | ||
+ | SELECT SQL_ID, | ||
+ | LAST_CAPTURED, | ||
+ | HASH_VALUE, | ||
+ | NAME, | ||
+ | POSITION, | ||
+ | DUP_POSITION, | ||
+ | DATATYPE_STRING, | ||
+ | VALUE_STRING | ||
+ | FROM V$SQL_BIND_CAPTURE | ||
+ | WHERE sql_id=' | ||
+ | ORDER BY 1,2,4 | ||
+ | ; | ||
+ | </ | ||
+ | ====== [SECTION] | ||
+ | ===== Hidden options/ | ||
+ | |||
+ | The display_cursor funcion has the following undocumented format options: | ||
+ | * ALL | ||
+ | * ADVANCED | ||
+ | * OUTLINE | ||
+ | * PROJECTION | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | SELECT * FROM table (DBMS_XPLAN.DISPLAY_CURSOR(' | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | |||
+ | ===== Ver un plan de ejecución ===== | ||
+ | ==== De una query ==== | ||
+ | Capturar la query: | ||
+ | <code sql> | ||
+ | EXPLAIN PLAN FOR | ||
+ | SELECT * FROM emp e, dept d | ||
+ | WHERE e.deptno = d.deptno | ||
+ | AND e.ename=' | ||
+ | </ | ||
+ | y | ||
+ | <code sql> | ||
+ | SET LINESIZE 280 | ||
+ | SET PAGESIZE 999 | ||
+ | SELECT * FROM table(DBMS_XPLAN.DISPLAY); | ||
+ | </ | ||
+ | |||
+ | ==== De un SQL_ID ==== | ||
+ | <code sql> | ||
+ | SELECT * FROM table ( | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Eliminar un Plan de ejecución ==== | ||
+ | Primero, hay que saber el SQL_ID y el PLAN_HASH_VALUE, | ||
+ | <code sql> | ||
+ | select sql_id, sql_text, hash_value, plan_hash_value | ||
+ | from v$sql | ||
+ | where sql_text like ' | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Después, ejecutar el siguiente proceseo: | ||
+ | <code sql> | ||
+ | vari rc number | ||
+ | exec : | ||
+ | </ | ||
+ | Substituir: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | |||
+ | Habitualmente con eso vale, auqnue a lo mejor hay que hacer " | ||
+ | |||
+ | Obtener los valores necesarios para borrarlo (los hashes): | ||
+ | <code sql> | ||
+ | COL SQL_HANDLE FORMAT A50 | ||
+ | COL PLAN_NAME FORMAT A50 | ||
+ | select sql_handle, plan_name, enabled, accepted, | ||
+ | </ | ||
+ | |||
+ | Ejecutar el siguiente procedimiento para borarrlo: | ||
+ | <code sql> | ||
+ | SET SERVEROUTPUT ON | ||
+ | DECLARE | ||
+ | l_plans_dropped | ||
+ | BEGIN | ||
+ | l_plans_dropped := DBMS_SPM.drop_sql_plan_baseline ( | ||
+ | sql_handle => '< | ||
+ | plan_name | ||
+ | | ||
+ | DBMS_OUTPUT.put_line(l_plans_dropped); | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Links ==== | ||
+ | |||
+ | * http:// | ||
+ | * http:// | ||
+ | * http:// | ||
+ | ====== [SECTION] | ||
+ | ===== Hard parse ===== | ||
+ | * How to Identify Hard Parse Failures (Doc ID 1353015.1) | ||
+ | * [[dba: | ||
+ | ===== Top 100 querys ===== | ||
+ | Esta query se basa en las estadísticas guardadas en el repositorio awr. | ||
+ | |||
+ | <code sql> | ||
+ | COL CPU_RANK FORMAT 999 ; | ||
+ | COL TOTAL_CPU_TIME FORMAT 999999999 ; | ||
+ | COL SQLID FORMAT A23 ; | ||
+ | select CPU_RANK, SQLID, TOTAL_CPU_TIME, | ||
+ | from ( | ||
+ | select | ||
+ | RANK() OVER (ORDER BY (max(s.CPU_TIME_TOTAL)) DESC) cpu_rank, | ||
+ | ROUND(MAX(S. CPU_TIME_TOTAL)/ | ||
+ | MODULE | ||
+ | from | ||
+ | dba_hist_sqlstat s, | ||
+ | dba_hist_snapshot sn | ||
+ | where | ||
+ | | ||
+ | group by | ||
+ | | ||
+ | ) | ||
+ | where cpu_rank <=100 | ||
+ | ; | ||
+ | </ | ||
+ | ===== SGA stats ===== | ||
+ | Full: | ||
+ | <code sql> | ||
+ | select POOL, NAME, BYTES/ | ||
+ | </ | ||
+ | Únicamente lo libre: | ||
+ | <code sql> | ||
+ | select POOL, NAME, BYTES/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Shared pool histogram ===== | ||
+ | <code sql> | ||
+ | COL BEGIN_INTERVAL_TIME FORMAT A50 | ||
+ | COL END_INTERVAL_TIME FORMAT A50 | ||
+ | COL NAME FORMAT A50 | ||
+ | SELECT sn.BEGIN_INTERVAL_TIME, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM dba_hist_snapshot sn, DBA_HIST_SGASTAT sg | ||
+ | | ||
+ | AND POOL = ' | ||
+ | AND NAME LIKE '%free memory%' | ||
+ | ORDER BY BEGIN_INTERVAL_TIME | ||
+ | ; | ||
+ | </ | ||
+ | ===== Library cache Hit ratio ===== | ||
+ | <code sql> | ||
+ | SELECT ' | ||
+ | ROUND ( | ||
+ | (congets.VALUE + dbgets.VALUE - physreads.VALUE) | ||
+ | * 100 | ||
+ | / (congets.VALUE + dbgets.VALUE), | ||
+ | 2) | ||
+ | VALUE | ||
+ | FROM v$sysstat congets, v$sysstat dbgets, v$sysstat physreads | ||
+ | | ||
+ | AND dbgets.NAME = 'db block gets' | ||
+ | AND physreads.NAME = ' | ||
+ | UNION ALL | ||
+ | SELECT ' | ||
+ | | ||
+ | SIGN ( | ||
+ | ROUND ( | ||
+ | (ec.VALUE - pc.VALUE) | ||
+ | * 100 | ||
+ | / DECODE (ec.VALUE, 0, 1, ec.VALUE), | ||
+ | 2)), | ||
+ | -1, 0, | ||
+ | ROUND ( | ||
+ | | ||
+ | 2)) | ||
+ | FROM v$sysstat ec, v$sysstat pc | ||
+ | | ||
+ | AND pc.NAME IN (' | ||
+ | UNION ALL | ||
+ | SELECT ' | ||
+ | ROUND ( | ||
+ | ms.VALUE | ||
+ | / DECODE ( (ds.VALUE + ms.VALUE), 0, 1, (ds.VALUE + ms.VALUE)) | ||
+ | * 100, | ||
+ | 2) | ||
+ | FROM v$sysstat ds, v$sysstat ms | ||
+ | WHERE ms.NAME = 'sorts (memory)' | ||
+ | UNION ALL | ||
+ | SELECT 'SQL Area get hitrate', | ||
+ | FROM v$librarycache | ||
+ | WHERE namespace = 'SQL AREA' | ||
+ | UNION ALL | ||
+ | SELECT 'Avg Latch Hit (No Miss)', | ||
+ | ROUND ( (SUM (gets) - SUM (misses)) * 100 / SUM (gets), 2) | ||
+ | FROM v$latch | ||
+ | UNION ALL | ||
+ | SELECT 'Avg Latch Hit (No Sleep)', | ||
+ | ROUND ( (SUM (gets) - SUM (sleeps)) * 100 / SUM (gets), 2) | ||
+ | FROM v$latch; | ||
+ | </ | ||
+ | |||
+ | ===== Espacio usado dentro de la SGA ===== | ||
+ | <code sql> | ||
+ | set pagesize 132 | ||
+ | |||
+ | column owner format a16 | ||
+ | column name format a36 | ||
+ | column sharable_mem format 999,999,999 | ||
+ | column executions | ||
+ | </ | ||
+ | |||
+ | ==== Memory Usage of Shared Pool Order - Biggest First ==== | ||
+ | |||
+ | <code sql> | ||
+ | column name format 45 | ||
+ | select | ||
+ | where sharable_mem > 10000 | ||
+ | and type in (' | ||
+ | order by sharable_mem desc | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== Loads into Shared Pool - Most Loads First ==== | ||
+ | <code sql> | ||
+ | select | ||
+ | where loads > 3 | ||
+ | and type in (' | ||
+ | order by loads desc | ||
+ | / | ||
+ | </ | ||
+ | ==== Executions of Objects in the Shared Pool - Most Executions First ==== | ||
+ | <code sql> | ||
+ | select | ||
+ | where executions | ||
+ | and type in (' | ||
+ | order by executions | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== AWR ===== | ||
+ | |||
+ | * [[.docs: | ||
+ | |||
+ | |||
+ | ===== Paralelismo de objects ===== | ||
+ | |||
+ | |||
+ | **DEGREE** in dba_* views is VARCHAR! | ||
+ | ==== indexes ==== | ||
+ | |||
+ | Object parallelism ignoring degree 0 or 1 | ||
+ | <code sql> | ||
+ | SELECT | ||
+ | owner, | ||
+ | INDEX_NAME, | ||
+ | degree | ||
+ | FROM | ||
+ | DBA_INDEXES | ||
+ | WHERE | ||
+ | NOT RTRIM(LTRIM(DEGREE)) IN ( ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== TABLES ==== | ||
+ | |||
+ | Object parallelism ignoring degree 0 or 1 | ||
+ | <code sql> | ||
+ | SELECT OWNER, | ||
+ | TABLE_NAME, | ||
+ | DEGREE | ||
+ | FROM | ||
+ | DBA_TABLES | ||
+ | WHERE | ||
+ | NOT RTRIM(LTRIM(DEGREE)) IN ( ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ====== [SECTION] | ||
+ | |||
+ | ===== Añadir un redo group ===== | ||
+ | <code sql> | ||
+ | ALTER DATABASE ADD LOGFILE GROUP 5 (' | ||
+ | </ | ||
+ | Hay que tener en cuenta los thread groups (rac), si tenemos varios thread groups, habrá que añadirlo al thread correspondiente: | ||
+ | <code sql> | ||
+ | ALTER DATABASE ADD LOGFILE thread 1 GROUP 5 (' | ||
+ | </ | ||
+ | |||
+ | ===== Errores de usuario ===== | ||
+ | Hay veces que show err no muestra todos los errores: | ||
+ | <code sql> | ||
+ | select * from user_errors where name like ' | ||
+ | </ | ||
+ | Desde SYS pueden no aparecer los errores, hay que conectarse con el usuario. | ||
+ | ===== Crear un directorio ===== | ||
+ | <code sql> | ||
+ | CREATE DIRECTORY < | ||
+ | </ | ||
+ | |||
+ | ===== Estadísticas de generacion de REDO ===== | ||
+ | |||
+ | <code SQL> | ||
+ | FROM | ||
+ | ( | ||
+ | SELECT To_Char(First_Time,' | ||
+ | FROM v$log_history | ||
+ | GROUP BY To_Char(First_Time,' | ||
+ | ORDER BY 1 DESC | ||
+ | ) A, | ||
+ | ( | ||
+ | SELECT Avg(BYTES) AVG# | ||
+ | FROM v$log | ||
+ | ) B | ||
+ | ORDER BY DAY | ||
+ | ; | ||
+ | </ | ||
+ | ===== Log Buffer Hit Rate Histogram ===== | ||
+ | In order to track the amount of redo read from the in-memory log buffer vs. the amount of redo read from disk, a log buffer hit rate histogram has also been implemented. A new '' | ||
+ | |||
+ | <code SQL> | ||
+ | COL BUFSIZE FORMAT A30 | ||
+ | COL BUFINFO FORMAT A30 | ||
+ | select BUFSIZE, RDMEMBLKS, RDDISKBLKS, HITRATE, BUFINFO from X$LOGBUF_READHIST; | ||
+ | </ | ||
+ | It returns the following columns: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | In the histogram, the data in the row pointed to by '' | ||
+ | |||
+ | (Doc ID 951152.1) | ||
+ | ===== Switch de Archived por hora ===== | ||
+ | <code SQL> | ||
+ | SELECT to_date(first_time) DAY, | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | to_char(sum(decode(to_char(first_time,' | ||
+ | from v$log_history | ||
+ | where to_date(first_time) > sysdate -8 | ||
+ | GROUP by to_char(first_time,' | ||
+ | order by to_date(first_time) | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ===== Flush de redos ===== | ||
+ | <code sql> | ||
+ | alter system checkpoint ; | ||
+ | </ | ||
+ | |||
+ | ===== Stopping hardway ===== | ||
+ | Stop/ | ||
+ | <code sql> | ||
+ | sqlplus -prelim "/ as sysdba" | ||
+ | shutdown abort | ||
+ | </ | ||
+ | |||
+ | =====Localizar una query desde un sql_id del alert===== | ||
+ | Para localizar la query, tenemos que tener el SQL_ID que aparece en el alert y esperar que la query no se haya ido de memoria. | ||
+ | <code sql> | ||
+ | |||
+ | ===== Dropping the database ===== | ||
+ | <code sql> | ||
+ | startup mount exclusive restrict; | ||
+ | drop database; | ||
+ | exit ; | ||
+ | </ | ||
+ | |||
+ | ===== Listar Parámetros ocultos e indocumentados ===== | ||
+ | Información completa: | ||
+ | <code sql> | ||
+ | COL NAME FORMAT A60 | ||
+ | COL VALUE FORMAT A30 | ||
+ | COL DEFLT FORMAT A30 | ||
+ | COL TYPE FORMAT A10 | ||
+ | COL description FORMAT A120 | ||
+ | select | ||
+ | b.ksppstvl value, | ||
+ | b.ksppstdf deflt, | ||
+ | decode(a.ksppity, | ||
+ | a.ksppdesc description | ||
+ | from sys.x$ksppi a, sys.x$ksppcv b | ||
+ | where a.indx = b.indx | ||
+ | and a.ksppinm like ' | ||
+ | order by name ; | ||
+ | </ | ||
+ | únicamente nombre y descripción: | ||
+ | <code sql> | ||
+ | COL KSPPINM FORMAT A60 | ||
+ | COL ksppdesc FORMAT A120 | ||
+ | select ksppinm, ksppdesc | ||
+ | from x$ksppi | ||
+ | where substr(ksppinm, | ||
+ | order by 1,2; | ||
+ | </ | ||
+ | ===== db_link / dblink ===== | ||
+ | DATABASE LINKS! | ||
+ | ==== crear ==== | ||
+ | <code sql> | ||
+ | sqlplus SYSTEM | ||
+ | </ | ||
+ | <code sql> | ||
+ | CREATE DATABASE LINK VOXEL CONNECT TO SYSTEM identified by ******* using ' | ||
+ | </ | ||
+ | |||
+ | ==== listar ==== | ||
+ | |||
+ | <code sql> | ||
+ | SET PAUSE 'Press Return to Continue' | ||
+ | SET PAGESIZE 60 | ||
+ | SET LINESIZE 300 | ||
+ | |||
+ | COLUMN owner FORMAT A30 | ||
+ | COLUMN db_link FORMAT A50 | ||
+ | COLUMN username FORMAT A30 | ||
+ | COLUMN host FORMAT A30 | ||
+ | |||
+ | SELECT owner, | ||
+ | | ||
+ | | ||
+ | host | ||
+ | FROM | ||
+ | ORDER BY owner, db_link | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== Borrar ==== | ||
+ | <code sql> | ||
+ | DROP DATABASE LINK < | ||
+ | </ | ||
+ | o | ||
+ | <code sql> | ||
+ | DROP PUBLIC DATABASE LINK < | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== PL/SQL ===== | ||
+ | |||
+ | ==== Executing queries with bind variables ==== | ||
+ | |||
+ | <code sql> | ||
+ | declare | ||
+ | c1 NUMBER; | ||
+ | c2 NUMBER; | ||
+ | c3 NUMBER; | ||
+ | -- ressult testing_binds%ROWTYPE; | ||
+ | -- inttype NUMBER := 4001; | ||
+ | | ||
+ | BEGIN | ||
+ | theSQL := ' | ||
+ | SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) no_parallel OPT_ESTIMATE(@" | ||
+ | c1, | ||
+ | c2, | ||
+ | c3 | ||
+ | FROM | ||
+ | ( | ||
+ | SELECT /*+ qb_name(" | ||
+ | COUNT(*) AS c1, | ||
+ | 4294967295 AS c2, | ||
+ | SUM( | ||
+ | CASE | ||
+ | WHEN(" | ||
+ | ELSE 0 | ||
+ | END | ||
+ | ) AS c3 | ||
+ | FROM | ||
+ | ciberterminal." | ||
+ | WHERE | ||
+ | ( " | ||
+ | ) innerquery' | ||
+ | execute immediate theSQL into c1, c2, c3 using 4001, 4001; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== very simple loop ==== | ||
+ | <code sql> | ||
+ | DECLARE | ||
+ | RESSULT VARCHAR(100); | ||
+ | BEGIN | ||
+ | FOR tname IN ( | ||
+ | SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OWNER=' | ||
+ | ) | ||
+ | LOOP | ||
+ | SELECT REGEXP_SUBSTR(DDL, | ||
+ | DBMS_OUTPUT.PUT_LINE(TO_CHAR(RESSULT)); | ||
+ | END LOOP; | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== logging output in pl ==== | ||
+ | Sometimes you want to have feedback of the PL/SQL output. | ||
+ | DMBS_OUTPUT does not shows the ressult until the script finish, the wait time will make you run crazy. | ||
+ | The " | ||
+ | |||
+ | A sample code for this will be: | ||
+ | <code sql> | ||
+ | DECLARE | ||
+ | Rows_count PLS_INTEGER := 0; | ||
+ | LOGFILE UTL_FILE.FILE_TYPE; | ||
+ | BEGIN | ||
+ | LOGFILE := UTL_FILE.FOPEN(' | ||
+ | WHILE true LOOP | ||
+ | Rows_count := Rows_count + 1; | ||
+ | IF MOD(Rows_count, | ||
+ | dbms_output.put_line(' | ||
+ | UTL_FILE.PUT_LINE(LOGFILE,' | ||
+ | UTL_FILE.FFLUSH (LOGFILE); | ||
+ | END IF; | ||
+ | END LOOP; | ||
+ | COMMIT; | ||
+ | UTL_FILE.FCLOSE(LOGFILE); | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Where LOGDIR is a directory defined inside oracle. | ||
+ | You will have the DBMS_OUTPUT feedback when the script finish and log feedback instantly. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Multi-line comments ===== | ||
+ | Para insertar un comentario multi-linea: | ||
+ | * Habilitar las blanklines: | ||
+ | <code sql> | ||
+ | SET SQLBLANKLINES ON | ||
+ | </ | ||
+ | * Insertar el comentario: | ||
+ | <code sql> | ||
+ | COMMENT ON TABLE TESTTABLE IS 'TEST | ||
+ | |||
+ | MULTILINE | ||
+ | |||
+ | COMMENT! | ||
+ | ' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | ===== REGEXP_LIKE ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ===== DBMS_SCHEDULER ===== | ||
+ | |||
+ | ==== Listar jobs ==== | ||
+ | |||
+ | <code sql> | ||
+ | COL owner FORMAT A20 | ||
+ | COL job_name FORMAT A40 | ||
+ | COL job_subname FORMAT A30 | ||
+ | COL job_style FORMAT A30 | ||
+ | COL job_creator FORMAT A30 | ||
+ | COL client_id FORMAT A30 | ||
+ | COL program_owner FORMAT A20 | ||
+ | COL program_name FORMAT A35 | ||
+ | COL job_type FORMAT A30 | ||
+ | COL job_action FORMAT A30 | ||
+ | COL schedule_owner FORMAT A20 | ||
+ | COL schedule_name FORMAT A30 | ||
+ | COL REPEAT_INTERVAL FORMAT A70 | ||
+ | COL START_DATE FORMAT A50 | ||
+ | |||
+ | SELECT owner, | ||
+ | | ||
+ | -- job_subname, | ||
+ | -- job_style, | ||
+ | -- job_creator, | ||
+ | -- client_id, | ||
+ | -- program_owner, | ||
+ | -- program_name, | ||
+ | | ||
+ | -- job_action, | ||
+ | -- schedule_owner, | ||
+ | -- schedule_name, | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM dba_SCHEDULER_JOBS | ||
+ | WHERE ENABLED=' | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Historial de ejecutiones ==== | ||
+ | <code sql> | ||
+ | COL owner FORMAT A20 | ||
+ | COL job_name FORMAT A40 | ||
+ | COL job_subname FORMAT A30 | ||
+ | COL job_style FORMAT A30 | ||
+ | COL job_creator FORMAT A30 | ||
+ | COL client_id FORMAT A30 | ||
+ | COL program_owner FORMAT A20 | ||
+ | COL program_name FORMAT A35 | ||
+ | COL job_type FORMAT A30 | ||
+ | COL job_action FORMAT A30 | ||
+ | COL schedule_owner FORMAT A20 | ||
+ | COL schedule_name FORMAT A30 | ||
+ | COL REPEAT_INTERVAL FORMAT A70 | ||
+ | COL START_DATE FORMAT A50 | ||
+ | |||
+ | SELECT owner, | ||
+ | | ||
+ | -- job_subname, | ||
+ | -- job_style, | ||
+ | -- job_creator, | ||
+ | -- client_id, | ||
+ | -- program_owner, | ||
+ | -- program_name, | ||
+ | | ||
+ | -- job_action, | ||
+ | -- schedule_owner, | ||
+ | -- schedule_name, | ||
+ | | ||
+ | | ||
+ | | ||
+ | FROM dba_SCHEDULER_JOBS | ||
+ | WHERE ENABLED=TRUE | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== [SECTION] | ||
+ | |||
+ | =====Auditoria===== | ||
+ | * [[.howtos: | ||
+ | |||
+ | =====DataGuard===== | ||
+ | |||
+ | * [[.docs: | ||
+ | |||
+ | =====RMAN===== | ||
+ | * [[.docs: | ||
+ | |||
+ | =====RAC Status===== | ||
+ | * [[.docs: | ||
+ | |||
+ | |||
+ | =====Links===== | ||
+ | See [[: | ||
+ | |||
+ | |||
+ | |||
+ | ===== Lista de DocId interesantes ===== | ||
+ | * How To Find The Size Of A Number Of Rows Of A Table (Doc ID 1370050.1) | ||
+ | |||
dba/oracle/basic_oracle_sql_querys.1675153028.txt.gz · Last modified: 2023/01/31 08:17 by dodger