viernes, 30 de diciembre de 2011

Eliminando una base de datos Oracle

Es muy fácil borrar una base de datos Oracle, como puedes ver en este ejemplo:

myserver:mydb> sqlplus '/ as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Sep 24 08:50:22 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to an idle instance.

SQL> startup mount exclusive;
ORACLE instance started.

Total System Global Area 268435456 bytes
Fixed Size 2083368 bytes
Variable Size 163579352 bytes
Database Buffers 100663296 bytes
Redo Buffers 2109440 bytes
Database mounted.

SQL> select instance_name, host_name from v$instance;

INSTANCE_NAME HOST_NAME
---------------- ----------------
mydb myserver

SQL> alter system enable restricted session;

System altered.

SQL> drop database;

Database dropped.

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options
SQL> exit

En una nota relacionada, la sentencia DROP DATABASE no existe en Oracle 9i, tienes que dar de baja la base de datos y borrar todos los archivos de la base de datos con comandos de sistema operativo:

Drop database in Oracle 9i

jueves, 29 de diciembre de 2011

Carga extra por memoria

Hablando sobre computadoras lo usual es que mientras más mejor, pero esto no es verdad siempre. Por ejemplo, ve la cantidad de memoria y carga en bigservr; este servidor tiene 64 gigabytes de memoria pero sólo están usados 3 gigabytes, y aún si no hay procesos corriendo y el uso de CPU es casi cero la carga promedio es algo alta. En comparación, smallsrv está más ocupado y aún habiendo paginado memoria la carga promedio es menor que en bigservr.

La administración del hardware por el kernel de Linux requiere recursos, y para manejar mucha memoria el kernel requiere ... muchas estructuras de memoria. Por lo tanto, si no vas a usar mucha memoria sería preferible (y más barato) instalar sólo la memoria que necesitas.

myuser@bigservr> top

top - 08:50:32 up 6 days, 13:00, 4 users, load average: 0.71, 0.74, 0.66
Tasks: 272 total, 1 running, 271 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.8%us, 0.1%sy, 0.0%ni, 99.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 65791000k total, 3227812k used, 62563188k free, 309716k buffers
Swap: 5406712k total, 0k used, 5406712k free, 2649252k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10768 root 15 0 16420 2456 2124 S 0.3 0.0 0:39.00 cmaeventd
22241 myuser 15 0 2336 1136 800 R 0.3 0.0 0:01.14 top
1 root 15 0 2072 616 532 S 0.0 0.0 0:08.29 init
2 root RT -5 0 0 0 S 0.0 0.0 0:01.17 migration/0
3 root 39 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root RT -5 0 0 0 S 0.0 0.0 0:01.44 migration/1
6 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/1
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
8 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/2
9 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/2
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2
11 root RT -5 0 0 0 S 0.0 0.0 0:01.72 migration/3

root@smallsrv:~# top

top - 08:51:20 up 29 min, 6 users, load average: 0.16, 0.21, 0.46
Tasks: 184 total, 2 running, 182 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.0%us, 12.3%sy, 0.0%ni, 79.3%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1016864k total, 987644k used, 29220k free, 44384k buffers
Swap: 2980016k total, 204780k used, 2775236k free, 604592k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2599 myuser 10 -10 271m 186m 177m S 9.6 18.8 2:55.94 vmware-vmx
2377 myuser 20 0 388m 103m 19m S 4.3 10.4 0:50.69 firefox-bin
1030 root 20 0 105m 20m 9428 S 3.0 2.1 1:00.57 Xorg
2435 myuser 20 0 73624 13m 9.9m S 1.3 1.4 0:15.40 plugin-containe
3479 root 20 0 2472 1196 880 R 0.7 0.1 0:00.06 top
16 root 15 -5 0 0 0 S 0.3 0.0 0:00.39 ata/0
2028 myuser 20 0 110m 10m 5832 S 0.3 1.1 0:12.17 compiz.real
2206 myuser 20 0 113m 11m 8324 S 0.3 1.2 0:04.71 gnome-terminal
2938 root 0 -20 0 0 0 R 0.3 0.0 0:08.41 vmware-rtc
1 root 20 0 2532 1420 1096 S 0.0 0.1 0:00.98 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
6 root 15 -5 0 0 0 S 0.0 0.0 0:00.02 events/0
7 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 cpuset
8 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 khelper

miércoles, 28 de diciembre de 2011

Oracle, máquinas virtuales y tiempo raro

Si tu has usado máquinas virtuales bastante, quizás sepas que algunas veces hay problemas con el tiempo de las máquinas virtuales y que es una buena práctica mantener el tiempo en sincronía (con servicios como NTP). Los problemas que he visto con el tiempo de las máquinas virtuales han estado relacionados principalmente con carga pesada y hardware no óptimo para dicha carga, pero hay más problemas relacionados con máquinas virtuales aparte de estos.

Un día tuve un problema raro con una base de datos Oracle 10g: de pronto había muchos datos de AWR y el tablespace estaba creciendo rápido. El intervalo entre muestras era de una hora y el tiempo de retención de siete días, pero al investigar más a fondo descubrí que los snapshots estaban siendo hechos cada minuto:

SQL> select snap_interval, retention from dba_hist_wr_control;

SNAP_INTERVAL RETENTION
---------------------------------------- -------------------
+00000 01:00:00.0 +00007 00:00:00.0

SQL> select SNAP_ID, STARTUP_TIME, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME from dba_hist_snapshot order by SNAP_ID;

SNAP_ID STARTUP_TIME BEGIN_INTERVAL_TIME END_INTERVAL_TIME
-------- ---------------------------- --------------------------- --------------------------
8123 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.07.28.091 AM 19-JUL-10 10.08.35.353 AM
8124 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.08.35.353 AM 19-JUL-10 10.09.46.060 AM
8125 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.09.46.060 AM 19-JUL-10 10.10.56.047 AM
8126 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.10.56.047 AM 19-JUL-10 10.12.04.798 AM
8127 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.12.04.798 AM 19-JUL-10 10.13.13.762 AM
8128 04-JUL-10 07.34.43.000 PM 19-JUL-10 10.13.13.762 AM 19-JUL-10 10.14.24.432 AM
...

Revisé muchas cosas en la base de datos Oracle pero después de no encontrar nada me imaginé que había un problema con el sistema operativo. El tiempo estaba bien pero el comando top refrescaba la información bastante rápido, por lo que intenté con top -d 300 y esta vez la información se refrescaba cada tres segundos ... Aún si debía refrescarse cada cinco minutos con top -d 300.

Después de encontrar esto notifiqué a los administradores de sistemas esta situación y algún tiempo después el problema fue arreglado, pero los administradores de sistemas nunca me dijeron cuál fue el problema; creo que el problema estaba relacionado con un bug de VMware:

Weird timing voodoo. Linux top command very fast

martes, 27 de diciembre de 2011

Problemas con el nombre de la computadora

Si se te generan muchos archivos de volcado y sale este error en el alert log:

Warning: keltnfy call to ldmInit failed with error 46

Revisa que el nombre de la computadora puede ser resuelto y que su dirección IP es correcta; en este ejemplo en Linux puedes ver que el nombre no está en /etc/hosts:

