Volver atrás

Instalación del software de base de datos.

Prerequisitos.

Será una máquina virtual de VirtualBox.
Fichero OVA que contiene:

  • Centos 7 - instalado (inglés).
  • Oracle 18c descargado.

Resolver el propio nombre.

Cambiar el nombre de la máquina. Editamos los ficheros:

  • /etc/hostname
  • /etc/hosts → Hay que añadir el nombre de la máquina en 127.0.0.1 ó ::1
Seguidamente de ello, reiniciar la máquina para guardar los cambios.

Entorno gráfico.

El instalador más cómodo de Oracle necesita un sistema de ventanas. Hay varias opciones:

  • Arrancar el modo gráfico en la máquina virtual.
    startx
  • Conexión SSH con redirección de protocolo X11.
    ssh -X alumno@IP-servidor
  • Arrancar un servidor VNC en Centos.
    sudo yum install vnc-server 
    vncserver :0

Oracle 18c.

Descomprimir el instalador.

descomprimir sus ficheros en el directorio $HOME/oracle-install-18c

  • Sugerencia: línea de comandos unzip
  • Directorio $HOME/oracle-install/
  • Fichero: LINUX.X64_180000_db_home.zip
Para hacer sitio, podemos borrar los ficheros .zip una vez descomprimidos.

Arrancar el instalador.

→ Se arranca con ./runInstaller.
→ Instalar sólo el software de la base de datos.
→ Elegir Single instance database.
→ Edición Enterprise.

Direcitorios de Oracle.

Dejamos los directorios por defecto:

  • Oracle Base: /home/alumno/oracle-18c
  • Software: /home/alumno/oracle-install-18c
  • Inventory: /home/alumno/oraInventory
    • dejamos el grupo a alumno

Grupos de Linux.

Elegir wheel.

  • Es un grupo de administrador de Centos.
  • El usuario alumno ya pertenece a él.

Comprobaciones.

Ignoramos la falta de memoria. El instalador detectará algunos errores, pero genera unso scripts de fix.

  • Son parámetros del kernel de Linux.
  • Los scripts se ejecutan como administrador.
Se necesitan instalar varios paquetes de software.
  • sudo yum install paquete
  • Es necesario que la máquina virtual tenga acceso a Internet
También hay un paquete de dependencias oracle-database-preinstall-18c-1.0-1.el7.x86_64.rpm),que se puede instalar con yum localinstall

Script de configuración

/home/alumno/oraInventory/orainstRoot.sh
/home/alumno/oracle-install-18c/root.sh

Finalización.

Necesitamos definir algunas variables de entorno (ficheros ~/.profile, ~/.bash_profile, ~/.bashrc)

  • ORACLE_HOME: /home/alumno/oracle-install-18c
  • Incluir $ORACLE_HOME/bin en el PATH
También se puede usar el comando oraenv para definir estas variables.

Reiniciar.

En un servidor real no se hace, pero es más fácil para actualizar todas las variables de entorno. Después, podemos ver que los programas están, pero no hacen nada.
sqlplus / as sysdba

Volver atrás

Instancia.

Varios procesos funcionando. Permite manipular una o varias bases de datos (En Oracle solo una).

Listener.

Proceso que admite conexiones de clientes.
En otros SGBD (MySQL) la instancia es su propio listener, conecta los clientes con la instancia pedida.

Base de datos.

Varios ficheros contiene datos, índices, esquema,...

Instancias y bases de DATOS


Instancia y base de datos.

Ejemplo de listener.

Volver atrás

Creación de una instancia de base de datos

Comando dbca. No estará en el PATH si no se ha incluido (por ejemplo, con oraenv), utilizar la configuración típica:

  • Nombre: asir
  • Que no sea container database
  • Recordar la contraseña
Guardar la información de la página de resumen.

Password management.

Lista de usuarios, se puede:

  • Bloquearse o desbloquearse.
  • Cambiar su contraseña.

Volver atrás

Creación de un listener

Permiten las conexiones de clientes remotos. Comando netca

  • Listener configuration
  • Nombre del listener: LISTENER
  • Protocolo TCP
  • Puerto 1521
Comprobar la configuración creada en el fichero listener.ora. Si luego falla, revisar ADR_BASE_LISTENER.

Arrancar y parar el listener

  • Arrancar

    lsnrctl start
  • Parar

    lsnrctl stop
  • Comprobar si la instancia se ha conectado

    lsnrctl status

Arrancar y parar la base de datos

Se necesitan las variables ORACLE_HOME, ORACLE_SID, PATH, ORACLE_BASE. Se definen manualmente con ayuda del script oraenv.

source oraenv

Arrancar y parar la base de datos.
dbstart $ORACLE_HOME dbshut $ORACLE_HOME Arrancar y parar el listener. Comprobar que se admiten conexiones.
lsnrctl start
lsnrctl stop
lsnrctl status

Volver atrás

Conexión en local

Después de la creación de un listener y una instancia, ya podemos conectarnos a la base de datos. Recordatorio: Debemos tener configuradas las variables de entorno.

  • ORACLE_SID:El nombre que de a la base de datos (asir)
  • PATH:Debe incluir $ORACLE_HOME/bin
  • Se puede poner también con oraenv
sqlplus / as sysdba

Volver atrás

Acceso por redes

Es necesario conocer la IP de nuestro servidor.

  • ifconfig
  • hostname -I
  • ip a
Es necesario que el ordenador cliente pueda acceder al servidor.
  • Tipo de conexión de la máquina virtual: mejor bridged
  • ping
  • Firewall: systemctl disable firewalld

