,
24/jul/2009::18:25
Esto nos permite un mejor acceso a los datos y un performance ingon:
Movemos las tablas e indices a un tablespace con extents uniformes:
alter table SYSADM.PS_BR_DAD_TBL MOVE tablespace GAPPC;
alter index SYSADM.PS_BR_DAD_TBL REBUILD tablespace PSINDEXC;
alter table SYSADM.PS_GP_PI_MNL_DATA MOVE tablespace GAPPC;
alter index SYSADM.PS_GP_PI_MNL_DATA REBUILD tablespace PSINDEXC;
alter table SYSADM.PS_GPMX_SDIVAR_WA MOVE tablespace GAPPC;
alter index SYSADM.PS_GPMX_SDIVAR_WA REBUILD tablespace PSINDEXC;
Y se ejecutan las estadisticas
execute dbms_stats.gather_table_stats(ownname=> 'SYSADM', tabname=> 'PS_BR_DAD_TBL',estimate_percent=> 100 cascade=> TRUE);
execute dbms_stats.gather_table_stats(ownname=> 'SYSADM', tabname=> 'PS_GP_PI_MNL_DATA',estimate_percent=> 100 cascade=> TRUE);
execute dbms_stats.gather_table_stats(ownname=> 'SYSADM', tabname=> 'PS_GPMX_SDIVAR_WA',estimate_percent=> 100 cascade=> TRUE);
,
22/jul/2009::18:32
Si requieren hacer un trace en una BD para su posterior analisis
Solo tienen que hablitarlo del archivo SQLNET.ORA ubicado en el $ORACLE_HOME/network/admin
y cambiar los parametros marcados en ROJO de Off a ON
$ more sqlnet.ora
# SQLNET.AUTHENTICATION_SERVICES= (NONE)
trace_level_client = 16
trace_file_client = cli
trace_directory_client = /oracle90/network/trace
trace_unique_client = off
trace_timestamp_client = off
log_file_client = archivo_trace_
log_directory_client = /oracle90/network/log
,
10/jul/2009::10:07
Aunque el diccionario de datos de SQL server no es tan amplio como lo conocemos en ORACLE, por ahi se encuentran algunos scripts que te permiten saber algo como el tiempo que lleva ejecutandose el servicio se SQL server en tu servidor
Para realizar esto lo ejecutamos en MASTER y listo:
PARA SQL 2000:
select 'El servicio de Sql Server Service ha estado corriendo por '
+ cast((datediff(hh, crdate, getdate()))/24 as varchar(3)) + ' dias y '
+ cast((datediff(hh, crdate, getdate())) % 24 as varchar(2)) + ' horas'
from sysdatabases where name = 'tempdb'
PARA SQL 2005:
select 'El servicio de Sql Server Service ha estado corriendo por'
+ cast((datediff(hh, create_date, getdate()))/24 as varchar(3)) + ' dias y '
+ cast((datediff(hh, create_date, getdate())) % 24 as varchar(2)) + ' horas'
from sys.databases where name = 'tempdb'
Si lo que simplemente quieres saber es cuando se levanto el servicio entonces este es mejor y mas practico
-- Sql Server 2000 y Sql Server 2005
select crdate from sysdatabases where name = 'tempdb'
-- Sql Server 2005
select create_date from sys.databases where name = 'tempdb'
,
08/jul/2009::10:13
Generalemente este espacio se llena en oracle y deja lo que llamamos WATERMARK o la marca de agua, el cual es el nivel maximo que se ocupo en dicho espacio, por lo que a veces no es exacto decir que esta al 100% por lo que con este script
podran detectar cuanto espacio estan usando en dicho tablespace.
select
'Espacio de UNDO usado:'||nvl(sum(t.used_ublk * TO_NUMBER(x.value)/1024),0)||' kbytes' AS undofrom v$transaction t, v$parameter x where x.name = 'db_block_size';
select
'De un total disponible de: '||to_char( (sum(bytes)/1024),'999,999,999,999')||' kbytes' size_kbfrom dba_data_files where tablespace_name like 'UND%';
Y listo sabran cuanto estan usando de su tablespace de UNDO
,
14/may/2009::11:17
Estos 2 scripts ayudan a detectar los eventos en espera PASO1 y despues con el valor HASH de dicho evento obtendremos el plan de ejecucion esto para cuando no tenemos disponible el ORACLE GRID.
PASO 1. Script para detector los eventos de espera:
select count(1), s.sql_hash_value, sw.event
from v$session s, v$session_wait sw
where s.sid=sw.sid and sw.event!='SQL*Net message from client'
group by s.sql_hash_value,sw.event
order by 3 desc;
PASO 2. A través del SQL_HASH_VALUE se puede obtener el plan de ejecución
select * from table(dbms_xplan.display_cursor(1424292821));
EJEMPLO
PASO1 Ejecutar el primer query.
COUNT(1) SQL_HASH_VALUE EVENT
1 4208348705 db file sequential read
1 1046569919 db file scattered read
1 0 db file parallel write
1 0 Streams AQ: waiting for messages in the queue
PASO 2. Usar el valor hash en el Segundo query
select * from table(dbms_xplan.display_cursor(4208348705));
PLAN_TABLE_OUTPUT
HASH_VALUE 4208348705, child number 0
--------------------------------------
SELECT /*+FIRST_ROWS*/ a.t$oorg FROM baandb.twhinh200451 a WHERE a.t$sfit = :1
Plan hash value: 1523578419
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 14506 (100)| |
|* 1 | INDEX FULL SCAN | TWHINH200451$IDX5 | 1 | 51 | 14506 (4)| 00:02:55 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."T$SFIT"=:1)
filter("A"."T$SFIT"=:1)
,
31/mar/2009::07:30
Para la creacion de una BD en ORace 10g, no necesariamente debemos emplear el DBCA (Database creation assitance), debido a que crea un tablespace llamado XDB el cual luego es un problema quitar, para hacerlo via script lo podemos ejecutar de la siguiente manera.
Primero se crea el archivo de variables de ambiente.
Debemos crear el archivo initDB_NAME.ora dentro del $ORACLE_HOME/dbs. Este archivo debe tener la siguiente sintaxis:
db_cache_size=805306368
java_pool_size=16777216
large_pool_size=16777216
shared_pool_size=1291845632
streams_pool_size=0
*.audit_file_dest='/oracle/admin/DB_NAME/adump'
*.background_dump_dest='/oracle/admin/DB_NAME/bdump'
*.compatible='10.2.0.3.0'
*.control_files='/dbname_sist000/oradata/DB_NAME/control01.ctl','/dbname_sist000/oradata/DB_NAME/control02.ctl','/dbname_sist000/oradata/DB_NAME/control03.ctl'
*.core_dump_dest='/oracle/admin/DB_NAME/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='DB_NAME'
*.disk_asynch_io=FALSE
*.dispatchers='(PROTOCOL=TCP) (SERVICE=DB_NAMEXDB)'
*.job_queue_processes=10
#*.log_archive_dest_1='LOCATION=/dbname_logs/logs'
*.open_cursors=3000
*.pga_aggregate_target=1073741824
*.processes=600
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=665
*.sga_target=2147483648
*.tape_asynch_io=FALSE
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS'
*.user_dump_dest='/oracle/admin/DB_NAME/udump'
Debemos asegurarnos de que los filesystem y rutas de archivos existan, si no existen se crean :D ya saben con mkdir. Una vez realizado esto, debemos crear nuestro archivo de creacion de DB el cual es un archivo SQL. el cual contendra la siguiente sintaxis:
CREATE DATABASE DB_NAME
USER SYS IDENTIFIED BY password
USER SYSTEM IDENTIFIED BY password
LOGFILE GROUP 1 ('/dbname_sist000/oradata/DB_NAME/redo01.rdo') SIZE 100M,
GROUP 2 ('/dbname_sist000/oradata/DB_NAME/redo02.rdo') SIZE 100M,
GROUP 3 ('/dbname_sist000/oradata/DB_NAME/redo03.rdo') SIZE 100M
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 200
MAXINSTANCES 1
CHARACTER SET WE8ISO8859P1
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '/dbname_sist000/oradata/DB_NAME/system01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE '/dbname_temp/oradata/DB_NAME/temp01.dbf'
SIZE 500M
UNDO TABLESPACE UNDOTBS
DATAFILE '/dbname_undo/oradata/DB_NAME/undotbs_001.dbf'
SIZE 500M AUTOEXTEND OFF
SYSAUX DATAFILE '/dbname_sist000/oradata/DB_NAME/sysaux01.dbf' SIZE 500M autoextend off;
Una vez hecho esto, ejecutamos nuestro archivo de variables, para asegurarnos que estaremos en la DB correcta.
ya saben . ./DB_NAME.env
y nos conectamos via SQLPLUS, generalmente esto lo hacemos con el usuario oracle. asi que para conectarnos es mas facil con un simple
startup nomount pfile='</path/initSID.ora>'
nos cercioramos que estamos en la BD correcta con un:
select instance_name from v$instance;
Y listo ejecutamos nuestro archivo con la siguiente instruccion:
@/home/crea_DB_NAME.sql
Y cuando finaliza ejecutamos los siguientes comandos desde SQL*PLUS:
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/catdbsyn
@?/rdbms/admin/catexp
--- Como SYSTEM
cd /oracle/product/10.2/sqlplus/admin
./pupbld <<--- la ruta esta en $ORACLE_HOME/sqlplus/admin
Y no debemos olvidar la creacion del archivo de password para esta BD que creamos :
orapwd FILE=/oracle/dbs/DB_NAME.pwd PASSWORD=password ENTRIES=5
levantamos el listener y verificamso que este corriendo:
lsnrctl status
y listo!
Para mayor referencia y algunos parametros extras pueden usar el siguiente link:
y una vez hecho esto la BD ya esta lista!!
,
11/mar/2009::12:54
Siguiendo con la administracion de BD actualmente podemos renombrar un tablespace y su datafiles en las versionas de ORACLE 10g para esto seguimos los siguientes pasos:
SQL> alter tablespace B_INDX_888 rename to B_INDX888;
Tablespace altered
Una vez hecho esto, ponemos el tablespace en modo OFFLINE y nos vamos a la ubicacion de dicho datafile, para renombrar el archivo a nivel SO:
/ora_indx014/oradata/b4bsiexp $ ll
total 62054464
-rw-r----- 1 oracle dba 16043220992 Mar 11 12:42 B_INDX889_001.dbf
-rw-r----- 1 oracle dba 15728648192 Mar 11 12:40 B_INDX_888_001.dbf
/ora_indx014/oradata/b4bsiexp $ mv B_INDX_888_001.dbf B_INDX888_001.dbf
Una vez renombrado el datafile tenemos de definir el nuevo Datafile en el tablespace correspondiente:
SQL> alter database rename file '/ora_indx014/oradata/b4bsiexp/B_INDX_888_001.dbf' to '/ora_indx014/oradata/b4bsiexp/B_INDX888_001.dbf';
Database altered
Y ahora ponemos el Tablspace en modo ONLINE y listo, si por alguna razon existen usuarios que tengan asignados este tablespace es necesario que se le defina nuevamente para evitar posibles errores.
,
16/feb/2009::12:59
PAra mover TAblas a otro tablespace
Alter table OWNER.TABLENAME move tablespace wh5_data;
PAra mover indices:
Alter index OWNER.INDEXNAME rebuild tablespace wh5_index;
Si se requiere modificar un trigger
Primero se dropea el trigger
Drop Trigger OWNER.TRIGGERNAME;
y despues de modificar la secuencia en el trigger se ejecuta el script para crear el trigger:
CREATE OR REPLACE TRIGGER "OWNER"."TRIGGERNAME" BEFORE
INSERT ON "OWNER"."TRIGGERNAME" FOR EACH ROW
DECLARE
BEGIN
IF :NEW.SERIALKEY IS NULL THEN
SELECT OWNER.TRIGGERNAME
INTO :NEW.SerialKey
FROM dual;
END IF;
END;
,
07/ene/2009::12:36
Este escript nos puede ser de utilidad para la clonacion de alguna BD
esto debido a que se requiere tener la misma estructura de filesystem para tener la BD identica, por lo que requerimos saber que filesystem se requieren crear a nivel SO y cuanto espacio ocuparan. Con este script lo lograran de manera mas rapida.
column Free_space_gb format 9999999.999
column Allocated_gb format 9999999.999
column Used_gb format 9999999.999
column tablespace format a35
column filename format a70
select ts.name tablespace, trim(substr(df.name,1,100)) filename, df.bytes/1048576000 allocated_gb,
((df.bytes/1048576000) - nvl(sum(dfs.bytes)/1048576000,0))used_gb,nvl(sum(dfs.bytes)/1048576000,0) free_space_gb
from V$DATAFILE df left outer join dba_free_space dfs on df.file# = dfs.file_id join V$TABLESPACE ts
on df.ts# = ts.ts#
group by ts.name, dfs.file_id, df.name, df.file#, df.bytes UNION
select ts.name tablespace, trim(substr(df.name,1,100)) filename, df.bytes/1048576000
allocated_gb, ((df.bytes/1048576000) - nvl(sum(dfs.bytes)/1048576000,0))used_gb,nvl(sum(dfs.bytes)/1048576000,0)
free_space_gb
from V$TEMPFILE df left outer join dba_free_space dfs on df.file# = dfs.file_id join V$TABLESPACE ts
on df.ts# = ts.ts#
group by ts.name, dfs.file_id, df.name, df.file#, df.bytes
order by filename;
Y eso es todo amigos feliz año
,
17/dic/2008::09:29
Cuando tienen un tablespace de UNDO a veces este espacio se llena demasiado y se requiere liberar y reutilizar el mismo
Para esto es necesario que se cree un nuevo tablespace de UNDO en el cual podemos hacerlo desde el OEM, dando click derecho en el tablespace de UNDO ya existente, y seleccionamos CREAR como.
Hecho esto, debemos indicarle a ORACLE que ese sera el UNDO por defecto:
Alter system set Undo_tablespace= UNDOTBS2 scope=both;
reiniciamos la BD
Dropeamos el tablespace anterior:
drop tablespace UNDOTBS incluiding contents and datafiles;
y despues regeneramos el tablespace (solamente le asignamos 1 Gb en primera instancia)
y ahora repetimos el proceso para establecer nuevamente nuestro espacio de deshacer.
Saludos cordiales
,
12/dic/2008::15:50
Muchas veces se requiere el cambio de algunos parametros de Oracle para un mejor performance de las BD para esto se realiza lo siguiente:
ejecutar archivo de variables.
conectarse al SQL plus:
sqlplus '/as sysdba'
Realizamos el respaldo de los parametros actuales mediante el siguiente comando:
Create pfile from spfile;
despues de esto para cada parámetro haces lo siguiente:
SQL> alter system set sessions=3500 scope=spfile;
System altered.
SQL> alter system set sga_max_size=13639876608 scope=spfile;
System altered.
SQL> alter system set sga_target=13639876608 scope=spfile;
System altered.
SQL> alter system set shared_pool_reserved_size=89758105 scope=spfile;
System altered.
SQL> alter system set sort_area_size=4194304 scope=spfile;
y asi para cada parámetro.
Se reinicia la BD y listo los cambios se podran ver reflejados con un
Show parameters;
,
09/dic/2008::09:14
Si es necesario poner en modo archive una BD, es tan simple como lo siguiente:
ejecutar variables de ambiente
sqlplus '/as sysdba'
verficamos que estamos en la BD mediante la vista V$instance;
SQL> select instance_name from V$instance;
INSTANCE_NAME
----------------
mydatabasename
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /ora_logs001/oradata/b4bsiexp/
Oldest online log sequence 35308
Next log sequence to archive 35317
Current log sequence 35317
y listo hemos cambiado la BD a Archivelog