MYHOST:mydb> uname -n
MYHOST
MYHOST:mydb> cat /etc/hostname
MYHOST
MYHOST:mydb> cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
MYHOST:mydb> ping MYHOST
ping: unknown host MYHOST
MYHOST:mydb> sqlplus /

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jul 13 10:01:38 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing
options

SQL> set linesize 150
SQL> select INSTANCE_NAME, HOST_NAME, STATUS from v$instance;

INSTANCE_NAME HOST_NAME STATUS
---------------- ---------- ---------------
mydb MYHOST OPEN

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release
10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing
options

lunes, 26 de diciembre de 2011

Revisando el uso de memoria en HP-UX

Si sientes que tu servidor está más lento de lo usual, puedes revisar el uso de memoria y paginación con ps, top, vmstat y glance. En este ejemplo, como puedes ver en Mem Util y Swap Util en glance este servidor usó mucha memoria y espacio de paginación en algún momento, pero al momento de esta muestra no había paginación o falta de memoria como se puede ver en la memoria "active" (entre paréntesis) en el reporte de top, como se ve en los valores bajos de Page In y Page Out en glance, y también los valores bajos de pi y po en el reporte de vmstat.

$ ps -elx|sort -k 10b,10rn|more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME COMD
1401 S 113 6938 1 0 154 20 e000000163528680 9728 e000000149c7d080 ? 465:09 ora_s000_mydb
1401 S 113 6083 1 0 154 20 e0000001bcc40400 9620 e0000001674f6ee8 ? 0:00 oraclemydb (LOCAL=NO)
1401 S 113 6940 1 0 154 20 e0000001635c5100 9147 e000000149c7d080 ? 3:13 ora_d000_mydb
1401 S 113 6932 1 0 156 20 e0000001636fc700 9103 e000000167e27128 ? 2:40 ora_smon_mydb
1401 S 113 6926 1 0 156 20 e000000163664980 9012 e000000167e270f8 ? 25:24 ora_dbw0_mydb
1401 S 113 6934 1 0 156 20 e00000016362a700 8992 e000000167e27138 ? 0:02 ora_reco_mydb
1401 S 113 6924 1 0 154 20 e00000016340b700 8979 e000000149c7d080 ? 9:48 ora_pmon_mydb
1401 S 113 6936 1 0 156 20 e00000016348ba00 8967 e000000167e27148 ? 12:17 ora_cjq0_mydb
1401 S 113 6930 1 0 156 20 e000000163370980 8938 e000000167e27118 ? 12:59 ora_ckpt_mydb
1401 S 113 6928 1 0 156 20 e0000001634d6980 8924 e000000167e27108 ? 9:48 ora_lgwr_mydb
2541 R 0 6003 1 0 -16 10 e0000001a7370d00 4271 - ? 0:22 /opt/perf/bin/midaemon
2401 S 113 5999 5798 0 154 10 e0000001bb0fba00 1016 e00000018409c800 pts/0 0:19 glance
541 R 0 1 0 0 152 20 e00000010853e380 574 - ? 0:10 init
1401 S 113 6961 1 0 154 20 e000000163945a00 552 e000000149c7d080 ? 1:02 /oracle92/product/9.2.0/bin/tnslsnr LISTENER -inherit
1401 S 0 6088 1564 0 154 20 e0000001b1098980 491 e00000030f73fe68 ? 0:00 sshd: oracle [priv]
3401 S 113 6090 6088 0 154 20 e0000001b2c90100 491 e000000149c7d080 ? 0:00 sshd: oracle@pts/1
3401 S 127 6333 6331 0 154 20 e0000001c2b09d00 487 e000000149c7d080 ? 0:00 sshd: myuser@pts/2
1401 S 0 6331 1564 0 154 20 e0000001c8a15d00 471 e00000014eeffee8 ? 0:00 sshd: myuser [priv]
1401 S 0 6605 1564 0 154 20 e0000001ac0fc980 471 e000000164a63568 ? 0:00 sshd: otherusr [priv]
3401 S 12 6617 6605 0 154 20 e0000001b550c680 471 e000000149c7d080 ? 0:00 sshd: otherusr@pts/3
3401 S 113 5794 5791 0 154 20 e0000001b8695380 466 e000000149c7d080 ? 0:00 sshd: oracle@pts/0
$ top

System: myserver Fri Apr 8 10:37:43 2011
Load averages: 0.02, 0.12, 0.34
182 processes: 141 sleeping, 41 running
Cpu states:
CPU LOAD USER NICE SYS IDLE BLOCK SWAIT INTR SSYS
0 0.02 0.2% 0.0% 0.2% 99.6% 0.0% 0.0% 0.0% 0.0%
--- ---- ----- ----- ----- ----- ----- ----- ----- -----
avg 0.02 0.2% 0.0% 0.2% 99.6% 0.0% 0.0% 0.0% 0.0%

System Page Size: 4Kbytes
Memory: 1151700K (788492K) real, 3840196K (2936972K) virtual, 26556K free Page# 1/14

CPU TTY PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND
0 ? 27479 root 152 20 264M 20128K run 95:34 0.34 0.34 agctrlcell
0 ? 6938 oracle 154 20 1973M 4444K sleep 465:16 0.32 0.31 ora_s000_mydb
0 ? 2731 root 152 20 155M 7928K run 4:22 0.31 0.31 vxpal
0 ? 75 root 152 20 17208K 15296K run 44:50 0.29 0.29 vxfsd
0 ? 2666 root 152 20 112M 4332K run 1:30 0.29 0.29 vxsvc
0 ? 27475 root 152 20 694M 15332K run 84:10 0.29 0.29 evtcell
0 ? 3532 root 168 20 11700K 592K sleep 307:47 0.29 0.29 utild
0 ? 2357 root 152 20 26072K 1880K run 0:29 0.14 0.14 rpcd
0 ? 3021 root 152 20 92272K 2296K run 0:09 0.14 0.14 vxpal
0 ? 3078 root 152 20 99636K 1568K run 0:08 0.14 0.14 vxpal
0 ? 3197 root 152 20 25832K 1612K run 0:54 0.14 0.14 swagentd
$ glance

C - cum/interval toggle Page 1 of 2
ProcList CPU Rpt Mem Rpt Disk Rpt NextKeys SlctProc Help Exit
Glance C.04.70.001 10:31:24 myserver ia64 Current Avg High
------------------------------------------------------------------------------------------------------------------------------------------------------
CPU Util SSU U | 5% 32% 86%
Disk Util F | 1% 30% 77%
Mem Util S SU U | 99% 100% 100%
Swap Util U UR R | 26% 26% 26%
------------------------------------------------------------------------------------------------------------------------------------------------------
MEMORY REPORT Users= 4
Event Current Cumulative Current Rate Cum Rate High Rate
--------------------------------------------------------------------------------
Page Faults 0 7593 0.0 12.5 548.6
Page In 0 5149 0.0 8.4 350.8
Page Out 0 56 0.0 0.0 1.3
KB Paged In 0kb 20.1mb 0.0 33.9 7455.2
KB Paged Out 0kb 224kb 0.0 0.3 5.4
Reactivations 0 0 0.0 0.0 0.0
Deactivations 0 0 0.0 0.0 0.0
KB Deactivated 0kb 0kb 0.0 0.0 0.0
VM Reads 0 435 0.0 0.7 33.1
VM Writes 0 0 0.0 0.0 0.0
Total VM : 3.6gb Sys Mem : 2.6gb User Mem: 924mb Phys Mem : 3.7gb
Active VM: 2.3gb Buf Cache: 1mb Free Mem: 25mb FileCache: 215mb
MemFS Blk Cnt: 0 MemFS Swp Cnt: 0

