Archive for the Tuning Category

Sea un Heroe, sea proactivo!

Comiésemos este año nuevo con una nueva mentalidad, o una resolución de año nuevo si quieres pensarlo de ese modo, dejemos de ser reactivos y empecemos a ser proactivos. Ser proactivo va a ayudarlo a reducir sus costos en administración de base de datos,  incrementar tu nivel de eficiencia, ayudarte a cumplir más fácilmente los SLA’s y lo que es mejor salvar tus horas de sueño cuando estés de turno.

¿Porque chequear los problemas solamente cuando estos ya son críticos, o cuando ya es muy tarde y la base de datos ya está abajo o congelada,  o lo que es peor,  cuando los usuarios ya están gritando?

Ser proactivo es la mejor manera de mantener tu base de datos saludable y de mostrarle a tu empresa o tus clientes que tu realmente te preocupas por ellos.

No sé porque, pero muchos DBA’s gastan la mayoría de su tiempo siendo bomberos solamente (puro apagando incendios) arreglando problemas o trabajando en requerimientos de los usuarios. Este tipo de mentalidad o comportamiento va solamente traer como resultado, miles de dólares en horas extras (si es que te las pagan), varias horas sin sistema para los usuarios, baja performance de las aplicaciones y lo que es peor de todo, varios usuarios insatisfechos que pensaran que tú no tienes el conocimiento necesario para estar a cargo de su data.

Mencionemos un pequeño ejemplo, tienes configurado el alarma del área de archive logs en que se dispare cuando este en un 95% lleno, y esto ocurre en la mitad de la noche, algunos DBA’s van a tomar este alerta seriamente y lo arreglaran de inmediato, otros esperaran hasta el día siguiente para resolverlo ya que o están muy cansados y dormidos, o no tienen en ese momento acceso a internet para resolverlo. Hubiera sido mucho mejor y más fácil si en vez del alerta estar configurado en un nivel crítico solamente, haberlo puesto con un monto mas proactivo como por ejemplo un 75% o un 85%, o lo que hubiera sido aun mejor, haber mirado la salud de tu DB antes de haberte ido del trabajo para detectar y resolver cualquier posible problema antes que fuera un problema real o para planear como solucionarlo a tiempo antes de que te despierten en la mitad de la noche o te interrumpan durante el fin de semana (Acuérdate siempre que tu tiempo personal y familiar es lo más importante que tienes y siempre debes de trabajar en pro de protegerlo y cuidarlo). A mí personalmente siempre me gusta recomendar a los DBA’s que corran 2 checklists diarios, uno a principio de su jornada laboral y otro al final de esta.

Yo conozco a muchos DBA’s que reclaman todo el tiempo que no tienen vida, ya que se vuelven locos cuando están de turno por el volumen de llamados y de las interrupciones que ocurren durante los fines de semana y noches. Pero esto solamente les ocurre porque ponen su atención y tiempo en solucionar los síntomas y no los problemas de raíz o si no es posible, en tomar medidas proactivas para protegerse.

Ser proactivo no solamente lo ayudara a obtener una mejor calidad de vida, también lo ayudara a detectar puntos de mejora en: performance, seguridad o quién sabe, simplemente evitar un posible desastre futuro antes que cualquier otra persona lo haya detectado.

Aquí podrás encontrar un script de checklist que podrás usar como ejemplo para ayudarte a hacer tu vida un poco mas fácil (Este no es mi script completo, pero muy bueno para empezar). Este script es una compilación de varios scripts de checklist y tu podras modificar facilmente  las variables (thresholds) segun tus necesidades, pero eso si, acuerdese siempre de tener una baseline con que compararlo.

Como mencionado antes, este script no solamente lo ayudara a Ud. A detectar problemas actuales o futuros, pero también lo ayudara a detectar futuros requerimientos de tuning también.

Aquí está un ejemplo de lo que sería la primera parte del reporte generado por el script:

– ———————————————————————– –
– Oracle Instance Information
– ———————————————————————– –
Cpu_Count                                    4   |      Host_Name              OLIVER
Instance_Name                        prod   |      Database_Status      ACTIVE
Status                                     OPEN   |     Startup_Time          10-01-2009 19:50
Version                            11.1.0.7.0   |      Instance_Role          PRIMARY_INSTANCE
Database Space (Mb)           36604    |      SGA (Mb)                 511
Nb. Datafiles                               43    |     Nb. Tempfiles           1

