sábado, 27 de diciembre de 2008

ORACLE. Comandos Linu

Cualquier DBA sabe que necesita interaccionar con el sistema operativo tanto para el tuning de la base de datos, así como para administrarla.

Aquí pongo una lista de los comandos que yo utilizo, que seguro que son pocos y que espero con el tiempo de ampliar, así que cualquier comentario será bueno:

  • ps -fu oracle. Listado de los procesos pertenecientes al usuario oracle
  • ps -ef. Listado completo de los procesos actuales
  • sysctl -p. Carga los parámetros del Kernel definidos en /etc/sysctl.conf
  • sysctl -a. Lista de los parámetros actuales del kernel.
  • lsof -p . Listado de los ficheros actualmente en uso por un proceso PID
  • lsof -u oracle. Listado de los ficheros actualmente en uso por el usuario oracle
  • free -tlos 10 -c 15. Lista cada 10 segundos y 15 iteraciones el uso de la memoria (física y swap).

lunes, 24 de noviembre de 2008

ORACLE . Crear nuevo tablespace temporal (Temporary) por defecto

Para reducir un tablespace TEMPORAL por defecto (default temporary tablespace), los pasos son:
1. Crear un nuevo tablespace temporal

CREATE SMALLFILE TEMPORARY TABLESPACE "TEMP2" TEMPFILE '/mibd/temp03.dbf' SIZE 512M AUTOEXTEND ON NEXT 25M MAXSIZE 2G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

2. Establecer el nuevo tablespace como default temporary tablespace

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP2"

3. Poner todos los datafiles del tablespace original como OFFLINE.

ALTER DATABASE TEMPFILE '/mibd/temp01.dbf' OFFLINE;

4. Borrar tablespace anterior y los ficheros asociados

DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

5. Realizar copia archivo de control a traza (opcional per muy recomendado)

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

Y ya está,
Juan

viernes, 14 de noviembre de 2008

ORACLE. Saber usuario conectado ( whoami )

Para saber el usuario conectado, algo como whoami de linux, podemos:
  1. select user from dual;
  2. show user;
y ya está !!!!!

miércoles, 12 de noviembre de 2008

LINUX. Gestión de Procesos en 2º plano (parar, continuar, eliminar)

Muchas veces enviamos un comando a 2º plano con & (command &) y va funcionando,
pero que pasa si queremos parar momentaneamente. Para hacerlo utilizaremos [kill].

Kill nos ofrece diferentes opciones:
  • kill -CONT => Continua con la ejecución
  • kill -STOP => Para la ejecución, pero no lo elimina
  • kill -9 => Eliminar la ejecución

Saludos,

Juan

lunes, 3 de noviembre de 2008

ORACLE. Cargar ficheros textos ASCII

Para cargar un fichero de texto ASCII en Oracle, utilizaremos sqlldr y:
  • Fichero de Entrada (Input file) que son los que contienen los datos,
  • Fichero de configuración (Control file, control= ) que son los que definen la estructura del fichero de entrada y que hacer con los registros
  • Fichero de resultado  y errores (Log file)
  • Fichero de registros erroneos (Bad File), es decir, registros que incumplen la integridad.
  • Fichero de registros rechazados (Reject file), es decir, registros que incumplen una cierta condición.
Ejemplos: Cargar los empleados en la tabla emp, siendo la longitud variables 
                                  y separados por coma

load data
infile 'datos.txt'
into table empleados
fields terminated by "," optionally enclosed by '"'   
( codigo, nombre, salario, departamento )

Ejemplos: Cargar los empleados en la tabla emp, siendo la longitud variables 
                                  y separados por coma

load data
infile 'datos.txt'
into table empleados
fields terminated by "," optionally enclosed by '"'   
( codigo, nombre, salario, departamento )

viernes, 31 de octubre de 2008

CRYSTAL REPORTS. Pasar valores de un subinforme a un informe

Para pasar valores de un subinforme a un informe lo que tenemos que hacer es:

1. Crear una fórmula en el subinforme llamada valor_a_pasar con el siguiente código:
WhileprintingRecords; //Es opcional
Shared Numbervar Valor;
Valor=;