ProcList CPU Rpt Mem Rpt Disk Rpt NextKeys SlctProc Help Exit
$ vmstat 10
procs memory page faults cpu
r b w avm free re at pi po fr de sr in sy cs us sy id
3 1 0 667747 14981 1 0 7 10 1 0 34 297 2178 238 3 1 96
1 1 0 562145 14956 4 0 12 0 0 0 0 221 644 139 1 1 98
1 1 0 762287 14964 0 0 0 0 0 0 0 133 545 97 1 0 98
1 1 0 761304 14980 0 0 0 0 0 0 0 118 451 87 0 0 100
1 1 0 550784 14964 0 0 0 0 0 0 0 118 387 88 0 0 100

Además, si tienes acceso como root puedes revisar el uso de memoria con swapinfo, sam y en /dev/mem como en el siguiente ejemplo (de un servidor diferente):

# swapinfo -tm
Mb Mb Mb PCT START/ Mb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
dev 8192 490 3606 6% 0 - 1 /dev/vg00/lvol2
reserve - 2986 -2986
memory 3016 2780 236 92%
total 11208 6256 856 56% - 0 -
# echo phys_mem_pages/D | adb -k /stand/vmunix /dev/mem
phys_mem_pages:
phys_mem_pages: 1048064
# sam

┌ System Properties (MYSERVR) ┐
│┌────────────────────────────────────────┐│
││ ^│
││ [ Refresh ] │
││ │
││ ┌─────┐┌────┐┌─────────┐┌─────┐┌────┐ │
││ │ Processor ││ Memory ││ Operating System ││ Network ││ Dynamic │ │
││ ┌───────/ \──────────────────────────┐ │
││ │┌────────────────────────────────────┐│ │
││ ││Physical Memory: 4097.7 MB ││ │
││ ││Real Memory: ││ │
││ ││ Active: 954731.6 KB ││ │
││ ││ Total: 1318838.6 KB ││ │
││ ││Virtual Memory: ││ │
││ ││ Active: 1850220.6 KB ││ │
││ ││ Total: 2375723.8 KB ││ │
││ ││Free Memory Pages: 21640 at 4 KB/page ││ │
││ ││Swap Space: ││ │
││ ││ Avail: 8192 MB ││ │
││ ││ Used: 3461 MB ││v│
│└────────────────────────────────────────┘│
│──────────────────────────────────────────│
│ [ OK ] [ Help ] │
└──────────────────────────────────────────┘

Más información:

Memory Usage (What is using all of the memory?)

domingo, 25 de diciembre de 2011

Cómo obtener el tamaño de una base de datos Oracle

Si necesitas obtener el tamaño de una base de datos Oracle (excluyendo software, logs y cosas así), puedes hacerlo de esta forma:

SQL> select 'ONLINE_REDOLOG' as TYPE, sum(BYTES*MEMBERS)/1048576 as SIZE_MB from v$log union
select 'DATAFILES', sum(BYTES)/1048576 from v$datafile union
select 'TEMPFILES', sum(BYTES)/1048576 from v$tempfile union
select 'CONTROLFILES', sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1048576 from v$controlfile union
select 'FLASH_RECOVERY_AREA', VALUE/1048576 from v$parameter where NAME='db_recovery_file_dest_size';

TYPE SIZE_MB
------------------- ----------
CONTROLFILES 14.1875
DATAFILES 1230
FLASH_RECOVERY_AREA 3072
ONLINE_REDOLOG 300
TEMPFILES 25

viernes, 23 de diciembre de 2011

Cómo obtener los DDL de objetos de un esquema

En Oracle, si necesitas recrear, copiar o comparar un esquema completo (o incluso una base de datos completa) sin los datos, puedes usar el paquete DBMS_METADATA.GET_DDL para obtener los DDL de los objetos como en el siguiente ejemplo:

set linesize 150
set long 90000
set pagesize 0
set wrap on
column mdata format a150

SELECT DBMS_METADATA.GET_DDL(object_type, object_name, owner) as mdata FROM DBA_OBJECTS
WHERE OWNER = 'MYSCHEMA' and OBJECT_TYPE not in ('LOB') ORDER BY object_type, object_name;

Más información sobre obtener DDL de objetos:

Get table and index DDL the easy way
DDL Generation--Oracle's Answer to Save You Time and Money

Cambiando el tamaño de datafiles

Si necesitas cambiar el tamaño actual o máximo de un datafile, puedes revisar información de datafiles y tablespaces con estas prácticas sentencias:

SQL> column expandible format A10
SQL> column Tot_Size_MB format 99,999,999
SQL> column Tot_Free_MB format 99,999,999
SQL> column maxbytes_MB format 99,999,999
SQL> column PCT_USED format 999.9
SQL> column Chunks_Free format 99,999,999

SQL> select a.tablespace_name,
sum(a.sum_alloc)/1048576 Tot_Size_MB,
sum(a.sum_free)/1048576 Tot_Free_MB,
100 - sum(a.sum_free)*100/sum(a.sum_alloc) PCT_USED,
sum(a.chunks) Chunks_Free,
max(expandible) expandible,
sum(maxbytes)/1048576 maxbytes_MB
from
(select tablespace_name,0 sum_alloc,sum(bytes) sum_free,
max(bytes) largest,count(*) chunks, ' ' expandible, 0 maxbytes
from dba_free_space a
where tablespace_name != 'UNDO'
group by tablespace_name
union all
select tablespace_name,sum(bytes) sum_alloc, 0, 0, 0,
max(autoextensible), sum(case when maxbytes = 0 then bytes else maxbytes end) maxbytes
from dba_data_files
where tablespace_name != 'UNDO'
group by tablespace_name) a
group by a.tablespace_name
order by PCT_USED desc;

TABLESPACE_NAME TOT_SIZE_MB TOT_FREE_MB PCT_USED CHUNKS_FREE EXPANDIBLE MAXBYTES_MB
---------------- ----------- ----------- -------- ----------- ---------- -----------
MYDATA 3,584 4 99.9 4 YES 4,096
MYINDEXES 312 6 98.1 8 YES 1,024
PERFSTAT 192 48 74.9 1 YES 384
SYSAUX 300 97 67.7 12 NO 300
SYSTEM 312 102 67.4 9 NO 312
USERS 128 126 1.7 915 YES 1,024

6 rows selected.

SQL> column FILE_NAME format a45
SQL> select TABLESPACE_NAME, FILE_NAME, AUTOEXTENSIBLE, MAXBYTES
from dba_data_files order by TABLESPACE_NAME, FILE_NAME;

TABLESPACE_NAME FILE_NAME AUT MAXBYTES
------------------------------ ---------------------------- --- ----------
MYDATA /mydb/mydata01.dbf YES 4294967296
MYINDEXES /mydb/myindexes01.dbf YES 1073741824
PERFSTAT /mydb/perfstat.dbf YES 402653184
SYSAUX /mydb/sysaux01.dbf NO 0
SYSTEM /mydb/system01.dbf NO 0
UNDO /mydb/undo01.dbf NO 0
USERS /mydb/users01.dbf YES 1073741824