Archive destination LOCATION=E:\oracle\oradata\prod\archive
Database log mode ARCHIVELOG
Background Dump Dest d:\oracle\diag\rdbms\prod\prod\trace
Spfile D:\ORACLE\PRODUCT\11.1\PROD\DATABASE\SPFILEPROD.ORA
Redo size (Kb) 102400

– ———————————————————————– –
– Instance CheckList –
– ———————————————————————– –
Instance Status                                  OK    |      Listener Status      OK
– ———————————————————————– –
– Performance Memory CheckList –
– ———————————————————————– –
Total Sessions < 700                           OK - 19
Active sessions number <15                 OK - 9
Data Buffer Hit Ratio > 80                   OK - 97
L.Buffer Reload Pin Ratio > 99           OK - 99
Row Cache Miss Ratio < 0.015            NO - 1.351
Dict.Buffer Hit Ratio > 80                    OK - 99
Log Buffer Waits = 0                            NO - 110
Log Buffer Retries < 0.0010                 OK - 0
Switch number (Daily Avg) < 5            OK - 1
Jobs Broken = 0                                   OK 0
Shared_Pool Failure = 0                     OK - 0
– ———————————————————————– –
– Storage CheckList                                            –
– ———————————————————————– –
Dba_Tablespaces Status                     OK   |       V$Log Status             OK
V$Datafile Status                                OK   |       V$Tempfile Status   OK
V$Recover_File                                  OK   |       V$Recovery_Log      OK
Tablespace in Backup Mode = 0        OK - 0
Tablespace < 95%                              OK- 0
Objects Invalid = 0                              NO - 147
Indexes unusable = 0                          OK - 0
Trigger Disabled = 0                            NO- 5
Constraint Disabled = 0                       NO - 2
Objects close max extents = 0             OK - 0
Objects can not extent = 0                  NO - 552
User Objects on Systems = 0               NO - 26
FK Without Index = 0                          NO - 138
– ———————————————————————– –
– Datagard CheckList                                          –
– ———————————————————————– –
Datagard Errors = 0                             OK- 0
Datagard Gap = 0                               OK - 0
Archives not Aplied < 5                       OK - 2
– ———————————————————————- –
– Installed options :
– ———————————————————————- –
- Objects option
- Connection multiplexing option
- Connection pooling option
- Database queuing option
- Incremental backup and recovery option
- Instead-of triggers option
- Parallel load option
- Proxy authentication/authorization option
- Plan Stability option
- Coalesce Index option
- Transparent Application Failover option
- Sample Scan option
- Java option
- OLAP Window Functions option

Ud. También podrá encontrar varios productos que lo podrán ayudar a monitorear y configurar sus alertas de una forma proactiva, tales como: Grid Control (Oracle), Enterprise Manager (Oracle), Insider (FourthElephant), Spotlight (Quest), entre muchos otros más disponibles en el mercado y también caso sea su preferencia, utilizar sus propios scripts para esta finalidad. La idea es siempre usarlos de una forma proactiva, nunca reactiva.

Por eso cambiemos nuestra mentalidad y dejemos de ser bomberos para comenzar a ser realmente héroes.

Mucha suerte,

Francisco Muñoz Alvarez

Script CheckList.sql para verificar status de Instancia

prompt
prompt
prompt ################################################################################
prompt
prompt
prompt By Mohit sharma
prompt mohit.sharma@india.com
prompt
prompt Edited By
prompt juanpuga@gmail.com
prompt
prompt ################################################################################

set linesize 132
set pagesize 1000

spool report.txt

prompt #### Up Time ####

select ‘Hostname : ‘ || host_name
,’Instance Name : ‘ || instance_name
,’Started At : ‘ || to_char(startup_time,’DD-MON-YYYY HH24:MI:SS’) stime
,’Uptime : ‘ || floor(sysdate - startup_time) || ‘ days(s) ‘ ||
trunc( 24*((sysdate-startup_time) -
trunc(sysdate-startup_time))) || ‘ hour(s) ‘ ||
mod(trunc(1440*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ minute(s) ‘ ||
mod(trunc(86400*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ seconds’ uptime
from sys.v_$instance;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> Object status

select object_type,status,count(*) cnt from user_objects group by object_type,status;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> Invalid objects

select owner, object_type, substr(object_name,1,30) object_name
from sys.dba_objects
where status=’INVALID’
order by object_type;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Recover files

select * from sys.v_$recover_file;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> partitioned table

select table_name from user_tables where partitioned=’YES’;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> Free space in Tablespace

Select tablespace_name,sum(bytes/1024/1024) from sys.dba_free_space group by tablespace_name;
prompt
prompt
prompt ################################################################################

prompt .>>>>>>Max Extents Status

select segment_name, segment_type, extents, max_extents from sys.dba_segments where max_extents-extents<100;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> Any partitioned Object approaching to max extents

SELECT PARTITION_NAME,EXTENTS,MAX_EXTENTS,NEXT_EXTENT,max_extents-nvl(next_extent,0) FROM sys.dba_segments
where max_extents-nvl(next_extent,0) < 1000
and partition_name is not null;
prompt
prompt
prompt ################################################################################

prompt .>>>>>> Block Contention

SELECT class,sum(count) total_waits, sum(time) total_time FROM v$waitstat GROUP BY class;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Latch Contention

SELECT a.name,100.*b.sleeps/b.gets ratio1,100.*b.immediate_misses/decode((b.immediate_misses+b.immediate_gets),0,1) ratio2
FROM v$latchname a, v$latch b WHERE
a.latch# = b.latch# AND b.sleeps > 0;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Top 10 Queries using more disk reads

select disk_reads,sql_text from v$sqlarea where disk_reads>10000 and rownum < 11 order by disk_reads desc;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Top 10 Queries using more buffer reads

select buffer_gets,sql_text from v$sqlarea where buffer_gets>10000 and rownum < 11 order by buffer_gets desc;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> buffer cache hit ratio

select (1- (sum(decode(a.name,’physical reads’,value,0)))/
(sum(decode(a.name,’db block gets’,value,0)) +
sum(decode(a.name,’consistent gets’,value,0)))) * 100 pct
from v$sysstat a;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Reloads/Pins in v$librarycache

select sum(pins) “executions”,sum(reloads) “cache Misses”,sum(reloads)/sum(pins)*100 “Ratio” from v$librarycache;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Get miss ratio from v$rowcache

select (sum(getmisses)/sum(gets)) * 100 “Hit Ratio” from v$rowcache;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> Redo log space request ratio in v$systat

select (req.value*5000)/entries.value “ratio”
from v$sysstat req,v$sysstat entries
where req.name=’redo log space requests’ and entries.name=’redo entries’ ;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> RBS Contention

select sum(waits)/sum(gets)*100 from v$rollstat;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> sorts stats

Select * from v$sysstat where name like ‘%sorts%’;

prompt
prompt
prompt ################################################################################

prompt .>>>>>> datafiles I/O

select name, phyrds, phywrts from v$datafile df, v$filestat fs where df.file# = fs.file# order by phyrds;

prompt
prompt
prompt
prompt

spool off

Hot Blocks

PROMPT
PROMPT ******************************************** HOT BLOCKS **********************************************************************************************

SELECT inst_id, CHILD, ADDR, GETS, MISSES, SLEEPS
FROM (select inst_id, CHILD#  CHILD, ADDR, GETS, MISSES, SLEEPS
      from gv$latch_children
      where name = ‘cache buffers chains’
      order by 6 desc)
WHERE ROWNUM < 11;

select /*+ RULE */
  e.owner||’.'||e.segment_name  segmento, e.extent_id  extent#, x.dbablk - e.block_id + 1  block#, x.tch hits, l.child#
from
  sys.gv$latch_children  l, sys.x$bh  x, sys.dba_extents  e
where
  x.hladdr  IN (SELECT ADDR
                FROM (select ADDR, SLEEPS
                      from gv$latch_children
                      where name = ‘cache buffers chains’
                      order by 2 desc)
                WHERE ROWNUM < 11) and
  e.file_id = x.file# and
  x.hladdr = l.addr and
  x.dbablk between e.block_id and e.block_id + e.blocks -1
  order by x.tch desc ;

Hot Recursos

PROMPT ******************************************** HOT RESOURCES

SET FEEDBACK OFF

COLUMN y new_value sid NOPRINT
SELECT name||’_'||TO_CHAR(sysdate, ‘ddmonyyhh24miss’) y FROM v$database;

SPOOL hot_&sid..txt

SELECT inst_id, sid, event, p1 file_number, p2 block_number, p3 razon
FROM gv$session_wait
WHERE event LIKE ‘buffer busy%’;

SELECT inst_id, w.sid, w.event, p3 razon, w.wait_time, w.seconds_in_wait, w.state, e.owner||’.'||e.segment_name segmento, e.segment_type tipo, e.partition_name
FROM gv$session_wait w, dba_extents e
WHERE w.event LIKE ‘buffer busy%’ AND
      w.p1 = e.file_id AND
      w.p2 BETWEEN e.block_id AND e.block_id + e.blocks - 1;
     
SELECT inst_id, w.sid, w.event, p3 razon, w.wait_time, w.seconds_in_wait, w.state, s.owner||’.'||s.segment_name segmento, s.segment_type tipo, s.freelists
FROM gv$session_wait w, dba_segments s
WHERE w.event LIKE ‘buffer busy%’ AND
      w.p1 = s.header_file AND
      w.p2 = s.header_block;

SPOOL OFF

SET FEEDBACK ON

Informacion sobre Checkpoints

PROMPT
PROMPT ******************************************** CHECKPOINT **************************************************************

PROMPT
PROMPT ******************************************** PARAMETROS CONFIGURADOS

SELECT inst_id, name parametro, DECODE(type,1,’boolean’,2,’string’,3,’integer’) type, value valor, description
FROM gv$parameter2
WHERE name LIKE ‘log_checkpoint%’ OR
      name LIKE ‘fast_start_%_target’ OR
      name = ‘db_block_max_diry_target’
ORDER BY 2,1;

SELECT MAX(lebsz) “Bloque de Redo Log”
FROM sys.x$kccle;

SELECT a.inst_id, a.value “PHYSYCAL WRITES”, b.value “PHYSICAL WRITES NON CHECKPOINT”, a.value - b.value ckpt_block_writes, 100*(a.value - b.value)/a.value “% CKPT_BLOCK_WRITES”
FROM gv$sysstat a, gv$sysstat b
WHERE a.name = ‘physical writes’ AND
      b.name = ‘physical writes non checkpoint’ AND
      a.inst_id = b.inst_id
      ORDER BY 1;

PROMPT
PROMPT ******************************************** LOG SWITCHS

SELECT c.thread#, MAX(s.sequence#) “STARTUP SEQUENCE”, c.sequence# “CURRENT SEQUENCE”, c.sequence# - MAX(s.sequence#) log_switchs
FROM (SELECT thread#, sequence# FROM v$log WHERE status=’CURRENT’) c,
     (SELECT thread#, sequence# FROM v$log_history h WHERE first_time < (SELECT startup_time FROM gv$instance WHERE thread# = h.thread#)
      UNION ALL
      SELECT thread#, sequence# FROM v$log l WHERE first_time < (SELECT startup_time FROM gv$instance WHERE thread# = l.thread#)) s
WHERE c.thread# = s.thread#
GROUP BY c.thread#, c.sequence#;

SELECT inst_id, name, value
FROM gv$sysstat
WHERE name LIKE ‘background checkpoints%’ OR
      name = ‘redo log space requests’
UNION ALL
SELECT inst_id, event, total_waits
FROM gv$system_event
WHERE event = ‘log file switch completion’
ORDER BY 2,1;

PROMPT
PROMPT ******************************************** ESPERAS POR LOG SWITCH

SELECT inst_id, event evento, total_waits esperas, total_timeouts timeouts, average_wait promedio
FROM gv$system_event
WHERE event LIKE ‘log file switch (%’
ORDER BY event, 1;

PROMPT
PROMPT ******************************************** MTTR TARGET ADVICE

SELECT * FROM gv$mttr_target_advice
ORDER BY 1;

PROMPT
PROMPT ******************************************** RECUPERACION DE INSTANCIA

SELECT inst_id, recovery_estimated_ios, target_mttr, estimated_mttr, ckpt_block_writes
FROM gv$instance_recovery
ORDER BY 1;

|