Archive for the Tuning Category
Sea un Heroe, sea proactivo!
12. January 2009 by admin.
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 1Archive 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
Posted in Monitoreo, Tuning, Experiencia, Tutoriales, Scripts | Print | 4 Comments »
Script CheckList.sql para verificar status de Instancia
4. May 2008 by jpuga.
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
Posted in Monitoreo, Tuning | Print | No Comments »
Hot Blocks
11. April 2008 by fmunoz.
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 ;
Posted in Tuning, Scripts | Print | 1 Comment »
Hot Recursos
11. April 2008 by fmunoz.
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
Posted in Tuning, Scripts | Print | No Comments »
Informacion sobre Checkpoints
11. April 2008 by fmunoz.
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;
Posted in Tuning, Scripts | Print | 1 Comment »