7 rows selected.

SQL> alter database datafile '/mydb/mydata01.dbf' AUTOEXTEND ON MAXSIZE 4608M;

Database altered.

SQL> alter database datafile '/mydb/myindexes01.dbf' resize 2G;

Database altered.

miércoles, 21 de diciembre de 2011

Parchando una base de datos Oracle 9i

Esta es una transcripción de una sesión donde se aplicó un parche a una base de datos Oracle 9i en un sistema AIX; la plicación de parches con OPatch en general es muy similar en todas las plataformas de Oracle 9i en adelante pero es buena idea leer la documentación de cada parche en particular.

Primero revisamos la disponibilidad de perl y java y su versión ya que es un prerequisito de OPatch; la versión necesaria depende de la versión de OPatch a usar.

myserver:mydb> perl -v

This is perl, v5.8.2 built for aix-thread-multi
(with 3 registered patches, see perl -V for more detail)

Copyright 1987-2003, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

myserver:mydb> java -fullversion
java full version "J2RE 1.4.2 IBM AIX build ca142-20080515 (SR11)"
myserver:mydb> oslevel
5.3.0.0

A continuación agregamos el directorio de OPatch a la ruta de ejecución en caso de que no esté, y listamos el inventario de parches para saber acerca de parches existentes:

myserver:mydb> ls -la $ORACLE_HOME/OPatch
total 64
drwxr-x--- 5 oracle dba 256 Mar 03 2008 .
drwxr-xr-x 57 oracle dba 4096 May 10 11:18 ..
drwxr-x--- 2 oracle dba 256 Mar 03 2008 docs
drwxr-x--- 2 oracle dba 256 Mar 03 2008 jlib
-rwxr-xr-x 1 oracle dba 6143 Jun 09 2005 opatch
-rw-r--r-- 1 oracle dba 0 Mar 03 2008 opatch.ini
-rw-r--r-- 1 oracle dba 13703 Jun 09 2005 opatch.pl
drwxr-x--- 2 oracle dba 4096 Mar 03 2008 perl_modules
myserver:mydb> export PATH=$PATH:$ORACLE_HOME/OPatch
myserver:mydb> opatch lsinventory

Oracle Interim Patch Installer version 1.0.0.0.52
Copyright (c) 2005 Oracle Corporation. All Rights Reserved..

We recommend you refer to the OPatch documentation under
OPatch/docs for usage reference. We also recommend using
the latest OPatch version. For the latest OPatch version
and other support related issues, please refer to document
293369.1 which is viewable from metalink.oracle.com

Oracle Home = /oracle_9i/app/oracle/product/9.2.0
Location of Oracle Universal Installer components = /oracle_9i/app/oracle/product/9.2.0/oui
Location of OraInstaller.jar = "/oracle_9i/app/oracle/product/9.2.0/oui/jlib"
Oracle Universal Installer shared library = /oracle_9i/app/oracle/product/9.2.0/oui/lib/aix/liboraInstaller.so
Location of Oracle Inventory Pointer = /etc/oraInst.loc
Location of Oracle Inventory = /oracle_9i/app/oracle/product/9.2.0/inventory
Path to Java = /oracle_9i/app/oracle/product/9.2.0/jre/1.4.2/bin/java
Log file = /oracle_9i/app/oracle/product/9.2.0/.patch_storage//*.log

Creating log file "/oracle_9i/app/oracle/product/9.2.0/.patch_storage/LsInventory__06-29-2010_16-27-35.log"

Result:


There is no Interim Patch




OPatch succeeded.

Casi siempre es obligatorio (o por lo menos buena idea) detener todas las instancias y servicios de bases de datos dependientes del Oracle Home a parchar; si no quieres detener tus bases de datos revisa si el parche que quieres aplicar puede ser aplicado sin dar de baja los servicios.

myserver:mydb> lsnrctl stop LISTENER_mydb

LSNRCTL for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production on 29-JUN-2010 18:03:04

Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver)(IP=10.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=mydb)))
The command completed successfully
myserver:mydb> sqlplus '/ as sysdba'

SQL*Plus: Release 9.2.0.7.0 - Production on Tue Jun 29 18:03:28 2010

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

Ahora aplicamos el parche cambiándonos al directorio del parche y ejecutando opatch; OPatch tiene muchas opciones pero aplicar un parche sólo en un Oracle Home es el mas fácil de los escenarios:

myserver:mydb> cd /oracle_resp9/p5496862_92070_AIX64-5L/5496862
myserver:mydb> ls -la
total 16
drwx------ 4 oracle dba 256 Jun 09 11:03 .
drwx------ 3 oracle dba 256 Jun 09 11:03 ..
-rw------- 1 oracle dba 4710 Jun 09 10:52 README.txt
drwx------ 4 oracle dba 256 Jun 09 11:03 etc
drwx------ 4 oracle dba 256 Jun 09 11:03 files
myserver:mxod0012> opatch apply

Oracle Interim Patch Installer version 1.0.0.0.52
Copyright (c) 2005 Oracle Corporation. All Rights Reserved..

We recommend you refer to the OPatch documentation under
OPatch/docs for usage reference. We also recommend using
the latest OPatch version. For the latest OPatch version
and other support related issues, please refer to document
293369.1 which is viewable from metalink.oracle.com

Oracle Home = /oracle_9i/app/oracle/product/9.2.0
Location of Oracle Universal Installer components = /oracle_9i/app/oracle/product/9.2.0/oui
Location of OraInstaller.jar = "/oracle_9i/app/oracle/product/9.2.0/oui/jlib"
Oracle Universal Installer shared library = /oracle_9i/app/oracle/product/9.2.0/oui/lib/aix/liboraInstaller.so
Location of Oracle Inventory Pointer = /etc/oraInst.loc
Location of Oracle Inventory = /oracle_9i/app/oracle/product/9.2.0/inventory
Path to Java = /oracle_9i/app/oracle/product/9.2.0/jre/1.4.2/bin/java
Log file = /oracle_9i/app/oracle/product/9.2.0/.patch_storage//*.log

Creating log file "/oracle_9i/app/oracle/product/9.2.0/.patch_storage/5496862/Apply_5496862_06-29-2010_18-11-21.log"

Invoking fuser to check for active processes.

Backing up comps.xml ...

OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only.


Please shut down Oracle instances running out of this ORACLE_HOME
(Oracle Home = /oracle_9i/app/oracle/product/9.2.0)
Is this system ready for updating?
Please respond Y|N >
Y
Patching...
Printing stderr to output (from /oracle_9i/app/oracle/product/9.2.0/.patch_storage/5496862/make_local.stderr)
ar: Creating an archive file /oracle_9i/app/oracle/product/9.2.0/lib/libclntst9.a.

ar: Creating an archive file /oracle_9i/app/oracle/product/9.2.0/lib32/libclntst9.a.


...


Updating inventory...
Backing up comps.xml ...


OPatch succeeded.

