,
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
,
08/dic/2008::08:41
En Oracle cuando tenemos una BD en modo archive, genera muchos archivos con la extension .arc el cual nos va a saturar en algunas ocasiones problemas de espacio, por lo que aqui esta la solucion a ese problema:
Exportar Variables de ambiente
$rman
RMAN> connect target;
RMAN> crosscheck archivelog all;
RMAN> delete achivelog all;
confirmar que yes!
RMAN>exit;
y listo !
,
05/dic/2008::14:12
Bueno siguiendo con mi pequeño manual de autoayuda y que espero le sirva a algun dba principiante ahora les va la manera de generar una BD de manera automatica via script:
Primero debemos generar el script de la creacion de BD (este ejemplo es para 9g):
CREATE DATABASE CATPRCSC
USER SYS IDENTIFIED BY password
USER SYSTEM IDENTIFIED BY password
LOGFILE GROUP 1 ('/catprcsc_sist000/oradata/CATPRCSC/redo01.rdo') SIZE 100M,
GROUP 2 ('/catprcsc_sist000/oradata/CATPRCSC/redo02.rdo') SIZE 100M,
GROUP 3 ('/catprcsc_sist000/oradata/CATPRCSC/redo03.rdo') SIZE 100M
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 200
MAXINSTANCES 1
CHARACTER SET WE8ISO8859P1
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '/catprcsc_sist000/oradata/CATPRCSC/system01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE '/catprcsc_temp/oradata/CATPRCSC/temp01.dbf'
SIZE 500M
UNDO TABLESPACE undotbs
DATAFILE '/catprcsc_undo/oradata/CATPRCSC/undotbs01.dbf'
SIZE 400M AUTOEXTEND OFF
SYSAUX DATAFILE '/catprcsc_sist000/oradata/CATPRCSC/sysaux01.dbf' SIZE 500M autoextend off;
Este archivo debera tener extension sql, este archivo lo ejecutaremos desde SQL*PLUS
Una vez creado esto, debemos de generar un archivo de parametros el cual debemos de guardar dentro del ORACLE_HOME (no es el home de oracle)
el cual debera contener los siguientes datos y se lo pueden nombrar como initCATPRCSC.ora
el contenido de este archivo sera el siguiente:
db_name=CATPRCSC
db_files = 400 # SMALL
db_file_multiblock_read_count = 16 # MEDIUM
db_cache_size=500m
shared_pool_size = 300M # SMALL
db_block_size=8192
log_checkpoint_interval = 10000
processes = 200 # SMALL
parallel_max_servers = 5 # SMALL
log_buffer = 1048576 # SMALL
max_dump_file_size = 10240 # limit trace file size to 5 Meg each
global_names = TRUE
control_files = ('/catprcsc_sist000/oradata/CATPRCSC/control01.ora',
'/catprcsc_sist000/oradata/CATPRCSC/control02.ora',
'/catprcsc_sist000/oradata/CATPRCSC/control03.ora')
undo_management=auto
undo_tablespace=UNDOTBS
sga_max_size=850M
compatible=9.2.0.0.0
background_dump_dest=/oracle10/db10/admin/CATPRCSC/bdump
user_dump_dest=/oracle10/db10/admin/CATPRCSC/udump
core_dump_dest=/oracle10/db10/admin/CATPRCSC/cdump
una vez creados estos archivos y ya con nuestras variables de ambiente creadas, nos conectamos con SQL*PLUs como sys e iniciamos nuestra BD en modo no mount
startup nomount
y ejecutamos nuestro script con @/home/oracle/CreaCATPRCSC.sql y esperamos el prompt.
Cuanto se termina el proceso se ejecutan los siguientes scripts desde SQL*PLUS:
Run catalog and catproc
@?/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 una vez hecho esto la BD ya esta lista!!
FELICIDADES!!
,
05/dic/2008::13:42
Bueno cuando tenemos varias BD o de plano nos conectamos a varios servidores y por alguna razon no estan nuestras variables de ambiente bien definidas en Unix(nos falta indicar ubicacion de archivos de oracle y ejectuabes entre otros etc)
Esta es la mejor opcion:
crear un archivo en vi, con extension .env
En este caso yo le pongo el nombre del SID de la BD ejm CATPRCSC.env
OJO: UNIX si es muy quisquilloso con los nombres de arhivos podemos tener el mismo nombre de archivo con solo cambiar una letra por minuscula y lo reconocera como un archivo completamente diferente por ejemplo: CATPRCSC.env, Catprcsc.env, CaTpRcSc.env etc asi que no mas fijense bien.
en el vi podemos indicar nuestras variables de ambiente del modo siguiente:
export ORACLE_BASE=/oracle10/db10 <-- la ruta de instalacion del oracle o donde estan los archivos de instalacion de oracle
export ORACLE_HOME=/oracle10/db10 <- la ruta donde esta una version en especifico de oracle
export PATH=$ORACLE_HOME/bin:$PATH <-- Donde se ecuentran los binarios de oracle
export LD_LIBRARY_PATH=/oracle10/db10/lib
export ORACLE_SID=CATPRCSC <--Definimos la BD que queremos configurar.
Una vez definidos estas variables las podemos ejecutar del siguiente modo:
$ . ./Archivo.env
y asi podremos conectarnos a nuestra BD sin problemas.
OJO!!! si tienes mas de una BD es importante que ejecutes estos archivos antes de cualquier operacion o actividad a realizar, debido a que puedes conectarte a una BD por error y provocar perdida de informacion o inconsistencia de datos
,
03/dic/2008::17:22
Si alguna vez se presenta demasiada lentitud en alguna BD, ya sea para abrir las propiedades de algun tablespace mediante el OEM. El uso de esta sentencia ayuda a mejorar el performance de la BD.
para realizar esto en SQL*PLUS conectarse como sys.
Primero se verifican cuantos objetos existen.
select * from dba_recyclebin;
y despues realizamos la depuracion o purgado del mismo:
purge dba_recyclebin;
Se debe tener paciencia por que dependiendo de la cantidad de objetos es lo que tardara en realizarse esta actividad en promedio de 30 a 60 mins.
Saludos