Conexión remota

Es necesario conocer la IP o nombre del ordenador remoto, si nos fiamos de DHCP, cada día puede ser una IP distinta. Es mejor usar un nombre:

  • DNS: Muy difícil
  • Nombres netbios de Windows
  • Nombres zerocconf/avahi de Linux/Mac

Avahi

Instalar avahi y avahi-tools. Activar opciones publish-hinfo y publish-workstation. Desactivar el firewall, importante: el nombre afecta al fichero listener.ora.
El nombre de red será el que tengamos más .local. Por ejemplo:
alumnoASGBD.local Con esto un Windows puede encontrar a un linux. Para que Linux encuentre a otro linux, hay que cambiar /etc/nsswitch.conf En Centos, hay que instalar nss_mdns.

Samba

Instalar y conf. Samba en Centos 7


sudo yum install -y samba samba-client samba-common 
systemctl enable smb.service 
systemctl enable nmb.service
Cambiar el fichero smb.conf, el netbios name → Máximo 15 caracteres, sin guiones.
Importante:el nombre afecta al fichero listener.ora

Acceso via Web

Al crear la base de datos con dbca se configura el acceso Enterprise Manager.

URL: https://nombre-o-ip:5000/em/

Tenemos IP dinámica, por lo que debemos configurar una resolución por nombre.
  • DNS es complicado
  • Usaremos avahi entre linux y samba entre linux y Windows

Instalación de sqlplus

El cliente sqlplus viene en la instalación de Oracle, pero tambiñen puede instalarse por separado.

Tras descomprimir, hay que definir las variables ORACLE_HOME y LD_LIBRARY_PATH al directorio de instalación. Puede ser necesaria la librería libaio
Para conectarse:

sqlplus username/password@host:port/service
sqlplus sys/alumno@centos7.local/asir as sysdba

Instalación de SQLDeveloper en Centos.

Se necesita JDK 1.8, se instalan los ficheros sqldeveloper-4.1.5.21.78-1.noarch.rpm y jdk-8u111-linux-x64.rpm
Descargar JDK 8
Descargar SQL Developer
Arrancar sqldeveloper desde consola - preguntará por el directorio de instalación del JDK.

Instalación de SQLDeveloper en Ubuntu

Se necesita JDK 1.8.
Se descarga el fichero sqldeveloper-xxxx-no-jre.zip
Se descomprime y se ejecuta sqldeveloper.sh

Volver atrás

Cosas que hemos aprendido de pasada

  • Variables de entorno - Variable PATH
  • Conexiones por ssh - Con redirección del Xserver
  • Edición de ficheros de texto
  • Instalación de paquetes en Centos
  • Conexiones de red (bridged,NAT)
  • Elevación de permisos con sudo
  • Descompresión de ficheros ZIP
Nada de esto es directamente base de datos pero ja sido necesario para instalar Oracle.

Comandos

cd Cambia el direcotrio actual
echo Escribe los parámetros pasados
df Espacio de disco usado
unzip Descomprimir un zip
updatedb Actualiza la lista de ficheros de disco
locate Busca un fichero la lista de updatedb
ssh Conexión remota
grep Busca líneas con un texto
nano Editor de ficheros
netstat Ver conexiones de red
nc Conectar por TCP o UDP
$var Valor de una variable (de export y env)
| Manda la salid de un programa a la entrada de otro
$HOME/.bashrc Script de inicio del usuario
source Ejecuta un script dento de la shell actual
export Define una variable
env Lista de variables
PATH Lista de directorios donde se buscan comandos
history Lista de comandos introducidos en la shell

Volver atrás

Arquitectura

Oracle es un sistema complejo. Para hacerlo más seguro, sus tareas se distribuyen entre muchos procesos. Si un procesp falla, los demás pueden intentar seguir trabajando.

Algunos procesos.

PMON(Process MONitor) Monitor de procesos, se encarga de controlar los otros procesos en background y de recuperarlos cuando uno de ellos falla.
SMON(System MONitor Process) Recupera transacciones. realiza tareas de limpieza: recuperar segmentos temporales, combinar extensiones contiguas y disponibles,...
DWBn (Database Writer Process) Escribe el contenido de los buffers en los datafiles. n puede ser 0,1,...,9,a,...,j
LGWR(Log Writer Process) Gestión del buffer de redo, escribiendo su contenido en los archivos log.
CKPT(ChecKPoinT Process) Actualiza los datafiles y el fichero de control cuando se establece un punto de control (checkpoint).
RECO (RECOverer Process) Necesario ante fallos en transacciones distribuidas.

SGA y PGA.

PGA.Program Global Area. Es la zona de memoria dedicada a un proceso.
Global: si admite mñas de una conexión, se comparte entre conexiones.
SGA.System Global Area. Memoria compartida entre todos los procesos de Oracle.

Procesos de usuario y procesos de sistema.

Los procesos de usuario no se conectan directamente a la SGA. Oracle crea procesos intermedios para aislarlos.

Volver atrás

Arranque y parada.

Oracle tiene varios estados.

Shutdown Todo parado
Nomount Memoria compartida reservada
Mount Fichero de control abierto
Open Fichero de datos abierto. Los clientes pueden conectarse.

¿Por qué tantos modos?

Shutdown y open son los modos habituales.
Nomount para recuperar la base de datos de errores(si falta algún fichero).
Mount para habilitar y deshabilitar el redo log. Para recuperar la base de datos de errores (sin usuarios) Conclusión: con suerte, solo shutdown y open.

Volver atrás

Vistas.

En un sistema relacional, toda la información se guarda en forma de relaciones. Las vistas son representaciones de otras vistas o relaciones.

  • Quitando algunas filas o columnas.
  • Uniendo unas tablas con otras.
Tanto las tablas como las vistas son relaciones.

Vistas de Oracle

La información acerca de la base de datos también se almacena en relaciones de la base de datos. Generalmente, en forma de vistas. Ejemplos:

    Tablas: nombres, propietario,...
    Campos de las tablas: Nombre, tipo, longitud,...
    Restricciones
    Usuarios: nombre, contraseñas,...
    Tablespaces

Tipos de vistas de Oracle.

USER_XXX Estática Acerca de los objetos propiedad del usuario
ALL_XXX Estática Objetos que puede acceser el usuario
DBA_XXX Estática Todos los objetos de la base de datos (*)
V$XXX Dinámica Información dinámica de la instancia
GV$XXX Dinámica Información dinámica del cluster
Vista comodín:
select * from dict;

Ejemplos de vistas: ficheros.

  • Tipo de archivo: → De Datos (dbf) undo,system y users.
    Vista:
    v$datafile
  • Tipo de archivo: → Temporales (tmp).
    Vista:
    v$tempfile
  • Tipo de archivo: → Rehacer o Redo Log (log).
    Vista:
    v$logfile, v$log
  • Tipo de archivo: → De control. Estructura física de la BD.
    Vista:
    v$controlfile
  • Tipo de archivo: → De log.
    Vista:
    v$diag_info
  • Tipo de archivo: → Información de la BD.
    Vista:
    v$database

Archivos

Los datos de las tablas al final se almacenan en archivos.

Archivos de datos, de usuarios y del sistema. En tablespaces (dbf).
Redo log (registro de todas las transacciones). log
Archivos de control. ctl

Usuarios, privilegios y roles de Oracle

Introducción

Oracle puede usarse simultáneamente por varios procesos y clientes. Cada uno puede tener distintos permisos y capacidades.

  • Espacio de disco disponible.
  • Gasto de CPU, red.
  • Acceso a diferentes tablas de datos.

Tablespaces

Oracle almacena datos en los tablespaces.

Conjuntos de ficheros.
Normas para su tamaño: inicial, máxim, crecimiento
Cada tablespace puede usarse para diferentes funciones.
  • Datos de usuario o del sistema: permanent tablespace
  • Datos de recuperación: undo tablespace
  • Datos temporales: temporary tablespace

¿Por qué tantas normas?

  • Disponibilidad
    • Es mejor garantizar el espacio para las tablas.
    • Es mejor ahorrar espacio mientras se pueda.
  • Velocidad
    • Hacer crecer un fichero es lento.
    • Un fichero que ha crecido poco a poco está disperso en el disco (y es más lento)
  • Capacidad
    Cada sistema de ficheros tiene un tamaño de fichero máximo.

Tablespaces por defecto ↠(USSUT)

Por defecto, Oracle crea en una nueva base de datos:

  • [U]sers: Tablespace asignado por defecto para los datos de todos los usuarios.
  • [S]ystem: Datos acerca de la instancia y del diccionario de datos.
  • [S]ysaux: Operaciones temporales del administrador que no caben en memoria.
  • [U]ndo(undotbs1): Datos para deshacer las transacciones(rollback).
  • [T]emp: Operaciones temporales de usuarios que no caben en memoria.
Ver tablespaces por defecto en SQLPLUS: select tablespace_name, contents from dba_tablespaces;

Crear un tablespace

CREATE TABLESPACE nombre
 DATAFILE 'ruta/al/fichero.dbf'
 AUTOEXTEND ON 
 NEXT 200k
 MAXSIZE 2048k;

¿Por qué es tan complicado?

Esta flexibilidad permite:

  • Que cada usuario tenga sus tablespaces
  • Que cada tablespace esté en discos distintos (rapidez)
  • Que un tablespace se localice en varios discos (rapidez, tamaño)
  • Mover tablespaces una vez creados

Conceptos de almacenamiento.

Usuarios

Oracle tiene dos modos de autentificar usuarios.

  • Autentificación de sistema operativo.
  • Autentificación con seguridad nativa oracle
Al instalarlo, elegimos que el grupo wheel era administrador.

Creación de usuarios

CREATE USER usuario IDENTIFIED BY contraseña
DEFAULT TABLESPACE tablespace
TEMPORARY TABLESPACE tablespaceTemporal 
QUOTA UNLIMITED ON tablespace 
QUOTA tamaño ON tablespace 
ACCOUNT lock/unlock

Modificación de usuario

  • Modificación de un usuario ya creado.
    ALTER USER usuario CUALQUIER OPCION VALIDA AL CREAR USUARIO;
  • Borrado de usuario.
    DROP USER usuario;

Privilegios

Cada usuario puede tener unos permisos distintos. Ya hemos visto dos permisos.

  • En qué tablespace se puede escribir
  • Cuántos datos se pueden escribir en esos tablespaces
  • Si una cuenta está bloqueada
Pero hay más permisos.
Privilegio Objeto sobre el que se aplica
create,alter,drop table,sequence,view,user,synonym,session
select,update,delete,insert Sobre campos de tablas y filas.

Sintaxis de Grant

grant PRIVILEGIO1,PRIVILEGIO2,...PRIVILEGION 
on OBJETO 
to USUARIO 
with GRANT OPTION;

create table alumnos(...); create user profesor ...; grant select on alumnos to profesor;

Quitar privilegios

Los privilegios se quitan con revoke.
Cuando un usuario pierde un privilegio, lo pierden también todos los que recibieron el mismo privilegio a través de él. Por la cláusula with grant option.

