Recordatorios de ORACLE

Para empezar vamos a situarnos un poco. Esto es una referencia rápida a los aspectos más genéricos del entorno de Oracle.

Si buscas una guia de SQL y SQL*Plus pasate por este otro apartado

LO BÁSICO

  • Conectar a la base de datos desde la linea de comandos:

sqlplus usuario/contraseña@base

  • En el caso que ya estés dentro y quieras cambiar de usuario:

connect usuario/contraseña

  • Desconectar

exit

MOSTRAR LAS TABLAS

  • sql>select * from tabs;
  • sql>select * from tab;
  • sql>select * from user_objects where object_type = 'TABLE';

CONTENIDO DE LAS TABLAS

  • sql>desc NOMBRE_DE_TABLA;

TODO EL CONTENIDO DE LA BASE DE DATOS

  • sql>select * from user_catalog;
  • sql>select * from cat;

EJECUTAR ARCHIVO:

  • sql>@nombre_de_archivo

ELIMINAR/ALTERAR CABECERAS

estableces el tamaño de las páginas a un tamaño mas grande para que no te ponga la cabecera

  • sql>set pagesize 10000

COPIAS DE SEGURIDAD

EXPORTAR USUARIO (BASE DE DATOS)

$>exp USUARIO/CONTRASEÑA@BASEDEDATOS FILE=ARCHOVO.EXP FILE=ARCHOVO.EXP.LOG FULL=Y TABLES=(EMP,DEPT,MGR) buffer=1000000

IMPORTAR USUARIO (BASE DE DATOS)

$>imp USUARIO/CONTRASEÑA@BASEDEDATOS file=ARCHIVO_DE_COPIA_DE_SEGURIDAD.exp commit=y log=ARCHIVO_DE_LOG_DESEADO.log buffer=1000000 ignore=n fromuser=USUARIO_QUE_HIZO_LA_COPIA touser=USUARIO_QUE_RESTAURA_LA_COPIA''

EJEMPLO

Util por ejemplo para traerte una cópia de la base de datos de un ordenador a otro. Presupongo que tienes guardado en un sql la estructura de la base de datos ( usuairo para Oracle) Primero hago el export

exp usuario/contraseña@maquina file=export.exp log=el_log.log buffer=3000000 

Luego me conecto como usuario system ( root) y me cargo el usuario de base de datos (osea la base de datos) para luego a traves del script sql_con_la_estructura_de_la_base.sq2 recrear las tablas

sqlplus system/contraseña@máquina
SQL> drop user base_que_queremos_machacar cascade ;
SQL> user dropped
SQL>@sql_con_la_estructura_de_la_base.sq2
SQL>exit

Una vez hecho esto ya puedo importar los datos en las nuevas tablas vacías.

imp usuario/contraseña@maquina file=export.exp commit=y log=log.log buffer=1000000 ignore=n fromuser=usuario_que_hizo_el_export touser=nuevo_usuario

SESIONES

A veces, a la hora de borrar una base de datos oracle te dice que hay conexiones activas y que no se puede borrar mientras haya gente conectada. O nos puede interesar simplemente saber quien hay conectado a una base de datos. Esto se hace de la siguiente manera:

VER SESIONES ORACLE

Para ver las sesiones abiertas:

select username, status,  sid, serial# from v$session;

MATAR SESIONES ORACLE

Una vez que ya sabes el sid y el serial con la consulta de arriba es tan facil como:

alter system kill session 'sid,serial#'; 

SQL LOADER

Sql Loader es una utilidad que proporciona Oracle para cargar datos a una base de datos desde un fichero externo, normalmente un fichero de texto aunque tambien pueden ser ficheros binarios. Al SQLLoader ( sqlldr) se le pasan como parametros (los más importanes) el fichero que contiene los datos que se van a cargar y otro fichero mas de control que es donde se especifican las acciones a realizar. El formato de los datos, donde se cargaran y cualquier otro tipo de control.

SYNTAXIS

sqlldr userid=USUARIO/CONTRASEÑA@BASE control=/RUTA/DEL/FICHERO/DE/CONTROL data=/RUTA/DEL/FICHERO/QUE/CONTIENE/LOS/DATOS log=/LO/MISMO bad=/A/DONDE/VAN/LOS/DATOS/MALOS discard=/A/DONDE/VAN/LOS/DATOS/DESCARTADOS 

EJEMPLO

sqlldr userid=jj/contraseña@sistema control=/HOME/ctl/a.ctl data=/HOME/jj/tmp/a.txt

ORA-01089

ORA-01089: immediate shutdown in progress - no operations are permitted

Si estás aqui es porque alguien ha intentado parar oracle.

Si no eres el administrador de la base de datos y no sabes por que te ha pasado ESPERA

Si eres el administrador TEN PACIENCIA. ¡ EL PROCESO DE APAGARSE DE ORACLE PUEDE LLEGAR A TARDAR 1 O 2 HORAS ! No hagas como yo y al cabo de 30' lo mates.

Si, como yo, has matado el proceso de oracle. Al intentar arrancar te va a salir ese precioso error aunque acabes de reiniciar. ORA-01089: immediate shutdown in progress - no operations are permitted

  • El log de tu base de datos está bajo $ORACLE_HOME/admin/bdump/alert_$tu_base_de_datos.log
  • Y si se ha cerrado bine Oracle debería decir algo parecido a esto:
Shutting down instance (immediate)
License high water mark = 6
All dispatchers and shared servers shutdown
Fri Oct 19 08:53:32 2007
ALTER DATABASE CLOSE NORMAL

Y ahora… como intentar solucionar la tragedia: hay dos posibilidades:

  • Shutdown abort
  • startup force

Intenta conectarte a la bases de datos. Pero no lo hagas como sqlplus system/@base. Hazlo como lo hace el proceso de arrancar normal.

1. Arranca Oracle

/etc/rc2.d/S99oracle

2. Exporta la variable de tu(s) usuario(s)

export ORACLE_SID=EL_NOMBRE_DE_TU_BASE

3. Entra en sqlplus

sqlplus 

4. Conectate como sysdba

connect / as sysdba;

5. Trata de arrancarlo

5.2

startup force;

5.1 menos recomendabe porque al hacer shutdown abort puedes perder transacciones

shutdown abort;
startup;

Te recomiendo que tengas otra terminal en donde vayas viendo el log para que veas que va pasando.

Y… ARMATE DE PACIENCIA PARA ESPERAR A QUE EL NIÑO ACABE DE HACER SUS COSITAS

Es tambien recomendable arrancar y parar oracle un par de veces una vez conseguido arrancarlo para que todo vuelva a la normalidad

Por cierto… hay gente por ahi que dice que reiniciando la máquina se ha solucionado. No lo he comprobado. Yo no podía reiniciar

PERFORMANCE TUNNING ...

… o como dirían en mi pueblo ajustes de funcionamiento

Clustering Factor

El Clustering factor es un índicador que sirve para medir cuan ordenados están los registros de una tabla respecto a su índice. Si los registros de la tabla están percetamente ordenados respecto a su índice (primer puesto del indice es el primer registro y el puesto número 59 del índice es el registro ubicado en 59avo lugar )

Por eso, cuanto el valor sea menor mejor ordenada está la tabla, menos bloques lee oracle y mas rápido va. aquí tienes una explicación mucho mas detallada y mejor.

SELECT
 ut.TABLE_NAME, ut.BLOCKS, idx.INDEX_NAME, idx.CLUSTERING_FACTOR
 FROM
 USER_INDEXES idx, USER_TABLES ut
WHERE
 ut.TABLE_NAME = idx.TABLE_NAME AND ut.TABLE_NAME LIKE 'Tu Tabla' 
ORDER BY 1, 2;

Buscar Bloqueos

select
  XIDSLOT, XIDSQN as order_me, oracle_username, 'ps -ef | grep ' || process process_finder,
  os_user_name,
  DECODE(locked_mode,
  		 1, 'SELECT',
		 2, 'SELECT FOR UPDATE / LOCK ROW SHARE',
		 3, 'INSERT/UPDATE/DELETE/LOCK ROW EXCLUSIVE',
		 4, 'CREATE INDEX/LOCK SHARE',
		 5, 'LOCK SHARE ROW EXCLUSIVE',
		 6, 'ALTER TABLE/DROP TABLE/DROP INDEX/TRUNCATE TABLE/LOCK EXCLUSIVE') lock_mode,
  object_name,
  object_type
from
  v$locked_object a,dba_objects b
where
  a.object_id = b.object_id
  order by order_me;

Analisis del espacio consumido y estado

 select d.status,
     db.name dbname,
     d.tablespace_name tsname,
     d.extent_management,
     d.allocation_type,
     to_char(nvl(d.min_extlen / 1024, 0),
       '99G999G990D90', 'NLS_NUMERIC_CHARACTERS = '',.'' ')
       "ALLOC_SIZE (K)",
     d.contents "Type",
   case
   when(d.contents = 'TEMPORARY') then
     to_char(nvl(t.bytes / 1024 / 1024, 0),
     '99G999G990D90', 'NLS_NUMERIC_CHARACTERS = '',.'' ')
   else
     to_char(nvl(a.bytes / 1024 / 1024, 0),
     '99G999G990D90', 'NLS_NUMERIC_CHARACTERS = '',.'' ')
   end as "Size (M)",
     to_char(nvl((a.bytes - nvl(f.bytes, 0)) / 1024 / 1024,   0),
     '99G999G990D90', 'NLS_NUMERIC_CHARACTERS = '',.'' ')
     "Used (M)",
     to_char(nvl((a.bytes - nvl(f.bytes, 0)) / a.bytes * 100,   0),
     '990D90', 'NLS_NUMERIC_CHARACTERS = '',.'' ')
     "Used (%)"
   from sys.dba_tablespaces d,
       (select tablespace_name,
        sum(bytes) bytes
      from dba_data_files
      group by tablespace_name)
   a,
       (select tablespace_name,
        sum(bytes) bytes
      from dba_temp_files
      group by tablespace_name)
   t,
       (select tablespace_name,
        sum(bytes) bytes
      from dba_free_space
      group by tablespace_name)
   f,
     v$database db
   where d.tablespace_name = a.tablespace_name(+)
    and d.tablespace_name = f.tablespace_name(+)
    and d.tablespace_name = t.tablespace_name(+)
order by 10 desc;

Utilidades

 
sqlplus.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki