Archivo

Archivo para septiembre, 2008

Mover índices a otro tablespace

Lunes, 29 de septiembre de 2008 Sin comentarios

Muchas veces para disminuir la contención de disco por I/O es necesario tener los objetos en tablespaces diferentes ya sea para data y para indices, para esto primero que todo deben existir estos tablespaces (se crean con la sentencia CREATE TABLESPACE).

Para el ejemplo los tablespaces ya existen

Tablespaces para Tabla y para Indices

Para mover objetos que no correspondan al tipo de datos que se almacena en cada tablespace, por ejemplo hay tablas que están almacenadas en tablespaces de índices y viceversa se debe determinar primero que todo identificar estos objetos, y para esto podemos usar el script

select owner, tablespace_name,segment_type, count(segment_type)
from dba_segments
group by tablespace_name,owner,segment_type
order by 1 asc

Tabla de objetos
Tabla de Objetos

Si nos fijamos bien en la tabla anterior, podemos ver que hay índices que estan en el tablespace “DATOS“, “LABORATO_DATA” y “USERS” en donde se registran 2, 11 y 31 índices respectivamente.

Ahora bien estos índices encontrados anteriormente son candidatos para que sean movidos a su ubicación correcta, es decir al tablespaces de índices “LABORATO_INDEX

Para mover estos índices a otro tablespaces se deben identificar, se puede usar la siguiente query:

select owner, tablespace_name,index_name from dba_indexes
where owner='LABORATO'
and tablespace_name in ('DATOS', 'USERS','LABORATO_DATA')
order by 2,3 asc

OBS: Aca usé el nombre del Owner y los tablespaces que había determinado anteriormente, aca dependerá de cada instancia

El resultado de los índices es el siguiente:

Indices que deben ser movidos

Una vez que ya tenemos estos indices identificados, procedemos a generar la consulta que los va a mover.

Para mover un índice de un tablespace a otro se usa la siguiente consulta:

Alter index NOMBRE_INDICE rebuild tablespace TBS_DESTINO;

OBS: El movimiento de índices (sin mover tablas) se usa para mover estos objetos de ubicación. Si uno quiere mover tablas de un tablespace a otro, necesariamente deberá mover y recrear los indices asociados a las tablas, ya que sino estos índices quedaran en estado invalido

Job de limpieza de Log de Transancciones

Lunes, 22 de septiembre de 2008 Sin comentarios

Por lo general el Log de transacciones siempre está creciendo cada cierto tiempo, dependiendo obviamente de si la BD es muy transaccional o no, es por eso que para evitar que el Log de transacciones crezca mucho y se llene el disco es mejor dejar programada una tarea que se encargue de esta labor, para esto se debe realizar lo siguiente:

1.- Detectar cual es el FileId del Log de Transacciones de la BD que deseamos automatizar. Para el ejemplo la bd se llama “BD_Amin”, para saber cual es el FileId es necesario ejecutar el comando desde el Query Analyzer

sp_helpdb BD_Amin

Lo que nos dará la siguiente salida:

Salida comando sp_helpdb

Observar que el campo “usage” indica el tipo de archivo que tiene cada base de datos, para nuestro ejemplo el tipo es “Log Only“, de aquí se obtiene el “FileId“, que será “2”

1.- Luego se debe crear un JOB desde el Sql Server Enterprise. En donde se debe tener en cuenta el “FileId” que se obtuvo en el punto 1.

El detalle del JOB será:

-- Shrink
use BD_Amin
go
checkpoint
go
dump tran BD_Amin with no_log
go
dbcc shrinkfile (2,0) --ldf

2.- Luego en la pestaña “Programaciones” se podrá ingresar la programación del JOB.-

3.- Por último revisar que en la pestaña “Notificaciones” se encuentre habilitado el campo “Escribir en el registro de sucesos de aplicación de Windows”, de esta manera podemos saber su historial.-

Saludos

Privilegios de usuarios de BD

Martes, 9 de septiembre de 2008 Sin comentarios

Este script te permite saber que permisos tienen los usuarios de BD. Es bastante util porque indica los privilegios “poderosos” que por motivos de seguridad NO deberían ser otorgados

