Generar un fichero separado por comas

Que ocurre cuando queremos obtener la salida de una consulta en un formato facil de transportar a alguna otra aplicacion (normalmente la dichosa excel)?

La solucion mas sencilla es hacer un fichero separado por comas.

set heading off
set termout off
spool fichero_por_comas.txt
select machine
||chr(44)||
count(*) numero
from v$session where type != 'BACKGROUND'
and status='ACTIVE'
group by machine order by numero desc;
exit;

El truco aqui se encuantra en el ||chr(44)||, con esa concatenacion estamos diciendole al SQLplus que concatene con el caracter 44, conde el caracter 44 es una coma.
Al igual que hemos utilizado una coma podíamos haber usado cualquier otro caracter que nos interese.

Nota: la tabla de caracteres se puede encontrar en :http://www.asciitable.com/

Salida básica en el sqlplus

A la hora del uso del sqlplus el formateo de  la salida es muy importante, tanto en el uso diario como para poder hacer pequeños scripts.

Algunos comandos básicos son:

Tamaño de la página
set pagesize 50000
Tamaño de la línea
set linesize 200
Para ver el comando que ejecutas
set echo off
suppresses the display of output from a command file
set termout off
Quitar las cabeceras
set heading off
Quitar la linea «x rows selected»
set feedback off;
Formateo de longitud de una columna
column XX format a20 (20 catarcetres)
column XX format 999.999 (decimales)
column XX format €999.999 (ponemos moneda)
Dejar un log con el nombre del SID siempre y cuando sea una variable global definida
spool /path/salida_${ORACLE_SID}.log

Algunos enlaces útiles:
http://www.adp-gmbh.ch/ora/sqlplus/
http://docs.oracle.com/cd/B19306_01/server.102/b14357/toc.htm

Sqlplus para dummies II (sesiones en la BBDD)

Encontrar quien hay en la base de datos y que está haciendo cada uno es uno de los primeros pasos a la hora de determinar un problema en la base de datos, las consultas básicas para encontrar el quien es quien son:

 

Numero de sesiones de usuario por maquina
select machine,count(*) numero from
v$session where
type != ‘BACKGROUND’
group by machine
order by numero desc;

Numero de sesiones de usuario Activas por maquina
select machine,count(*) numero
from v$session where type != ‘BACKGROUND’
and status=’ACTIVE’
group by machine order by numero desc;

Numero de sesiones por maquina
select machine,count(*) numero from
v$session group by machine
order by numero desc;

Numero de sesiones Activas por maquina
select machine,count(*) numero from v$session
where status=’ACTIVE’ group by machine order by numero desc;

Texto sql de las v$session
select s.sid,s.serial#,s.username,s.machine,s.program,s.osuser,s.status,x.sql_fulltext
from v$session s ,v$sqlarea x
where s.sql_address=x.address;

 Consulta para enlazar un proceso del sistema con una sesión
select s.sid, s.serial# , q.sql_text, s.username, s.machine, s.logon_time, s.program, s.status
from v$session s, v$process p, v$sql q
where p.spid=4038 and p.addr=s.paddr
and q.address=s.sql_address
and s.sql_hash_value=q.hash_value;

Sqlplus para dummies I ( Consultas sobre tablespaces )

Sin duda alguna el pegarse con los tablespaces es la tarea más básica y la mas habitual de un DBA.

Para los que siguen teniendo los tablespaces en modo «manual» aqui hay varias consultas útiles
Tamaño y porcentaje de ocupación

select
 t.tablespace_name,
 round(t.kbtotal/1024,2) "Total MB",
 round(l.kblibre/1024,2) "MB Libres",
 100-(round(l.kblibre/t.kbtotal,2)*100)||'%' Ocupado
  from
  (select tablespace_name, sum(bytes)/1024 kbtotal
  from dba_data_files group by tablespace_name) t ,
  (select tablespace_name, sum(bytes)/1024 kblibre
  from dba_free_space group by tablespace_name) l
  where  t.tablespace_name=l.tablespace_name
 order by "OCUPADO" desc;

Uso de tablespaces temporal

select
 t2."TempTotal" "TempTotal (Mb)",
 t1."TempUsed" "TempUsed (Mb)",
 t2."TempTotal" - t1."TempUsed" "TempFree (Mb)"
 from (select nvl(
         round(sum(tu.blocks * tf.block_size)
                  / 1024 / 1024, 2), 0) "TempUsed"
      from v$tempseg_usage tu, dba_tablespaces tf
          where tu.TABLESPACE = tf.tablespace_name) t1,
          (select round(sum(bytes)
                     / 1024 / 1024, 2) "TempTotal"
           from dba_temp_files) t2
 

Tablespaces a mas del 80%  o con menos de 2 Gb libres no extensibles ni UNDOS

select  *  
  from
 (select 100-(round(l.kblibre/t.kbtotal,2)*100) Ocupado ,
         to_char(round(l.kblibre/1024,0)) Mb ,
           l.tablespace_name
      from 
   (select tablespace_name, sum(bytes)/1024 kbtotal 
             from dba_data_files
               group by tablespace_name) t ,
   (select tablespace_name, sum(bytes)/1024 kblibre
          from dba_free_space 
          group by tablespace_name) l where 
          (t.tablespace_name=l.tablespace_name
           and l.tablespace_name not in 
               (select distinct(tablespace_NAME)
                   from dba_data_files
                     where autoextensible='YES')
   and l.tablespace_name not like 'UNDOT%'
   and to_char(round(l.kblibre/1024,0))< 2000 )
  )
     where  ocupado > 80
    order by ocupado desc

Datafiles de los que consta cada Tablespace  (he incluido los gestionados localmente)

select 
tablespace_name,
file_name,
round(bytes/1024/1024,2) "Total MB",
 status
  from dba_data_files
union
      select 
           p.name tablespace,
           t.name fichero,
           t.bytes/1024/1024 Mb,
           t.status
          from v$tempfile t, v$tablespace p 
                where t.ts#=p.ts#
order by tablespace_name;

Datafiles autoextensibles

select
   file_name,
   tablespace_name,
   bytes/1024/1024  Mb,
   FILE_ID  
from dba_data_files 
where AUTOEXTENSIBLE='YES'

Datafiles temporales autoextensibles

select 
   file_name,
   tablespace_name,
   bytes/1024/1024  Mb  
from dba_temp_files 
  where AUTOEXTENSIBLE='YES'

Reconfigurar el Enterprise manager

Tener que reconfigurar en Enterprise Manager o reconstruir el EM Repository es algo bastante común.

Los comandos para llevarlos a cabo son bastante básicos

emctl stop dbconsole
emca -deconfig dbcontrol db
emca -repos recreate
emca -config dbcontrol db

Sin embargo, hay varios parámetros utiles, como por ejemplo:

-ORACLE_HOSTNAME

-PORT

Nota:Hay que tener cuidado con las regeneraciones en producción ya que en el momento del borrado la base de datos queda en «quiesce mode» con lo que pueden darse casos en los que haya pérdida de servicio  nota  [ID 375946.1]

La forma de ver si esta en quiesce mode es :

SQL> select active_state from v$instance;
ACTIVE_ST
———
QUIESCING

Para mas info genérica  está como siempre el metalink nota   [ID 1099271.1]