viernes, 6 de septiembre de 2013

Como mover el controlfile desde un filesystem hacia ASM

1. Identificar la ubicación el actual del controlfile

SQL> select name from v$controfile;

NAME
--------------------------------------------------------------------------------
/oradata/BASE/control01.ctl'


2. Parar la instancia y levantarla en nomount

SQL> shutdown normal
SQL> startup nomount

3. Usamos RMAN  para mover el controlfile hacia ASM

$ rman nocatalog
RMAN>connect target
RMAN>restore controlfile to '' from '';

Ej:

RMAN> restore controlfile to '+DGDATOS' from '/oradata/BASE/control01.ctl';

Starting restore at 06-SEP-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK

channel ORA_DISK_1: copied control file copy
Finished restore at 06-SEP-13



Nosotros solamente especificamos el nombre del diskgroup, oracle creará un OMF(Oracle Managed File). 
Usamos ASMCMD o sqlpus para identificar el nombre asignado al controlfile


4. En la instancia de ASM, identificamos el nombre del controlfile:

Usando ASMCMD:

$ asmcmd
ASMCMD> cd
ASMCMD> find -t controlfile . *

+DGDATOS/BASE/CONTROLFILE/current.308.577785757

ASMCMD>

5. Ahora del lado de la base de datos:

* Modificar el init.ora or spfile, reemplazando con el nuevo path para el init parámetro control_files.
* Si usamos init.ora, entonces modificamos el parámetro control_files y reiniciamos la instancia.
* Si usamos spfile, entonces

1) startup nomount the database instance
2) alter system set control_files='+DGDATOS/BASE/CONTROLFILE/current.308.577785757' scope=spfile;
3) shutdown immediate

6.
start the instance.

Verificar que el nuevo controlfile ah sido reconocido. 

NOTA : Los pasos 3 a 5 deberian ser repetidos para multiplexar el contolfile para en varios disgroup diskgroup .

miércoles, 19 de septiembre de 2012

Como clonar o duplicar una instancia oracle con la opción ACTIVE DATABASE de RMAN


Hola, luego de mucho tiempo de no publicar nada, aquí les traigo un procedimiento muy sencillo para hacer un clonado de nuestra base de datos de producción en un ambiente de test. La idea es utilizar RMAN y hacer el restore a través de la red, con lo cual esto es un beneficio cuando no disponemos de suficiente espacio en disco para alojar las piezas de backup de rman.

Nota: Antes de borrar el ambiente de test, salvaguardar todo lo que sea necesario, yo particularmente me guardo las contraseñas de los schemas con la query que muestro debajo:

SELECT name,password FROM SYS.USER$ WHERE password is not null;


Nota: cuando hacemos el duplicado con la opción ACTIVE DATABASE de RMAN hay un par de prerequisitos a tener en cuenta:
  • Source destination tiene que estar en ARCHIVELOG.
  • Tanto en el source como en el destino tienen que tener agregado el tnsnames.ora con la configuración de la base de datos a duplicar.
  • El password file debe estar replicado en ambos equipos.
  •  crear un init.ora con al menos estos parametros
          *.db_name='DBCLON
          *.db_file_name_convert=('+DATAORIGEN','+DATADESTINO)
          *.log_file_name_convert=('+DATAORIGEN,'+DATADESTINO')
  • Tener en cuenta que si se cambia el password de sys hay que volver a copiar el orapw.
  • Crear un listener_estatico en algun  puerto libre.
  • Agregar la entrada del listener en el tnsnames.ora local.

Pasos a seguir:

Aqui estamos logueados en el servidor de la instancia que queremos clonar.
  • Bajar la instancia a clonar
  • Tomar backup del spfile actual mv spfileBDCLON spfileCLON.old
  • Desde el nodo destino startup nomount de la instancia  DBCLON .
  • Borrar todo lo que contenga el diskgroup +DATADESTINO

Aqui estamos logueados en el nodo origen donde tenemos nuestra instancia productiva

Desde el nodo origen nos conectarnos al rman y ejecutar el script.

NOTA: Si esta conexion 1 no funciona usar la 2

export ORACLE_SID=DBORIGEN

1- rman target / auxiliary sys/password@DBCLON

2- rman target usuario/pasword@DBORIGEN auxiliary sys/password@DBCLON


Luego una vez dentro del rman ejecutar el script que hace el clonado de la instancia.

run {
   allocate channel prmy1 type disk; 
   allocate auxiliary channel clondb type disk; 
   duplicate target database to CLONDB from active database nofilenamecheck
logfile
  group 1 ('+ DATADESTINO /redo01.log') size 50M,
  group 2 ('+ DATADESTINO /redo02.log') size 50M,
  group 3 ('+ DATADESTINO /redo03.log') size 50M,
  group 4 ('+ DATADESTINO /redo04.exilog') size 50M;
}

Luego una vez terminado el restore , crear un spfile para la instancia, cambiar la password de sys y system, frenar los jobs si es que existen y todo lo que haga falta para tener un ambiente de test en forma operativa.

FIN.


lunes, 5 de julio de 2010

Como habilitar la opción de DEBUG en el TOAD?

Pasos

El usuario necesita tener el privilegio 'DEBUG CONNECT SESSION'. Si el mismo no fue granteado, el icono de debugger estará deshabilitado en el editor de pl/sql.


Solución

1. Grant debug any procedure to user_name;
2. Grant debug connect session to user_name;

Si es necesario tambien ejecutar:

1. GRANT EXECUTE ON DBMS_DEBUG to public;
2. Si, DBMS_DEBUG no esta creado, ejecutar el archivo $ORACLE_HOME\rdbms\admin\prvtpb.plb con el usuario SYS.

jueves, 17 de junio de 2010

Configurar Toad y sqlplus, usando Oracle Instant Client


Instant Client Package – Basic
Instant Client Package - SQL*Plus

Paso 2. Creamos cuatro carpetas como se muestra debajo.

C:\oracle
C:\oracle\bin
C:\racle\network
C:\oracle\network\admin
Paso 3. Descomprimimos los binarios dentro de c:\oracle\bin y nos aseguramos que exita el archivo oci.dll y sqlplus.exe.
Luego dentro de la carpeta admin alojamos los archivos tnsnames.ora y sqlnet.ora

tnsnames.ora


ALIAS_XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)

sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES = (NTS)

Paso 4. Creamos las siguientes variables de sistema. Vamos a mi pc > propiedades > configuración avanzada del sistema > Variables de entorno


Y agregamos:

ORACLE_HOME = C:\oracle
ORACLE_HOME_NAME = C:\oracle
SQL_PATH = C:\oracle
TNS_ADMIN = C:\oracle\network\admin
LD_LIBRARY_PATH = C:\oracle\bin
PATH= C:\oracle\bin;

Paso 5. Probamos hacer la conexión con el Toad y el sqlplus.

jueves, 5 de noviembre de 2009

Como particionar una tabla en linea?

Supongamos que tenemos una tabla, esta puede estar o no particionada y la idea en este caso puntual es volver a particionarla por mes con creación de particiones en forma automática. Para esta tarea vamos a utilizar el pakage DBMS_REDEFINITION.

paso 1.

El primer paso es chequear si la tabla se puede redefinir online, si la salida del script mostrado debajo no da ningún error, entonces podemos hacer uso del packages DBMS_REDEFINITION.

DECLARE
ndummy NUMBER;
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('SCHEMA','TABLA_ORIGINAL');
EXCEPTION
WHEN OTHERS THENRAISE;
end;
/

Paso 2.

Creamos la tabla temporal con la nueva estructura, en mi caso sólo la particioné por otro campó y ademas lo hice por mes utilizando la clausula "INTERVAL( NUMTOYMINTERVAL(1,'MONTH'))" provista en 11g la cual hace que las partiones se creen en forma automática.

NOTA:
- Para no generar archive's cambiar a modo NOLOGGING tanto la definición de la tabla como el clob.
- Crear las particiones necesarias para alojar la tabla completa.
- Hay que asegurarnos de tener espacio en el tablespace, mínimo el tamaño de la tabla original y un poco más.
- Debe tener la misma PK que la Original.
- En este punto no se debe crear ningún indice ni constraint ni trigger que no sea la PK.
- La tabla debe ser creada con los cambios deseados. - La tabla temporal debe ser creada con esos cambios.

--prompt creo la tabla temporal

CREATE TABLE SCHEMA.DOCUMENTOS_TEMP
(
IDNS_DOCUMENTO NUMBER NOT NULL,
SD_ANIO NUMBER(4) NOT NULL,
SD_ADUANA VARCHAR2(3 CHAR) NOT NULL,
SD_DOCUMENTOTIPO VARCHAR2(4 CHAR) NOT NULL,
SD_DOCUMENTONRO VARCHAR2(6 CHAR) NOT NULL,
SD_LETRA VARCHAR2(1 CHAR) NOT NULL,
SG_DOCUMENTO BLOB NOT NULL,
SD_CAJA VARCHAR2(6 CHAR) NOT NULL,
NS_DESPACHANTE NUMBER NOT NULL,
SD_CUITDESPACHANTE VARCHAR2(11 CHAR) NOT NULL,
SD_DESPACHANTE VARCHAR2(100 CHAR) NOT NULL,
NS_IMPORTADOREXPORTADOR NUMBER NOT NULL,
SD_CUITIMPORTADOREXPORTADOR VARCHAR2(11 CHAR) NOT NULL,
SD_IMPORTADOREXPORTADOR VARCHAR2(100 CHAR) NOT NULL,
H_ALTA DATE DEFAULT SYSDATE NOT NULL,
NC_PAGINAS NUMBER(4) NOT NULL,
NC_PAGINASLOTE NUMBER(4),
NC_BYTESPDF NUMBER,
H_UPD DATE
)
TABLESPACE DATA_CLOB
NOLOGGING
PARTITION BY RANGE (H_ALTA)
INTERVAL( NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION VALUES LESS THAN (TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
NOCOMPRESS
TABLESPACE DATA_CLOB
LOB (SG_DOCUMENTO) STORE AS
( TABLESPACE DATA_CLOB
ENABLE STORAGE IN ROW
CHUNK 8192
RETENTION
NOCACHE
NOLOGGING
),
PARTITION VALUES LESS THAN (TO_DATE(' 2009-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
NOCOMPRESS
TABLESPACE DATA_CLOB
LOB (SG_DOCUMENTO) STORE AS
( TABLESPACE DATA_CLOB
ENABLE STORAGE IN ROW
CHUNK 8192
RETENTION
NOCACHE
NOLOGGING
),
PARTITION VALUES LESS THAN (TO_DATE(' 2009-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
NOCOMPRESS
TABLESPACE DATA_CLOB
LOB (SG_DOCUMENTO) STORE AS
( TABLESPACE DATA_CLOB
ENABLE STORAGE IN ROW
CHUNK 8192
RETENTION
NOCACHE
NOLOGGING
),
PARTITION VALUES LESS THAN (TO_DATE(' 2009-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
NOCOMPRESS
TABLESPACE DATA_CLOB
LOB (SG_DOCUMENTO) STORE AS
( TABLESPACE DATA_CLOB
ENABLE STORAGE IN ROW
CHUNK 8192
RETENTION
NOCACHE
NOLOGGING
)
)
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;


Paso3.

Asociamos la tabla temporal con la tabla a redefinir.

prompt Iniciar el proceso de redefinición
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE ('SCHEMA','DOCUMENTOS','DOCUMENTOS_TEMP',
'IDNS_DOCUMENTO IDNS_DOCUMENTO,
SD_ANIO SD_ANIO,
SD_ADUANA SD_ADUANA,
SD_DOCUMENTOTIPO SD_DOCUMENTOTIPO,
SD_DOCUMENTONRO SD_DOCUMENTONRO,
SD_LETRA SD_LETRA, SG_DOCUMENTO
SG_DOCUMENTO, SD_CAJA SD_CAJA,
NS_DESPACHANTE NS_DESPACHANTE,
SD_CUITDESPACHANTE SD_CUITDESPACHANTE,
SD_DESPACHANTE SD_DESPACHANTE,
NS_IMPORTADOREXPORTADOR NS_IMPORTADOREXPORTADOR, SD_CUITIMPORTADOREXPORTADOR SD_CUITIMPORTADOREXPORTADOR, SD_IMPORTADOREXPORTADOR SD_IMPORTADOREXPORTADOR,
H_ALTA H_ALTA,
NC_PAGINAS NC_PAGINAS,
NC_PAGINASLOTE NC_PAGINASLOTE,
NC_BYTESPDF NC_BYTESPDF,
H_UPD H_UPD',
dbms_redefinition.cons_use_pk);
END;
/

Paso4.

Copia las dependencias de la tabla original a la tabla temporal.

prompt Copiar el objeto dependiente

DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCHEMA', 'DOCUMENTOS','DOCUMENTOS_TEMP', DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/


Paso5.

Hacemos un chequeo de errores.
prompt Consultar la vista DBA_REDEFINITION_ERRORS para saber si hubo algún error.

select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;
Paso6.
Mantenemos sincronizada la tabla temporal con los datos de la tabla original.

prompt Sincronizar la tabla temporal o intermedia

BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SRD', 'DOCUMENTOS','DOCUMENTOS_TEMP');
END;
/


Paso7.

Registra la dependendia de objetos ( indices, trigger o constraint ) y finaliza la redefinición.

prompt Completar la redefinicion

BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('SRD', 'DOCUMENTOS','DOCUMENTOS_TEMP');
END;
/

Paso8.

Volver a poner en modo LOGGING a la tabla.

alter table SCHEMA.DOCUMENTOS LOGGING ;
alter table SCHEMA.DOCUMENTOS MODIFY LOB (SG_DOCUMENTO) (CACHE LOGGING);

NOTA:

En caso de dar error y querer realizar rollback de la operacion se puede ejecutar lo siguente

BEGIN dbms_redefinition.abort_redef_table('SRD', 'DOCUMENTOS','DOCUMENTOS_TEMP');
END;
/