2. Crear una fórmula en el informe principal llamada valor_a_recoger con el siguiente código;
WhileprintingRecords; //Es opcional
Shared Numbervar Valor;

Si queremos utilizar el valor, solo tenemos que utilizar la fórmula {@valor_a_recoger} y ya está.

Saludos,

Juan

CRYSTAL REPORTS. Gráficos multieje

En epocas como esta a lo mejor queremos tener un mismo gráfico la cotización del petroleo y la del dolar/euro. Ambos valores tienen diferente escala (petroleo>70, dolar<1,4) por lo que este último se verá como una línea casi sin movimientos.

Para verlo solo tenemos que seleccionar "Dual Axes" en "Chart Option Axes" y ya está !!!!

CRYSTAL REPORTS. Contador manual con ordenación Top N / Botton N

Muchas veces generamos grupos y lo que queremos es que nos diga SOLO los 5 mejores o peores y al pie la suma total.

Si nos fijamos la suma, es incorrecta ya que se realiza antes de que nos quedemos con los registros que queremos.

Para solucionarlo hay que crear un contador manual, siguiento los siguientes pasos:

1. Crear formula que nos sume:
Whileprintingrecords;
Local Numbervar Sumatorio;
if groupnumber <= 5 then Sumatorio:=Sumatorio+

2. Crear formula que nos muestre el valor y situarla en el pie del grupo:
Whileprintingrecords;
Local Numbervar Sumatorio;

3. Crear formula que nos resetee el valor y situarla en el encabezado de forma oculta:
Whileprintingrecords;
Local Numbervar Sumatorio:=0;

Y ya está!!!

sábado, 6 de septiembre de 2008

ORACLE. Como ejecutar un comando del S.O. desde SQLPLUS

Hay veces que hemos necesitado ejecutar un comando del s.o.
estando en sqlplus, podemos hacerlo de dos formas:

1. Dentro de sqlplus: host
2. Saliendo momentaneamente de sqlplus: ! + + + exit

Y ya está !!!!

miércoles, 3 de septiembre de 2008

ORACLE. MTTR y recuperación rápida

Es aconsejable para que la recuperación de nuestra instancia sea más rápida y sobre todo controlada, establecer un valor al parámetro FAST_START_MTTR_TARGET con un valor entre 1 y 3600 (1h).

Este parámetro establece el tiempo máximo de recuperación en segundos después de un inicio de recuperación de una instancia (http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams068.htm#sthref192).

En mi caso yo lo tengo a 5 minutos, para tampoco no notarlo en el rendimiento:

alter system set fast_start_mttr_target = 300;

Este valor no debería de ser superior al que Oracle tiene estimado, pues entonces no se tendría en cuenta y no nos serviría de mucho. Ver ambos valores es facil con:

select target_mttr, estimated_mttr from v$instance_recovery;

Es aconsejable desactivar los antiguos parámetros que gestionaban el MTTR:

alter system set log_checkpoint_interval = 0;
alter system set log_checkpoint_timeout = 0;
alter fast_start_io_target = 0;



Más info también en http://www.akadia.com/services/ora_checkpoint_tuning.html

ORACLE. Variables de entorno

Dentro de cualquier entorno Oracle podemos encontrar algunas de las siguientes variables de entorno.
  1. ORACLE_HOME: Directorio raiz donde el software de Oracle está instalado.
  2. ORACLE_SID: Instancia a la que el usuario quiere conectarse.
  3. ORACLE_BASE: Directorio raiz donde se encuentran los diferentes software de Oracle se han instalado.
  4. ORA_NLS10 / ORA_NLS33: En entornos con multiples versiones de Oracle, directorio raiz donde se encuentran los ficheros NLS.
  5. TNS_ADMIN: Directorio raiz donde los ficheros de configuración de Oracle Net se encuentran.
  6. TWO_TASK: Cadena de conexión por defecto si el usuario no la define.
  7. LD_LIBRARY_PATH: Directorio raiz donde se encuentran las librerías compartidas de objetos.
  8. NLS_LANG: Define el idioma, territorio y el set de caracteres (substituye a las tres siguientes). Ver (http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm)
  9. NLS_LANGUAGE: Define el idioma
  10. NLS_TERRITORY: Define el territorio
  11. NLS_CHARACTERSET: Define el juego de caracteres.

lunes, 18 de agosto de 2008

ORACLE. Sizing Undo

Tamaño (en Kb): Undo Retention (en segundos) * Undo per second * DB_BLOCK_SIZE

Undo Retention = Tiempo de Undo necesario
Undo per second = Numéro de bloques undo generados por segundo ( SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;)
DB_BLOCK_SIZE = Tamaño de bloque (show parameter DB_BLOCK_SIZE)

jueves, 7 de agosto de 2008

ORACLE. Mover datafile

Para mover un datafile que no pertenece ni ha SYSTEM ni a los redo log, los pasos a hacer es:

connect sys/password as sysdba
alter tablespace mi_tablespace offile;
alter tablespace mi_tablespace rename datafile 'path_anterior' to 'path_nuevo';
!mv 'path_anterior' 'path_nuevo'
alter tablespace mi_tablespace online;

Vistas interesantes
v$tablespace
v$datafile -> select df.name from v$datafile df, v$tablespace ts where df.ts#=ts.ts# and ts.name='mi_tablespace';

lunes, 26 de mayo de 2008

LINUX: Control RAID fisico discos

En mi caso, para poder gestionar el RAID 1 de discos de mi máquina y el estado del mismo utilizo mpt-status.

Esta utilidad es buena para ver el estado de salud del mismo, sobre todo cuando tenemos un error como este:

Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: PhysDisk is now missing
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: PhysDisk is now missing, out of sync
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: volume is now degraded, enabled
Jun 26 11:22:43 my_host kernel: klogd 1.4.1, ---------- state change ----------
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: PhysDisk is now online, out of sync
Jun 26 11:22:49 my_host kernel: sdb : READ CAPACITY failed.
Jun 26 11:22:49 my_host kernel: sdb : status=0, message=00, host=1, driver=00
Jun 26 11:22:49 my_host kernel: sdb : sense not available.
Jun 26 11:22:49 my_host kernel: sdb: Write Protect is off
Jun 26 11:22:49 my_host kernel: sdb: Mode Sense: 00 00 00 00
Jun 26 11:22:49 my_host kernel: sdb: asking for cache data failed
Jun 26 11:22:49 my_host kernel: sdb: assuming drive cache: write through
Jun 26 11:22:49 my_host kernel: sd 0:1:1:0: Attached scsi disk sdb
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: volume is now degraded, enabled, resync in progress

Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: PhysDisk is now online
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: volume is now optimal, enabled, resync in progress
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: volume is now optimal, enabled



Para instalarlo solo hay que descargarse el rpm de http://rpmfind.net/linux/rpm2html/search.php?query=mpt-status y ejecutar

rpm -i -v mpt-status-1.2.0-72.i586.rpm

Una vez tenemos el paquete hay que:
  1. Crear el dispositivo /dev/mpctl, cargando el modulo en el kernel (#modprobe mptctl)
  2. Añadir "install mptctl" en "/etc/modprobe.conf.local" para que se cargue el módulo al iniciar.

Para ver en que estado nuestro raid, solo hay ejecutar mpt-status -s y si todo va bien, nos saldrá:

my_host:/ # mpt-status -s

log_id 0 OPTIMAL

phys_id 1 ONLINE

phys_id 0 ONLINE

En caso contrario, en /var/log/messages encontraremos log sobre lo que nos está sucediendo o bien haciendo una query al raid mediante mpt-status.

sábado, 24 de mayo de 2008

LINUX: Ejemplo script iptables para firewall

Después de pelearme un poco con esto de iptables, he montado este pequeño script para un firewall.

Este firewall tiene 2 accesos a Internet balanceadas entre ella con iproute2.

Como tal el script utiliza 2 ficheros de configuración (/etc/firewall/acceso.web y /etc/firewall/acceso.ftp.inet2dmz) donde de pueden poner los nombre de los diferentes host/ordenadores y a que lugar pueden ir.

Aunque script funciona para la web, es MUY ACONSEJABLE utilizar squid como servidor de proxy, ya que permite mejor control y gestión.

Para la gestión del log de iptables, existen soluciones freeware que permiten estadisticas y demás.

#Funcion para dar acceso
#Parámetros $1=Origen $2=Interface desde la que accede el origen
# $3=Destino $4=Interface a través de la cual se llega al destino
# $5=Protoco $6=Puerto de destino
function Acceso {
if $iptables -A FORWARD -s $1 -i $2 -d $3 -o $4 -p $5 --dport $6 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
fi

if $iptables -A FORWARD -d $1 -o $2 -s $3 -i $4 -p $5 --sport $6 -m state --state ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
fi
}

function AccesoWEB {

#Estructura de cada registro ,,...,,
for registro in `grep -v "^#" /etc/firewall/accesos.web`
do
CAMPOS=`echo $registro | awk -f /etc/firewall/contador.awk`
ULTIMOORIGEN=`expr $CAMPOS - 1`
for cont in `seq 1 $ULTIMOORIGEN`
do
ORIGEN=`echo $registro | cut -f $cont -d ","`
DESTINO=`echo $registro | cut -f $CAMPOS -d ","`
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp https
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp https
done
done
}

function AccesoFTP {
for registro in `grep -v "^#" $1`
do
ORIGEN=`echo $registro | cut -f 2 -d ","`
DESTINO=`echo $registro | cut -f 3 -d ","`
echo origen $ORIGEN dev_origen $2 destino $DESTINO dev_destino $3
Acceso $ORIGEN $2 $DESTINO $3 tcp 20
Acceso $ORIGEN $2 $DESTINO $3 tcp 21
done
}

function AccesoFTP_INET2DMZ {
#Estructura de cada registro ,,
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET1 $DEV_DMZ
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET2 $DEV_DMZ
}

function AccesoADMIN {
$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p tcp --dport ssh -j ACCEPT
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p tcp --sport ssh -j ACCEPT

$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2

Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp http
Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp https
AccesoPING $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1

Acceso $1 $DEV_LAN $FTP_SERVER $DEV_DMZ tcp ssh
AccesoPING $1 $DEV_LAN $FTP_SERVER $DEV_DMZ

$iptables -A FORWARD -s $1 -p icmp -j ACCEPT
$iptables -A FORWARD -d $1 -p icmp -j ACCEPT

$iptables -A INPUT -s $1 -p icmp -j ACCEPT
$iptables -A OUTPUT -d $1 -p icmp -j ACCEPT
}

function LOG_NoDeseado {
$iptables -A INPUT -p udp ! --dport 137:138 -j LOG
$iptables -A INPUT -j LOG
$iptables -A OUTPUT -j LOG
$iptables -A FORWARD -j LOG
}

function Acceso_DNSServer {
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p tcp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p tcp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p udp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_INET1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_INET1 -p udp --sport domain -j ACCEPT
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 tcp domain
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 udp domain
}

IP_INET1=80.33.33.33
IP_INET2=80.33.34.34
IP_DMZ=10.0.2.1
IP_LAN=10.0.1.1

DEV_INET1=eth3
DEV_INET2=eth2
DEV_DMZ=eth1
DEV_LAN=eth0

NET_INET1=80.33.33.0/24
NET_INET2=80.33.34.0/24
NET_DMZ=10.0.2.0/24
NET_LAN=10.0.1.0/24

MUNDO=0.0.0.0/0

#SERVER
DNS_SERVER=10.0.1.2
FTP_SERVER=10.0.2.2
MAIL_SERVER=10.0.1.3

#COMANDOS
iptables=/usr/sbin/iptables
ifconfig=/sbin/ifconfig
route=/sbin/route

#LIMPIADO DE LAS TABLAS
$iptables -F
$iptables -Z
$iptables -X
$iptables -t nat -F

#DEFINICION POLITICA POR (DROP)
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP

#########################################################################
# D N S - Damos acceso para que los nombre de host se puedan resolver #
#########################################################################

Acceso_DNSServer $DNS_SERVER

#################################
# O T R O S A C C E S O S #
#################################
AccesoADMIN nuestro_host.nuestro_dominio

#############
# D N A T #
#############

# Acceso de Internet a nuestro servidor de correo
# --------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 25 -j DNAT --to :25
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 25 -j DNAT --to :25

# DESDE INET A FTP SERVER
-----------------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 21 -j DNAT --to :21

$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 21 -j DNAT --to :21

#Con esto permitimos el ftp pasivo
modprobe ip_nat_ftp


###################
# R O U T I N G #
###################
$iptables -A POSTROUTING -t nat -o $DEV_INET1 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_INET2 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_DMZ -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

###########
# F T P #
###########

#Con estos accesos permitimos el tráfico desde fuera a nuestro servidor
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 21

Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 21

AccesoFTP_INET2DMZ


###################
# A C C E S O S #
###################
AccesoFTP_INET2DMZ
AccesoWEB

###########
# L O G #
###########
LOG_NoDeseado

jueves, 22 de mayo de 2008

LINUX: Tuning básico

Como cualquier otro SO, Linux también necesita algún tuning básico, pues como viene de serie no aprovecha las máquinas.

Algunas de las cosas que he encontrado y probado en mis máquinas son:

1. Tuning TCP - Algunas variables del kernel (/etc/sysctl.conf)
#Tamaño máximo del buffer de recepción de red (en bytes)
net.core.rmem_max="16777216"
#Tamaño máximo del buffer de envío de red (en bytes)
net.core.wmem_max="16777216"
#Mínimo/Defecto/Máximo tamaño del buffer TCP de recepción
net.ipv4.tcp_rmem="4096 87380 16777216"
#Mínimo/Defecto/Máximo tamaño del buffer TCP de envío
net.ipv4.tcp_wmem="4096 65536 16777216"
#Desactivación retraso del inicio threshold para un cliente entre sesiones TCP
net.ipv4.tcp_no_metrics_save=1
#TTL
net.ipv4.ip_default_ttl = 77
#Determina el número de sondeos antes de que se supere el tiempo de espera
net.ipv4.tcp_keepalive_probes =5
#
Determina el tiempo de espera entre sondeos de intervalos isAlive
net.ipv4.tcp_keepalive_intvl =15
#
Determina el tiempo que debe transcurrir antes de que el TCP/IP pueda liberar una conexión cerrada y reutilizar sus recursos
net.ipv4.tcp_fin_timeout=60

Nota: Una vez echos los cambios ejecutar sysctl -q

2. Eliminación de los servicios que no utilizamos. No hay peor que dedicar el tiempo de nuestra máquina en algo que no utilizamos (samba, cups, cron, ....), asi que mejor pararlos y eliminar los links de nuestro runlevel directory (/etc/init.d/rc[345].d)

3. Dejar solo activadas 2 o 3 consolas en /etc/inittab


1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

NOTA: Una vez hechos los cambios ejecutar init q

4. Incrementar memoria
. Mediante vmstat deberiamos de mirar a intervalos diferentes en dias diferentes como funciona nuestra máquina, y ver si hay mucho swap y cuanta memoria estamos utilizando.

Mi máquina muestra lo siguiente con vmstat 5 10

5. Mejora de rendimiento de los discos
. Mediante hdparm y sdparm podemos llegar a mejorar el rendimiento de nuestros discos.

6. Activación Hyperthreading
. Si tenemos una CPU con hyperthreading por que no utilizarlo. Así que a recompilar el kernel (http://www.ibm.com/developerworks/linux/library/l-htl/)

ORACLE. Otros Backup de archivos necesarios

En esto de la informática cualquier precaución es poca, y en Oracle todabía más. En mi caso, al no utilizar por ahora RMAN, he hecho queda cada dia el cron me haga un backup/traza de mis controlfiles, así como un volcado actualizado de mi spfile a un fichero plano, para que ante cualquier situación pueda editarlo y modificarlo.

Para crear el backup/traza del los controfile solo hay que hacer:
alter database backup controlfile to trace;

Para saber donde lo guarda solo hay que buscar el ultimo fichero de traza (*.trc) dentro de user_dump (show parameter user_dump_dest).

En cuanto al SPFILE en formato plano, tan fácil como
create pfile from spfile;