select grantee, privilege, admin_option
from sys.dba_sys_privs
where (privilege like '% ANY %'
or privilege in ('BECOME USER', 'UNLIMITED TABLESPACE')
or admin_option = 'YES')
and grantee not in ('SYS', 'SYSTEM', 'OUTLN', 'AQ_ADMINISTRATOR_ROLE',
'DBA', 'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE',
'OEM_MONITOR', 'CTXSYS', 'DBSNMP', 'IFSSYS',
'IFSSYS$CM', 'MDSYS', 'ORDPLUGINS', 'ORDSYS',
'TIMESERIES_DBA')
/

Determinar Tablespaces fragmentados

Martes, 9 de septiembre de 2008 Sin comentarios

Este script permite ver que Tablespaces están fragmentados y el tipo de fragmentación que tiene.

SELECT dfsc.tablespace_name tablespace_name,
DECODE (
dfsc.percent_extents_coalesced,
100,
(DECODE (
GREATEST ((SELECT COUNT (1)
FROM dba_free_space dfs
WHERE dfs.tablespace_name = dfsc.tablespace_name), 1),
1,
'No Frag',
'Bubble Frag'
)
),
'Possible Honey Comb Frag'
)
fragmentation_status
FROM dba_free_space_coalesced dfsc
ORDER BY dfsc.tablespace_name;

Crecimiento mensual de una instancia

Martes, 9 de septiembre de 2008 Sin comentarios

Este script te permite ver el crecimiento de la instancia en Mb desde el último reinicio de la BD

set pagesize 50000
select to_char(creation_time, 'RRRR Month') "Mes",
sum(bytes)/1024/1024 "Crecimiento en MB"
from sys.v_$datafile
where creation_time > SYSDATE-365
group by to_char(creation_time, 'RRRR Month')

Chequeo para Sybase

Martes, 9 de septiembre de 2008 Sin comentarios

Aca dejo un pequeño script que se utiliza para realizar un monitoreo básico o chequeo de un motor de datos con Sybase.-

select getdate()
go
print "================================================"
go
print "Chequeo de Base de datos"
go
print "================================================"
go
sp_helpdb
go
print "================================================"
go
print "Uso de recursos motor de datos"
go
print "================================================"
go
sp_monitor
go
print "================================================"
go
print "Versión de Sybase"
go
print "================================================"
go
select @@version
go
print "================================================"
go
select getdate()
go

Conocer que Query hace mas Rollback

Martes, 9 de septiembre de 2008 Sin comentarios

A veces es muy necesario conocer de manera rápida que query y que sesión está generando mucho Rollback.-

Para esto hacemos

1.- Buscamos las sesiones que estan generando mucho Rollback, usa la siguiente query:

select t.*,n.NAME
from v$sesstat t,V$STATNAME n
where t.STATISTIC# = 5 --Donde 5 corresponde al # de estadistica de los rollbacks
and t.STATISTIC# = n.STATISTIC#
and value > 50

2.- Luego con el SID, se busca el HASH_VALUE, que es el identificador de cada Query dentro del motor de Oracle, para esto usar la siquiente Query:

select s.SQL_HASH_VALUE, s.*
from v$session s
where sid =

3.- Una vez que encontramos el HASH_VALUE ahora debemos encontrar la query y listo, para esto usamos la siguiente Query:

select *
from v$sql s
where s.HASH_VALUE =

Claro que hay fomas que son un poco mas elaboradas pero esta da resultado.-

Tamaño libre Tablespaces

Viernes, 5 de septiembre de 2008 Sin comentarios

Aca dejo un script que te permite saber cual es el tamaño y porcentaje libre de los tablespaces de una instancia Oracle.-

SET SERVEROUTPUT ON
SET PAGESIZE 1000
SET LINESIZE 255
SET FEEDBACK OFF
PROMPT
PROMPT Tablespaces nearing 0% free
PROMPT ***************************
SELECT a.tablespace_name,
b.size_kb/1024 SIZE_MB,
a.free_kb/1024 FREE_MB,
Trunc((a.free_kb/b.size_kb) * 100) "FREE_%"
FROM (SELECT tablespace_name,
Trunc(Sum(bytes)/1024) free_kb
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name,
Trunc(Sum(bytes)/1024) size_kb
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY 4 desc
/
PROMPT
SET FEEDBACK ON
SET PAGESIZE 18