Después de aplicar el parche levantamos las instancias y servicios de bases de datos y revisamos la nueva versión de Oracle (si aplica); algunos parches requieren que ejecutes scripts para cambiar las bases de datos y otros no por lo cual no olvides leer la documentación del parche.

myserver:mydb> sqlplus '/ as sysdba'

SQL*Plus: Release 9.2.0.7.0 - Production on Tue Jun 29 18:20:06 2010

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 253723320 bytes
Fixed Size 742072 bytes
Variable Size 184549376 bytes
Database Buffers 67108864 bytes
Redo Buffers 1323008 bytes
Database mounted.
Database opened.
SQL> select * from v$instance;

INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION STARTUP_T STATUS PAR THREAD# ARCHIVE LOG_SWITCH_
----------------- --------- ------------ --- ---------- ------- -----------
LOGINS SHU DATABASE_STATUS INSTANCE_ROLE ACTIVE_ST
---------- --- ----------------- ------------------ ---------
1 mydb
myserver
9.2.0.7.0 29-JUN-10 OPEN NO 1 STOPPED
ALLOWED NO ACTIVE PRIMARY_INSTANCE NORMAL


SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

myserver:mydb> lsnrctl start LISTENER_mydb

LSNRCTL for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production on 29-JUN-2010 18:22:35

Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

Starting /oracle_9i/app/oracle/product/9.2.0/bin/tnslsnr: please wait...

TNSLSNR for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production
System parameter file is /oracle_9i/app/oracle/product/9.2.0/network/admin/listener.ora
Log messages written to /oracle_9i/app/oracle/product/9.2.0/network/log/listener_mydb.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=hsodbc)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=mydb)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myserver)(PORT=1521)))

Connecting to (ADDRESS=(PROTOCOL=IPC)(KEY=hsodbc))
STATUS of the LISTENER
------------------------
Alias LISTENER_mydb
Version TNSLSNR for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production
Start Date 29-JUN-2010 18:22:35
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security OFF
SNMP OFF
Listener Parameter File /oracle_9i/app/oracle/product/9.2.0/network/admin/listener.ora
Listener Log File /oracle_9i/app/oracle/product/9.2.0/network/log/listener_mydb.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=hsodbc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=mydb)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myserver)(PORT=1521)))
Services Summary...
Service "mydb" has 1 instance(s).
Instance "mydb", status UNKNOWN, has 1 handler(s) for this service...
Service "hsodbc" has 1 instance(s).
Instance "hsodbc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

myserver:mydb> tnsping mydb

TNS Ping Utility for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production on 29-JUN-2010 18:27:02

Copyright (c) 1997 Oracle Corporation. All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP) (HOST=myserver) (IP=10.0.0.1) (PORT=1521))) (CONNECT_DATA = (SID=mydb)))
OK (90 msec)

Finalmente, listamos de nuevo el inventario de parches y debemos ver el parche recién aplicado:

myserver:mydb> opatch lsinventory

Oracle Interim Patch Installer version 1.0.0.0.52
Copyright (c) 2005 Oracle Corporation. All Rights Reserved..

We recommend you refer to the OPatch documentation under
OPatch/docs for usage reference. We also recommend using
the latest OPatch version. For the latest OPatch version
and other support related issues, please refer to document
293369.1 which is viewable from metalink.oracle.com

Oracle Home = /oracle_9i/app/oracle/product/9.2.0
Location of Oracle Universal Installer components = /oracle_9i/app/oracle/product/9.2.0/oui
Location of OraInstaller.jar = "/oracle_9i/app/oracle/product/9.2.0/oui/jlib"
Oracle Universal Installer shared library = /oracle_9i/app/oracle/product/9.2.0/oui/lib/aix/liboraInstaller.so
Location of Oracle Inventory Pointer = /etc/oraInst.loc
Location of Oracle Inventory = /oracle_9i/app/oracle/product/9.2.0/inventory
Path to Java = /oracle_9i/app/oracle/product/9.2.0/jre/1.4.2/bin/java
Log file = /oracle_9i/app/oracle/product/9.2.0/.patch_storage//*.log

Creating log file "/oracle_9i/app/oracle/product/9.2.0/.patch_storage/LsInventory__06-29-2010_18-26-05.log"

Result:


Installed Patch List:
=====================
1) Patch 5496862 applied on Tue Jun 29 17:15:41 GMT-06:00 2010
[ Base Bug(s): 5496862 ]




OPatch succeeded.

martes, 20 de diciembre de 2011

Obteniendo información de cambios de archivo de log

La cantidad de cambios de archivo de log que hace una base de datos Oracle es un indicador de la cantidad de datos modificados en una base de datos; dado que las operaciones de selección no generan redo, el cambio de logs está muy relacionado con manipulación de datos. Por lo tanto, tu puedes obtener la cantidad de cambios de log y el tamaño de cada archivo de log y así tener una idea aproximada de cuántos datos son modificados en tu base de datos en un período de tiempo:

SQL> select MAX(i.INSTANCE_NAME) as INSTANCE, MIN(h.FIRST_TIME) as FIRST_TIME,
SQL> MIN(h.SEQUENCE#) as MIN_SEQUENCE#, MAX(h.SEQUENCE#) as MAX_SEQUENCE#,
SQL> MAX(l.BYTES)/1048576 as LOG_SIZE_MB,
SQL> MAX(h.SEQUENCE#)-MIN(h.SEQUENCE#)+1)*MAX(l.BYTES)/1073741824 as DATA_GB
SQL> from V$LOG_HISTORY h, V$LOG l, V$INSTANCE i where h.FIRST_TIME > SYSDATE-7;

INSTANCE FIRST_TIME MIN_SEQUENCE# MAX_SEQUENCE# LOG_SIZE_MB DATA_GB
---------------- ----------- ------------- ------------- ----------- ----------
mydb 12-jun-2010 178 182 256 1.25

lunes, 19 de diciembre de 2011

Liberando espacio en SYSAUX

Si el tablespace SYSAUX crece mucho, podría ser debido a que hay muchos datos estadísticos en ese tablespace. Podrías intentar liberar espacio con estas sentencias:

SQL> exec DBMS_STATS.PURGE_STATS(SYSDATE-30);

PL/SQL procedure successfully completed.

SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY move tablespace sysaux;

Table altered.

SQL> alter index I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST rebuild online;

Index altered.

SQL> alter index I_WRI$_OPTSTAT_H_ST rebuild online;

Index altered.

SQL> alter table WRI$_OPTSTAT_HISTHEAD_HISTORY move tablespace sysaux;

Table altered.

SQL> alter index I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST rebuild online;

Index altered.

SQL> alter index I_WRI$_OPTSTAT_HH_ST rebuild online;

Index altered.

SQL> ALTER TABLE WRH$_ACTIVE_SESSION_HISTORY SHRINK SPACE CASCADE;

Table altered.

Más información:

Purging statistics from the SYSAUX tablespace

sábado, 17 de diciembre de 2011

Recuperando espacio de índices de Statspack

Si el tablespace asignado a los objetos de Statspack crece demasiado, podrías intentar recuperar espacio reconstruyendo algunos índices y moviendo tablas:

SQL> column SEGMENT_NAME format a50
SQL> select * from (select SEGMENT_NAME, SEGMENT_TYPE, BYTES/1024/1024 as MBYTES from dba_segments
where OWNER='PERFSTAT' and TABLESPACE_NAME='STATSPACK' order by BYTES desc) where rownum < 10;

SEGMENT_NAME SEGMENT_TYPE MBYTES
--------------------------------------------------- ------------------ ----------
STATS$SQL_SUMMARY TABLE 1245
STATS$SQL_SUMMARY_PK INDEX 240
STATS$PARAMETER_PK INDEX 42
STATS$SYSSTAT_PK INDEX 39
STATS$LATCH_PK INDEX 35
STATS$LATCH_MISSES_SUMMARY_PK INDEX 34
STATS$LATCH TABLE 33
STATS$SYSSTAT TABLE 26
STATS$PARAMETER TABLE 25

9 rows selected.

SQL> ALTER table PERFSTAT.STATS$SQL_SUMMARY move;

Table altered.

SQL> ALTER INDEX PERFSTAT.STATS$SQL_SUMMARY_PK REBUILD ONLINE;

Index altered.

SQL> ALTER INDEX PERFSTAT.STATS$LATCH_PK REBUILD ONLINE;

Index altered.

SQL> ALTER INDEX PERFSTAT.STATS$LATCH_PARENT_PK REBUILD ONLINE;

Index altered.

SQL> ALTER INDEX PERFSTAT.STATS$LATCH_MISSES_SUMMARY_PK REBUILD ONLINE;

Index altered.

SQL> ALTER INDEX PERFSTAT.STATS$LATCH_CHILDREN_PK REBUILD ONLINE;

Index altered.

SQL> ALTER INDEX PERFSTAT.STATS$SYSSTAT_PK REBUILD ONLINE;

Index altered.

Algunas veces las tablas e índices crecen tanto que podría ser mejor sólo truncar todo; si es el caso entonces puedes usar el script sptrunc:

SQL> alter session set current_schema=PERFSTAT;

Session altered.

SQL> @?/rdbms/admin/sptrunc

Warning
~~~~~~~
Running sptrunc.sql removes ALL data from Statspack tables. You may
wish to export the data before continuing.


About to Truncate Statspack Tables
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If would like to exit WITHOUT truncating the tables, enter any text at the
begin_or_exit prompt (e.g. 'exit'), otherwise if you would like to begin
the truncate operation, press (return)


Enter value for begin_or_exit:
Entered at the 'begin_or_exit' prompt

Beginning truncate operation


Table truncated.


Table truncated.

...

Commit complete.


Package altered.


Truncate operation complete

viernes, 16 de diciembre de 2011

Administrando una base de datos Oracle Physical Standby

De verdad que es difícil traducir términos técnicos o en inglés! Se oye raro o simplemente no se sabe qué es una base de datos en espera física de Oracle? Esta es la primera vez que intento traducir términos técnicos del inglés al español, y para ser sinceros en México a diferencia de España es común el "Spanglish", esto es, hablar la mitad en inglés y la mitad en español aún existiendo palabras equivalentes en español perfectamente entendibles. Por lo que veo algunos términos será preferible mantenerlos en inglés o de lo contrario por lo menos en México no se sabrá de qué estoy hablando, y los que sean razonablemente traducibles y comunes los traduciré al español. Y después de este preámbulo:

Este es un ejemplo de cómo abrir una base de datos physical standby en modo de sólo lectura:

SQL> select name, open_mode, database_role, switchover_status from v$database;

NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- ---------- ---------------- --------------------
MYDB0001 MOUNTED PHYSICAL STANDBY SESSIONS ACTIVE

SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database open;

Database altered.

SQL> select name, open_mode, database_role, switchover_status from v$database;

NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- ---------- ---------------- --------------------
MYDB0001 READ ONLY PHYSICAL STANDBY NOT ALLOWED

SQL> select instance_name, logins from v$instance;

INSTANCE_NAME LOGINS
---------------- ----------
mydbr001 ALLOWED

Y este es un ejemplo de la restauración de la aplicación de redo logs en una base de datos en espera:

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
mydbr002

SQL> shutdown immediate;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area 805306368 bytes
Fixed Size 2087520 bytes
Variable Size 205522336 bytes
Database Buffers 591396864 bytes
Redo Buffers 6299648 bytes
Database mounted.

SQL> alter database recover managed standby database disconnect;

Database altered.

SQL> select name, applied, archived from v$archived_log where applied='NO';

no rows selected

SQL> select open_mode, database_role, switchover_status from v$database;

OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
---------- ---------------- --------------------
MOUNTED PHYSICAL STANDBY SESSIONS ACTIVE

SQL> select instance_name, logins from v$instance;

INSTANCE_NAME LOGINS
---------------- ----------
mydbr002 ALLOWED

Más información sobre la administración de bases de datos physical standby:

Managing a Physical Standby Database

jueves, 15 de diciembre de 2011

Eliminando un trabajo en Oracle 9i

Tu puedes eliminar un trabajo en Oracle 9i con el numero de trabajo y DBMS_JOB.REMOVE:

SQL> SELECT JOB, SUBSTR(WHAT,1,35), NEXT_DATE, NEXT_SEC, BROKEN FROM
DBA_JOBS;

JOB SUBSTR(WHAT,1,35) NEXT_DATE NEXT_SEC B
---------- ----------------------------------- --------- -------- -
182 SYS.MYJOB_1; 03-JUN-10 17:16:39 N
183 SYS.MYJOB_2; 03-JUN-10 21:45:21 N
41 SYS.OTHERJOB_1; 03-JUN-10 16:13:12 N
61 SYS.OTHERJOB_2; 06-JUN-10 08:54:07 N
204 statspack.snap; 03-JUN-10 16:13:22 N
161 SYS.LASTJOB; 01-JAN-00 00:00:00 Y

6 rows selected.

SQL> EXECUTE DBMS_JOB.REMOVE(204);

PL/SQL procedure successfully completed.

SQL> SELECT JOB, SUBSTR(WHAT,1,35), NEXT_DATE, NEXT_SEC, BROKEN FROM
DBA_JOBS;

JOB SUBSTR(WHAT,1,35) NEXT_DATE NEXT_SEC B
---------- ----------------------------------- --------- -------- -
182 SYS.MYJOB_1 03-JUN-10 17:16:39 N
183 SYS.MYJOB_2; 03-JUN-10 21:45:21 N
41 SYS.OTHERJOB_1; 03-JUN-10 16:13:12 N
61 SYS.OTHERJOB_2; 06-JUN-10 08:54:07 N
161 SYS.LASTJOB; 01-JAN-00 00:00:00 Y

miércoles, 14 de diciembre de 2011

Creación de una instancia ASM

Este es un ejemplo de creación de una instancia ASM:

oracle@myserver:~# export ORACLE_BASE=/opt/oracle
oracle@myserver:~# export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
oracle@myserver:~# export ORACLE_SID="+ASM"
oracle@myserver:~# echo "INSTANCE_TYPE=ASM" > /tmp/init+ASM.ora
oracle@myserver:~# sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 11:27:55 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining Scoring Engine options

SQL> CREATE SPFILE FROM PFILE='/tmp/init+ASM.ora';

SQL> startup nomount

ASM instance started

Total System Global Area 125829120 bytes
Fixed Size 1301456 bytes
Variable Size 124527664 bytes
Database Buffers 0 bytes
Redo Buffers 0 bytes

SQL> alter system set asm_diskstring='/opt/oracle/product/10.2.0/db_1/devices/dev*';

SQL> show parameter asm_diskstring

NAME TYPE VALUE
--------------- ----------- ---------------------------------------------
asm_diskstring string /opt/oracle/product/10.2.0/db_1/devices/dev*

SQL> CREATE DISKGROUP disk NORMAL REDUNDANCY
SQL> FAILGROUP failure_group_1 DISK
SQL> '/opt/oracle/product/10.2.0/db_1/devices/deva1' NAME diska1,
SQL> '/opt/oracle/product/10.2.0/db_1/devices/deva2' NAME diska2,
SQL> FAILGROUP failure_group_2 DISK
SQL> '/opt/oracle/product/10.2.0/db_1/devices/devb1' NAME diskb1,
SQL> '/opt/oracle/product/10.2.0/db_1/devices/devb2' NAME diskb2;

SQL> select name, header_status, path from v$asm_disk;

NAME HEADER_STAT PATH
------------- ----------- ---------------------------------------------
DISKB1 MEMBER /opt/oracle/product/10.2.0/db_1/devices/devb1
DISKA3 CANDIDATE /opt/oracle/product/10.2.0/db_1/devices/deva3
DISKA1 MEMBER /opt/oracle/product/10.2.0/db_1/devices/deva1
DISKB3 CANDIDATE /opt/oracle/product/10.2.0/db_1/devices/devb3
DISKB2 MEMBER /opt/oracle/product/10.2.0/db_1/devices/devb2
DISKA2 MEMBER /opt/oracle/product/10.2.0/db_1/devices/deva2

SQL> CREATE DISKGROUP fra EXTERNAL REDUNDANCY DISK
SQL> '/opt/oracle/product/10.2.0/db_1/devices/deva3' NAME diska3,
SQL> '/opt/oracle/product/10.2.0/db_1/devices/devb3' NAME diskb3;

SQL> select g.name as DISKGROUP, d.name as DISK, FAILGROUP, TYPE, d.TOTAL_MB, d.FREE_MB
SQL> from v$asm_disk d, v$asm_diskgroup g where d.GROUP_NUMBER=g.GROUP_NUMBER order by 1, 3, 2;

DISKGROUP DISK FAILGROUP TYPE TOTAL_MB FREE_MB
---------- ---------- -------------------- ------ ---------- ----------
DISK DISKA1 FAILURE_GROUP_1 NORMAL 1500 746
DISK DISKA2 FAILURE_GROUP_1 NORMAL 1500 772
DISK DISKB1 FAILURE_GROUP_2 NORMAL 1500 752
DISK DISKB2 FAILURE_GROUP_2 NORMAL 1500 766
FRA DISKA3 DISKA3 EXTERN 1500 1184
FRA DISKB3 DISKB3 EXTERN 1500 1186


Ligas relacionadas con ASM:

Using Automatic Storage Management
Automatic Storage Management (ASM) in Oracle Database 10g
Migrating Databases To and From ASM with Recovery Manager

martes, 13 de diciembre de 2011

Creando índices únicos y restricciones

Si creas una tabla con una cláusula primary key en la sentencia de create table, Oracle creará la tabla y un índice único para mantener la unicidad de la llave primaria, y si se borra la restricción se borrará también el índice único que le acompaña:

SQL> create table miprueba (id number primary key, fecha date);
Table created.

SQL> insert into miprueba values (1, sysdate);

1 row created.

SQL> insert into miprueba values (1, sysdate);
insert into miprueba values (1, sysdate)
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C004346) violated

SQL> select table_NAME from dba_indexes where index_name='SYS_C004346';

TABLE_NAME
------------------------------
MIPRUEBA

SQL> alter table miprueba drop constraint SYS_C004346;

Table altered.

SQL> select table_NAME from dba_indexes where index_name='SYS_C004346';

no rows selected

SQL> select * from dba_constraints where CONSTRAINT_NAME='SYS_C004346';

no rows selected

SQL> drop table miprueba;

Table dropped.

Y si creas primero la tabla, después el índice único y al final agregas la restricción, el índice y la restricción pueden tener el mismo nombre, pero incluso si la restricción usa el índice único creado para mantener la restricción de la llave primaria, si se elimina la restricción no se estará borrando el índice único debido a que fueron creados por separado:

SQL> create table miprueba(id number, fecha date);

Table created.

SQL> create unique index pk_miprueba on miprueba (id);

Index created.

SQL> select INDEX_NAME from dba_indexes where TABLE_NAME='MIPRUEBA';

INDEX_NAME
------------------------------
PK_MIPRUEBA

SQL> ALTER TABLE miprueba add (constraint pk_miprueba primary key (id));

Table altered.

SQL> select constraint_name from dba_constraints where table_NAME='MIPRUEBA';
CONSTRAINT_NAME
------------------------------
PK_MIPRUEBA

SQL> select INDEX_NAME from dba_indexes where TABLE_NAME='MIPRUEBA';

INDEX_NAME
------------------------------
PK_MIPRUEBA

SQL> alter table miprueba drop constraint pk_miprueba;

Table altered.

SQL> select INDEX_NAME from dba_indexes where TABLE_NAME='MIPRUEBA';

INDEX_NAME
------------------------------
PK_MIPRUEBA

SQL> select constraint_name from dba_constraints where table_NAME='MIPRUEBA';

no rows selected

lunes, 12 de diciembre de 2011

Cómo revisar errores de jobs de 10g

Para revisar qué pasó con jobs detenidos o fallidos en Oracle 10g:

SQL> column LOG_DATE format a40
SQL> column JOB_NAME format a20
SQL> column ADDITIONAL_INFO format a40
SQL> select LOG_ID, LOG_DATE, JOB_NAME, STATUS, ADDITIONAL_INFO from DBA_SCHEDULER_JOB_RUN_DETAILS
where STATUS in ('STOPPED','FAILED') order by LOG_DATE;


LOG_ID LOG_DATE JOB_NAME STATUS ADDITIONAL_INFO
------- ------------------------------------ ------------- -------- ----------------------------------------
6076 22-MAR-11 09.22.00.880338 PM -06:00 MY_JOB FAILED ORA-30036: unable to extend segment by O
RA-30036: unable to extend segment by 8
in undo tablespace 'UNDO'
ORA-06512: at "SYS.MY_PROCEDURE",
line 16
ORA-06512: at line 1
in undo tablespace ''

6085 23-MAR-11 09.22.00.608055 PM -06:00 MY_JOB FAILED ORA-30036: unable to extend segment by O
RA-30036: unable to extend segment by 8
in undo tablespace 'UNDO'
ORA-06512: at "SYS.MY_PROCEDURE",
line 16
ORA-06512: at line 1
in undo tablespace ''

6088 24-MAR-11 05.45.00.821410 AM -06:00 MY_OTHER_JOB STOPPED REASON="Stop job called"

domingo, 11 de diciembre de 2011

Unable to spawn jobq slave process

Un día una base de datos Oracle dejó de lanzar procesos para jobs, y fue debido a que había muchos jobs lanzados pero ninguno respodía o terminaba su ejecución:

SQL> select count(*) from dba_SCHEDULER_RUNNING_CHAINS;

COUNT(*)
----------
0

SQL> select count(*) from dba_SCHEDULER_RUNNING_JOBS;

COUNT(*)
----------
0

SQL> select LOG_DATE, OWNER, JOB_NAME from dba_SCHEDULER_JOB_RUN_DETAILS
where LOG_DATE > (select STARTUP_TIME from v$instance) order by LOG_DATE;

LOG_DATE OWNER JOB_NAME
----------------------------------- ------------------------------ -------------------------
25-MAR-10 09.00.13.415604 PM -06:00 ORACLE_OCM MGMT_CONFIG_JOB
25-MAR-10 09.00.17.223307 PM -06:00 ORACLE_OCM MGMT_CONFIG_JOB_1
25-MAR-10 09.04.02.054297 PM -06:00 SYS JOB_DEPURA_AUD_TAB
25-MAR-10 09.05.52.943314 PM -06:00 SYS AUTO_SPACE_ADVISOR_JOB
25-MAR-10 09.19.52.891362 PM -06:00 SYS GATHER_STATS_JOB
26-MAR-10 01.45.01.080361 AM -06:00 SYS JOB_DAILY_SCHEMA_STATS
26-MAR-10 02.00.03.321536 AM -06:00 SYS PURGE_LOG
26-MAR-10 09.00.09.986098 PM -06:00 ORACLE_OCM MGMT_CONFIG_JOB
26-MAR-10 09.00.13.454394 PM -06:00 ORACLE_OCM MGMT_CONFIG_JOB_1
26-MAR-10 09.04.02.741707 PM -06:00 SYS JOB_DEPURA_AUD_TAB
26-MAR-10 09.07.58.011419 PM -06:00 SYS AUTO_SPACE_ADVISOR_JOB
26-MAR-10 09.10.58.165905 PM -06:00 SYS GATHER_STATS_JOB
27-MAR-10 01.00.02.342037 AM -06:00 SYS JOB_WEEKLY_SHRINK
27-MAR-10 02.00.03.041060 AM -06:00 SYS PURGE_LOG
27-MAR-10 05.00.08.906376 AM -06:00 ORACLE_OCM MGMT_CONFIG_JOB
27-MAR-10 05.00.09.878583 AM -06:00 ORACLE_OCM MGMT_CONFIG_JOB_1
27-MAR-10 05.05.28.660496 AM -06:00 SYS AUTO_SPACE_ADVISOR_JOB
27-MAR-10 05.07.10.629614 AM -06:00 SYS GATHER_STATS_JOB
16-APR-10 09.18.47.772170 PM -05:00 SYS JOB_DEPURA_AUD_TAB

============================================

myserver:mydb> tail -13l alert_mydb.log
Sat Mar 27 05:05:28 2010
Thread 1 advanced to log sequence 3440 (LGWR switch)
Current log# 2 seq# 3440 mem# 0: /dat_mydb/logfile/redo02a.rdo
Current log# 2 seq# 3440 mem# 1: /dat_mydb/logfile/redo02b.rdo
Sat Mar 27 10:21:56 2010
kkjcre1p: unable to spawn jobq slave process
Sat Mar 27 10:21:56 2010
Errors in file /oracle_dba10g/app/oracle/admin/mydb/bdump/mydb_cjq0_778366.trc:

Sat Mar 27 21:25:22 2010
Thread 1 advanced to log sequence 3441 (LGWR switch)
Current log# 3 seq# 3441 mem# 0: /dat_mydb/logfile/redo03a.rdo
Current log# 3 seq# 3441 mem# 1: /dat_mydb/logfile/redo03b.rdo

myserver:mydb> ps ax|grep j00
381146 - T 0:00 ora_j001_mydb
1437892 - A 115:53 ora_j007_mydb
1638584 - A 118:10 ora_j003_mydb
1700004 - A 115:59 ora_j006_mydb
1736896 - A 115:41 ora_j009_mydb
1798374 - A 0:00 ora_j000_mxod0002
1822936 - A 116:00 ora_j005_mydb
1917100 - A 116:00 ora_j004_mydb
1966264 - A 118:12 ora_j000_mydb
2064440 - A 118:11 ora_j002_mydb
2068652 - A 115:48 ora_j008_mydb
2109622 pts/1 A 0:00 grep j00

Primer mensaje

Hace más de 20 años empecé a estudiar computación, inscrito en una escuela donde daban cursos de programación (BASIC, COBOL, RPG!). Me gustaba muchísimo programar una computadora y tratar de averiguar cómo funcionaba, pero había un pequeño problema: el software y la documentación estaban en inglés sin excepción.

Cuando entré a la secundaria empecé a estudiar inglés como todos los estudiantes mexicanos, pero nunca me gustó porque simplemente no le veía utilidad; no me llamaba la atención la cultura extranjera y mucho menos la estadounidense, y nunca consideré el inglés como un lenguaje interesante como por ejemplo el francés. Hacía lo mínimo indispensable para pasar la materia de Inglés y así estuve hasta la preparatoria, cuando por fin pude tener acceso a las computadoras.

Buena parte del software a nivel mundial, sea libre o propietario, se desarrolla en los Estados Unidos y por lo mismo es natural que esté en inglés, y esto era mucho más marcado hace 20 años, antes simplemente no había esperanza de usar software traducido al español. Era tanto mi gusto por las computadoras que no tuve más remedio que ponerme a estudiar inglés en serio; después de algunos años podía entender muy bien el software y los libros y manuales de computación en inglés, y pasado el tiempo entendí lo práctico que es saber inglés y más o menos aprendí a hablarlo y escribirlo.

Pasaron los años y el inglés me sirvió para participar en proyectos de software libre, para encontrar un buen trabajo, y me ayudó muchísimo para aprender japonés y estudiar en Japón, y ahora lo practico escribiendo un blog técnico en inglés. A estas alturas me parecía natural que todo profesional de la computación supiera por lo menos leer inglés, y es así que la semana pasada mientras revisaba las estadísticas de uso de mi blog, noté que no había prácticamente visitas de América Latina.

Cómo, es que en América Latina no hay mucha gente que use Oracle o UNIX y por eso no hay visitas?, pensé. Y mientras revisaba las ligas de referencia a mi blog, vi una que usaba un traductor al francés para uno de mis mensajes. Una traducción al francés! Eso me sorprendió gratamente, y me hizo pensar que posiblemente haya muchas personas que usan Oracle o UNIX y no tengan un dominio suficiente del inglés.

Pero cuántos serán? Los exámenes de certificación de Oracle y Red Hat vienen en inglés, los manuales de Oracle están sólo en inglés, y los libros tardan tanto no sólo en traducirse, incluso en venderse aunque sea en inglés en América Latina, que aún ahora sigue siendo bastante ventajoso saber inglés para trabajar con computadoras.

Este blog es un pequeño experimento para ver cuánta audiencia tienen mis mensajes en América Latina, por lo que poco a poco iré traduciendo mis mensajes de mi otro blog y la idea es llegar a un momento en el que publique mensajes en ambos blogs más o menos al mismo tiempo. Excepto este primer mensaje, este blog pretende ser una traducción más o menos fiel de mi blog en inglés.