connect sys/**** 
grant select on tabla1 to usuario1 with grant option; 

connect usuario1/*** grant select on tabla1 to usuario2;
connect sys/**** revoke select on tabla1 from usuario1;
Aquí ni usuario1 ni usuario2 tienen privilegios sobre la tabla1.

Roles

Asignar todos los privilegios a un usuario es trabajoso, pero factible. Qué ocurre si tenemos que manejar a muchos usuarios? Los roles permiten dar nombre a un grupo de privilegios.

  • Se pueden asignar privilegios a un rol.
  • Y después asignar ese rol a varios usuarios.

Sintaxis de roles

CEATE ROLE nombrerole;
GRANT privilegios ON objeto TO nombrerole;
GRANT nombrerole TO usuario1;
GRANT nombrerole TO usuario2;
...
GRANT nombrerole TO usuarion;

Perfiles

Un profile es un conjunto de limitaciones sobre el sistema Oracle.
No limita acceso a datos, sino al propio SGBD y sistema operativo.

Creación de perfiles

CREATE PROFILE nombreperfil LIMIT 
	session_per_user			UNLIMITED
	cpu_per_session				UNLIMITED
	cpu_per_call				30000 
	connect_time				45 
	idle_time				300 
	logical_reads_per_session	 	DEFAULT
	logical_reads_per_call			1000
	private_sga				15K 
	composite_limit				5000000; 
ALTER SYSTEM SET resource_limit = TRUE scope = BOTH

Asignación de perfil a un usuario

En la creación (create user), o posteriormente.
alter user USUARIO profile NOMBREDELPERFIL;

Introducción

Oracle es un servidor de base de datos, idealmente, cada usuario debería poder usar la base de datos como si fuera para él en exclusica (ACID). Más de un usuario, y más de un cliente por usuario, puede utilizar a la vez el servidor. Problemas:

  • Bloqueos de tablas.
  • Auditoría de conexiones.

Propiedades ACID

Atomicidad Un conjunto de cambios se realiza en su totalidad, o no se realiza ninguno.
Consistencia Las reglas de los datos (constraints) se respetan.
Aislamiento Cada usuario puede trabajar considerando que es el único que usa la BD.
Durabilidad Una vez grabada una modificación, persistirá aunque ocurra algún fallo posterior.

Atomicidad

Algunos cambios deben producirse juntos. Ejemplo:

Una transferencia bancaria debe restar de una cuenta y sumar en otra
El conjunto de cambios es una transacción.
Una transacción empieza cuando acaba la siguiente.
Termina con:
  • commit Los cambios se guardan
  • rollback Ningún cambio se guarda
  • Desconexión o error - generalmente, equivalente a rollback

Consistencia

Los datos deben ser coherentes con el modelo de datos. Se usan restricciones (constrains).

  • primary key
  • unique
  • foreign key
  • check
  • Incluso triggers (scripts del gestor de BD)
No hay forma de saltarse una constrains, más allá de eliminarla (drop).

Aislamiento (isolation)

Objetivos:

  • Cada usuario debe poder trabajar como si fuera el único.
  • Pero al mismo tiempo los datos deben poder accederse concurrentemente.
Esto supone llegar a un compromiso:
  • Cuanto más aislamiento menos concurrencia.
  • Cuanto más concurrencia menos aislamiento.
Estos problemas los trataremos más adelante.

Durabilidad

Las bases de datos garantizan tras la vuelta de commit que:

  • Los datos han sido grabados a soporte no volátil
  • Los datos son recuperables por este y otros usuarios

Problemas de uso concurrente

Idealmente, cada usuario debería trabajar sin notar que otros usuarios usan a la vez la base de datos. Debido a otras transacciones, pueden presentarse los siguientes problemas:

Lectura sucia Dirty read Un usuario lee datos aún no confirmados.
Lectura no repetible Repeatable read Un usuario lee menos filas (o filas cambiadas) en select sucesivas dentro de la transacción
Fila Fantasma Phanton read Un usuario lee más filas en select sucesivas dentro de la misma transacción.

Nivel de aislamiento/concurrencia

Problema Nivel de aislamiento
Lectura sucia Read Oncommited (Oracle no lo tiene)
Lectura no repetible Repeatable read (Oracle no lo tiene)
Read committed (por defecto en Oracle)
Fila Fantasma Serializable

Datos de pruebas

create table ALUMNOS (dni varchar(10), nombre varchar(10));
insert into ALUMNOS values('1', 'nom1');
insert into ALUMNOS values('2', 'nom2');
insert into ALUMNOS values('3', 'nom3');

Lectura no repetible

Conexión 1. Conexión 2.
set transaction isolation level 
read committed 
select * from alumnos 

select * from alumnos 
(aún no se ve el cambio, sería un alectura sucia)

select * from alumnos
(ahora se ve el cambio, es una lectura no repetible)
rollback
set transaction isolation level 
read commited 
select * from alumnos
update alumnos set nombre='nom1' where dni='3'


commit 

Fila fantasma

Conexión 1. Conexión 2.
set transaction isolation level 
read commited
select * from alumnos


select * from alumnos 
(La conex.1 leerá más alumnos en la segunda 'select', 
una fila fantasma)
rollback
set transaction isolation level
read commited 

insert into ALUMNOS values ('4', 'nom4')
commit

Bloqueos y versiones

La orden set isolation level indica a la base de datos que bloquee filas, campos o tablas. Al bloquearse, los demás usuarios no pueden acceder hasta que la transacción no termine.

  • commit
  • rollback
Los bloqueos garantizan que no se producen los problemas correspondientes al nivel de aislamiento.
  • read commited
  • serializable
Las versiones hacen que una transacción vea solo una fotografía del estado de la base de datos, la transacción no se ve afectada por cambios posteriores a su inicio.

Lectura no repetible evitada

Conexión 1 Conexión 2
set transaction isolation level
serializable 
select * from alumnos

select * from alumnos 
(No se ve el cambio, sería una lectura sucia)

select * from alumnos 
(El cambio no se ve, sería lectura no repetible)
rollback



update alumnos set nombre='nom2' where dni=3


commit

Fila fantasma evitada

Conexión 1 Conexión 2
set transaction isolation level 
serializable 


select * from alumnos 
(No se ve el cambio, sería lectura no repetible)
delete from alumnos where nombre='nom1'
ORA-08177:can't serialize access for this transaction
rollback


insert into alumnos values ('5','nom5')
commit

Bloqueos no automáticos

Los niveles de aislamiento bloquean aitmáticamente filas, campos o tablas; pero también pueden bloquearse manualmente. Bloqueo de una tabla completa:

lock table TABLA in exclusive mode
Bloqueos de algunas filas:
select %consulta que devuelva algunas filas de una tabla% for update

Detección y solución de sesiones bloqueadas

Si un usuario/aplicación se comporta de manera inadecuada, puede bloquear la base de datos, es necesario monitorizar los bloqueos y solucionarlos:

  • Avisando al usuario
  • Modificando la aplicación
  • Matando las transacciones o conexiones bloqueantes

Vistas de sesiones

Contiene información de las sesiones

  • Usuario Oracle
  • Usuario de sistema operativo
  • Cliente Oracle
  • Sentencia SQL

  • v_$session
  • v_$process
  • V_$SQLTEXT
  • V_$LOCK
  • V_$LOCKED_OBJECT
  • V_$SESS_IO5

Usuarios conectados

select username,osuser,terminal
from sys.v_$session
where username is not null
order by username,osuser;

Usuarios conectados - 2

select s.username, s.program, s.logon_time
form sys.v_$session s, sys.v_$process p, sys.v_$sess_io si
WHERE s.paddr = p.addr(+) 
AND si.sid(+) = s.sid 
AND s.type = ’USER’;

Bloqueos de la base de datos

select session_id "sid",SERIAL#  "Serial",
  substr(object_name,1,20) "Object",
  substr(os_user_name,1,10) "Terminal",
  substr(oracle_username,1,10) "Locker",
  nvl(lockwait,’active’) "Wait",
  decode(locked_mode,2, ’row share’,3, ’row exclusive’,4, ’share’,5, ’share row exclusive’,6, ’exclusive’,  ’unknown’) 
  "Lockmode",OBJECT_TYPE "Type"
FROM SYS.V_$LOCKED_OBJECT A,
  SYS.ALL_OBJECTS B,
  SYS.V_$SESSION c
WHERE A.OBJECT_ID = B.OBJECT_ID
AND C.SID = A.SESSION_ID
ORDER BY 1 ASC, 5 Desc;

Descripción de usuarios bloqueados y bloqueantes.

select s1.username || ’@’ || s1.machine|| ’ ( SID=’ || s1.sid || ’ )  is blocking ’
|| s2.username || ’@’ || s2.machine || ’ ( SID=’ || s2.sid || ’ ) ’AS blocking_status
from v_$lock l1, v_$session s1, v_$lock l2, v_$session s2 
where s1.sid=l1.sid
and s2.sid=l2.sid
and l1.BLOCK=1
and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2 ;

Sentencia SQL bloqueada (de un SID)

select s.sid, q.sql_text
from v_$sqltext q, v_$session s
where q.address = s.sql_address
and s.sid =*ELSIDBLOQUEADO*
order by piece;

Sentencias SLQ bloqueadas

select s.sid, q.sql_text
from v_$sqltext q, v_$session s
where q.address = s.sql_address
and s.sid in (
  selects2.sid from v_$lock l1, v_$session s1, v_$lock l2, v_$session s2
  where s1.sid=l1.sid
  and s2.sid=l2.sid
  and l1.BLOCK=1 
  and l2.request > 0
  and l1.id1 = l2.id1
  and l2.id2 = l2.id2
  )
order by piece;

Terminar una sesión

SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,s.program
FROM gv_$session s
JOIN gv_$process p
ON p.addr = s.paddr
AND p.inst_id = s.inst_id
WHERE s.type != ’BACKGROUND’;

alter system kill session 'sid, serial#';

Terminar una sesión (sistema operativo)

Solo como último recurso, mejor KILL SESSION se debe matar el proceso identificando en el spid (system process identifier) Importante:

  • El spid del proceso intermedio entre el cliente (application code) y el servidor (system global area)
  • Por tanto, el proceso a matar se encuentra en el mismo host que el servidor de base de datos.

Exportar e importar

Exportación

Se usa el comando expdp
Para obtener ayuda del comando use: expdp help=yes.


Es necesario crear antes el directory de Oracle. Ejemplo de exportación:

expdp scott/tiger DIRECTORY=dirdmp DUMPFILE=scott.dmp SCHEMAS=scott LOGFILE=scott.log

Valores válidos para la exportación:
directory
dumpfile
include =TABLE_DATA -- example
logfile
query =employees:"WHERE department_id > 10" -- example
remap_data =EMPORIO.market:BOSS.market
schemas
tables =HR.EMPLOYEES, SH.SALES:SALES_2019
tablespace

directory de Oracle

Algunos comandos de Oracle necesitan trabajar sobre directorios del disco, a veces, no interesa que los usuarios conozcan/decidan los directorios para:

  • no llenar una partición
  • no divulgar información de la base de datos
  • no acceder a directorios donde Oracle puede, pero el usuario no

Definir un directorio

grant create any directory to EL_USUARIO; create directory MI-DIRECTORIO to EL_USUARIO;

Ejemplo de exportación.
[ CHUNCHE95@centosASGBD -] ~ expdp alumno/alumno directory=midir schemas=alumno dumpfile=alumno.dmp logfile=alumno.log

Importación

Se usa el comando impdp
Ayuda con impdp help=yes. Ejemplo de importación de los datos:

impdp scott/tiger DIRECTORY=dirdmp DUMFILE=scott.dmp LOGFILE=scoot.log

Valores válidos para la importación en Oracle:
directory
dumpfile
exclude =schema:"='HR'" -- example
full
include =TABLE_DATA -- example
logfile
query =employees:"WHERE department_id > 10" -- example
remap_data =EMPORIO.EMPNO:BOSS.EMPNO -- example
remap_datafile
remap_schema IMPORTANTE
remap_tablespace
schemas
tables_exist_action (Opciones: append, replace, skip (por defecto), truncate)
tables
tablespaces

Importar un schema en otro usuario

Importar un fichero del usuario profesor en el usuario alumno:
impdp system/alumno schemas=alumno remap_schema=profesor:alumno directory=EXPORTDIR dumpfile=profesor.dmp logfile=profesor.log


Permiso para cambiar schema: grant import full database to YOURUSER;

Ejercicios

Primero

- Cargar multas.sql
- Exportar la BD al fichero /datos/export/multas.dmp
- Importar las tablas en el usuario copiamultas

Segundo

- Crear usuario CARRERAS y ejecutar el script siguiente
- Cargar los datos coches.sql
- Exportar las tablas del usuario CARRERAS al fichero CARRERAS.dmp
- Borrar las filas de la tabla CARRERAS.RESULTADOS
- Importar los datos desde carreras.dmp

Otras soluciones

  • RMAN
  • Copia de tablespaces

Scripts de shell para Oracle.

Introducción

Muchas de las tareas del mantenimiento de una base de datos Oracle se llevan a cabo desde la línea de comandos. Por lo tanto, pueden automatizarse:

  • Arranque y parada
  • Extracciones
  • Copia de seguridad de datos
  • Restauración de datos
Para ello, se usan las facilidades de ejecución del sistema operativo aprendidas en otros módulos.

Scripts de shell

Shebang

Los scripts empiezan con una línea indicando el intérprete que los ejecutará, con un comentario #!

#!/bin/sh

#!/bin/php

#!/bin/python

Variables

# Variable local a esta shell
variable=valor
# Variable exportada a los hijos de esta shell
export variable_exportada=valor
# Variable definida solo para un comando
variable-para-un-comando=valor comando

Entrada/salida

Los programadas comienzan su ejecución con una salida y una entrada, son flujos de bytes, inicialmente:

  • La entrada es el teclado
  • La salida es la consola

Redirigir entrada/salida a fichero

# La entrada sale de un fichero en vez del teclado
sort < fichero
# La entrada sale de un fichero y la salida va a otro fichero
sort < fichero > fichero_ordenado
# La entrada sale de un fichero y la salida se agrega al final de un fichero
sort < otro_fichero >> fichero_ordenado
# La salida del primer comando es la entrada del segundo
sort < fichero | less

Heredocs

# Entrada se especifica en el propio script
sort << FINDEFICHERO
Maria
Pepe
Juan
Susana
Manolo 
FINDEFICHERO

Salida como parámetro

Se puede capturar la salida de un comando en una cadena, esa cadena se usa luego como otra cualquiera en el script.
# defino una variable con los ficheros del directorio
variable=$(ls)

Parámetros del script

    $0: El nombre del script. $1: Primer parámetro. $2: Segundo parámetro. $*: Todos los parámetros a partir del primero.

Funciones

Son conjuntos agrupados de órdenes con un nombre. Tienen sus propios argumentos: $*, $1, $2, ...

importante(){
echo ---------
echo Aviso: $*
echo ---------
}

importante "Así se define una función en bash"

Código de error (exit code)

Al terminar, un programa devuelve un valor numérico, por convenio:

  • 0: Todo ha funcionado correctamente.
  • Distinto de 0: Ha sucedido algún tipo de error.
Se puede consultar con $? inmediatamente después de ejecutar el comando.
 grep cadena * 
exit_code_del_grep=$? 
echo grep a devuelto: $exit_code_del_grep

Bucles

Con for se pueden hacer bucles sobre una lista de parámetros, para bucles numéricos se puede usar el comando seq.

for nombre in maria juan pepe susana manolo 
do 
  echo Realizando una vuelta de bucle sobre $nombre 
done 
# Cuidado con los nombres de fichero con espacio 
for fichero in $(ls) 
do 
  echo El siguiente fichero es $fichero 
done

Condiciones

if utiliza los códigos de error de los programas.

  • 0 se considera true
  • Cualquier otro valor se considera false
 if grep cadena * 
then 
	echo grep ha encontrado algo sin errores 
else 
	echo grep no lo ha encontrado, o ha habido errores
fi

return en funciones

Las funciones también tienen código de retorno. Pueden simplificar if o bucles while.

condicion(){ 
# Aquí se podría decidir el retorno con otros comandos 
# o con if's encadenados, pero como ejemplo devolvemos TRUE.
return 0
}

while condicion 
do 
	echo Esto es un bucle infinito 
done

Comando [

[ es un comando externo que ayuda a hacer condiciones con if

  • Comparación de cadenas
  • Comparación de números
  • Existencia de ficheros
TEST(1)
TEST(1) 
NAME 
	test -  check file types and compare values 
SYNOPSIS 
	test EXPRESSION 
	test 
	[ EXPRESSION ] 
	[ ]
	[ OPTION ] 

Operaciones aritméticas

Se usa $((expresión))

 # Incrementar la variable contador
contador = $(($contador + 1)) 

uniq - Comando para borrar repetidos

El comando uniq sirve para eliminar las repeticiones de una lista, ejemplo:

 uniq << EOF
hola
hola
adios 
hola 
EOF 
Pero esto solo funciona si los string están juntos, para que funcione bien, debemos pararlo con un sort, ejemplo:
mi_uniq(){
  sort | uniq 
}
mi_uniq <<EOF 
hola 
adios 
hola 
hola 
chao 
hola

Enviar un email

echo CUERPO DEL MENSAJE | mail -s "Asunto del mensaje" -a FICHERO_ADJUNTO maildechunche@gmail.com

Operaciones matemáticas, si no se dispone de bash

echo 2+2 | bc

Text User Interface

whiptail o dialog

Entorno inicial

bash procesa los siguientes ficheros:

      Si un nuevo login: /etc/bash.bashre (Debian), /etc/bashrc (Centos), ~/.bash_login
      Siempre: /etc/profile ~/.bashrc
Así, se puede conseguir que:
  • Se ejecuten comandos al entrar a un sistema
  • Se ejecuten comandos en cadena nueva shell
  • Se ejecuten comandos para todos los usuarios

Ejercicios

      1. Haz que el usuario 'alumno' tenga las variables necesarias para usar ORACLE cada vez que hace login.
      2. Haz que el usuario 'alumno' vea el estado del listener cada vez que inicia una shell.
      3. Haz que todos los usuarios vean el mensaje 'Bienvenido a ASGBD' cada vez que inician una shell.
      4. Crea un script en $HOME/estado.sh que muestre el valor de las variables HOME, USER, PATH. ORACLE_HOME, ORABLE_SID, ORACLE_BASE y la hora actual.

Prerrequisitos

Los comandos de Oracle necesitan conocer a qué instancia hacen referencia, para ello, necesitan las variables de entorno ORACLE_HOME y ORABLE_SID, también, es conveniente añadir los comandos de Oracle al path. El siguiente script puede usarse para tener estas variables (ejecutándolo con source )

#!/bin/sh 
ORACLE_HOME=/var/oracle/product/18.1.0/asir_bbdd
ORACLE_SID=asir
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_HOME
export ORACLE_SID
export PATH	

Autenticación de SQLPLUS

SQLPlus se autentica/autentifica de varias formas.

  • Mediante Oracle: usuarios creados con create user ...
  • Mediante el sistema operativo: Al instalar, se indica un grupo de usuarios que Oracle considera autenticados (Grupo wheel)
SQLPlus con autenticación de sistema operativo.
show parameter os_authent_prefix; -- Por defecto es 'ops$'
create user ops$usuario identified externally;
#+end_src_ 

#+begin_src sh 
su usuario 
sqlpñus / 
 

SQLPlus con autenticación de Oracle

sqlplus sys/alumno as sysdba

Conexiones de SQLPlus

Hasta ahora:

  • todas las conexiones de SQLPlus son locales, sin utilizar la red
  • todas las conexiones de SQLDeveloper son por red
Para conectar por red con SQLPlus se usa un descriptor de conexión
  • Los descriptores están en el fichero tnsnames.ora
sqlplus sys/alumno@CONEXION as sysdba

tnsnames.ora

MYSID- 
  (DESCRIPTION -
	(ADDRESS_LIST - 
	  (ADDRESS - (PROTOCOL-TCP) (HOST-mydnshostname) (PORT-1521))
	)
	(CONNECT_DATA - 
		(SERVICE_NAME - MYSID)
	)
  )
Situado en $ORACLE_HOME/network/admin/
Indica las formas de conexión a instancias de base de datos
  • Protocolo de conexión: TCP
  • Dirección IP
  • Puerto
  • SID
Equivalen a la lista de conexiones de SQLDeveloper

Conexiones sin tnsnames.ora

No es necesario cambiar el fichero tnsnames.ora para conectarse a un servirdor remoto, aunque puede ser recomendable. Ejemplo: varios scripts usan un nombre de conexión, de forma que pueda cambiarse fácilmente.
sqlplus username/password@host:port/sid

Ejecucuón de SQL desde la shell

El comando sqlplus puede ejecutarse desde la shell. Lee las órdenes SQL desde la entrada estándar.

Ejemplo heredoc


sqlplus -S alumno/alumno <<HEREDOC
set autocommit off
create table prueba (un-atributo int);
insert into prueba values (1);
insert into prueba values (2);
rollback;
HEREDOC 

Consultas a fichero

Puede enviarse la salida a un fichero.

sqlplus -S alumno/alumno <<HEREDOC
set autocommit off
insert into prueba values(1);
insert into prueba values(2);
spool prueba.txt 
select * from prueba;
spool off
rollback;
HEREDOC

less prueba.txt

Formateo básico de la aslida

Tiene algunas facilidades para formatear la salida (por ejemplo, para generar ficheros CSV).

sqlplus -S sys/alumno as sysdba <<HEREDOC 
set solsep ','  -- sapara solumnas con una coma 
set pagesize 0  -- sin repetición de las cabeceras de las filas
set trimspool on -- Elimina los espacios en blancos 
set headsep off --  Quizas no sea muy útil 
set linesize 1000 -- Ancho de la página

spool tablas.csv 

select table_name, tablespace_name 
  from all_tables
  where owner = 'SYS'
	and tablespace_name is not null;
spool off
HEREDOC   

Script SQL para sqlplus

sqlplus también puede leer script de SQL con @.

sqlplus -S sys/alumno as sysdba << HEREDOC
@/camino/al/fichero.sql 
HEREDOC

Arranque y parada

dbstart y /etc/oratab

Oracle proporciona el script dbstart para arrancar instancias de base de datos, se guía por el comando de /etc/oratab Por alguna razón,

  • no levanta el listener
  • no hace startup open, así que no se registra en el listener
  • se puede modificar el script para que lo haga
asir:/var/oracle/product/18.0.1/asir_bbdd: Y

Ejecutar Oracle al iniciar el sistema

Cada sistema operativo tiene sus formas de arrancar servicios/demonios al inicio

  • Windows Servicios
  • Linux
    • systemd: Ficheros en el directorio /etc/systemd/system. Se controla con la orden systemctl
    • rc init: Se basaba en scripts en los directorios /etc/rc.*. Se está reemplazando por systemd

systemd

Los servicios se crean con ficheros en /etc/systemd/system (entre otros)

  • Dependen de otros ficheros (After)
  • Otros servicios dependen de ellos (WantedBy)
  • Se puede elegir el usuario que lo lanza (User)
[Unit]
Description=Oracle 
After=network.target 

[Service]
Type=forking 
User=alumno
ExecStart=/home/alumno/oracleInit.sh
ExecStop=/home/alumno/oracleStop.sh 

[Install]
WantedBy=multi-user.target
Más información con man systemd.service y man systemd.unit

Dependencias de la sección Unit

Si el servicio A ... A intenta arrancar B Si se apaga B, A también A arranca si B está inicialmente apagado Si falla arranque de B, arranca A
BindsTo=B No
Requires=B No* No
Requisite=B No No No No
Wants=B No
Fuente: freedesktop
[*] Si B se apaga examplícitamente, se apaga A. Si el servicio B termina sin error, no se apaga A.

Dependencias de la sección Install

Si el servicio A

WantedBy=B Equivalente a que B indique Wants=A
RequiredBy=B Equivalente a que B indique Required=A

Controlar el arranque de servicios

Habilitar/deshabilitar un servicio al inicio del sistema. systemctl enable SERVICIO systemctl disable SERVICIO

Arrancar o parar un servicio

systemctl start SERVICIO systemctl stop SERVICIO

Recargar ficheros

Si se crean nuevas unidades, no se tienen en cuenta automáticamente, se necesita systemctl daemon reload

Servicios de usuario

El comando systemctl se ejecuta con el parámetro system por defecto

  • Servicios de sistema.
  • Si se ejecuta con user se usan los servicios del usuario llamante
  • Sus unidades están en $HOME/.config/systemd/user/
  • Runlevels y targets

    Runlevel Target Alias
    0 poweroff.target runlevel0.target
    1 rescue.target runlevel1.target
    3 multi user.target runlevel3.target
    5 graphical.target runlevel5.target
    6 reboot.target runlevel6.target

    Utilidades systemd

    • systemd analyze plot: Tiempo de carga de cada servicio
    • systemd analyze dot: Fichero con todas las dependencias. Puede convertirse en SVG con dot Tsvg o nombre dibujo.svg
    • systemctl list dependencies: Servicios necesarios para cargar un servicio. Se pueden listar a la inversa con reverse

    Operaciones periódicas

    Los sistemas operativos aportan formas para ejecutar tareas periódicamente

    • Windows: tiene las tareas programadas
    • Linux: tiene el sistema cron y systemd

    cron

    Es un servicio que:

    • Lee el fichero /etc/crontab
    • Ejecuta las órdenes descritas en ese fichero
    • Más información en la Wikipedia
    Suele utilizar el comando run parts
    • Este comando ejecuta todos los comandos de un directorio
    • Más info con man run parts

    systemd

    Más información en man systemd.timer y man systemd.time

    [Unit]
    Description=Print date into /tmp/date file 
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/sh -c '/usr/bin/date >> /tmp/date'
    /etc/systemd/system/date.service
    [Unit]
    Description=Run date.service every 10 minutes 
    
    [Timer]
    OnCalendar=*:0/10
    
    /etc/systemd/system/date.timer

    Operaciones periódicas manuales

    Se puede crear un bucle infinito con sleep, el bucle se interrumpe con alguna condición externa, por ejemplo, que exista o deje de existir un fichero.

    #!/bin/bash 
    em $HOME/bucledebeparar 
    continua(){
    	if [ -e $HOME/bucledebeparar ]
    	then 
    		return 1
    	else
    		retunr 0 
    	fi
    }
    SEGUNDOS=5
    sleep $SEGUNDOS
    white continua 
    do 
    	echo Han pasado $SEGUNDOS segundos 
    	sleep $SEGUNDOS
    done
    

    Acerca de mi.

    Bienvenido a la extensión HC Learning Web de Human Computing 3.0, es el sitio web donde encontrarás diversas formas de crecer y desarrollarte sin dificultad, siguiendo los pasos descritos. Aquí mantenemos la información de interés y cuidando la sencilles para que sea fácil y sencillo de seguir. Es hora de empezar.
    Adelante. Inicio