martes 24 de agosto de 2010

Piensa

Leyendo el libro de Tom Kyte "Expert Oracle Database Architecture, Segunda Edición", me pareció excelente el prefacio escrito por Ken Jacobs en el cual escribe sobre cómo una palabra usada en 1914 por Thomas J. Watson para transmitirles una idea a los trabajadores en IBM, no importando su puesto, teniendo cuidado en la toma de desiciones además de hacer el trabajo con inteligencia.

Jacobs hace énfasis sobre la "experiencia convencional" que existe en la comunidad Oracle sobre como optimizar para un mejor rendimiento o la mejor manera de usar varias características de Oracle. Esta experiencia que algunas veces se vuelve folclore o incluso mito y que tanto desarrolladores como administradores de bases de datos aplican ciegamente o van más allá pero sin razonamiento alguno.

Un ejemplo de lo anterior es la idea de "si uno es bueno, más -muchos más- son mejor". La idea es popular, pero no siempre cierta. La interfaz de arreglo de Oracle, por ejemplo, que permite a los desarrolladores insertar o extraer varios registros con una sola llamada reduciendo asi el número de mensajes de red entre la aplicación y la base de datos lo cual es bueno. Pero si lo analizas, hay un punto en el que el rendimiento decrece. Es mucho mejor transportar 100 registros a la vez que 1,000 ya que para este último caso el método ya no es eficiente, especialmente por requerimientos de memoria.

Otro ejemplo es cuando se enfoca en aspectos equivocados del diseño o configuración del sistema, en lugar de aquellos en los que se puede mejorar el rendimiento (o, si es el caso, confiabilidad, disponibilidad o seguridad). Considera la experiencia convencional de optimizar el sistema para maximizar el 'buffer hit ratio'. Para algunas aplicaciones, es verdad que maximizar la oportunidad de que el sistema encuentre los datos en memoria aumentará el rendimiento. Sin embargo, en la mayoría de sistemas lo mejor es enfocarse en los cuellos de botella (lo que en el argot de Oracle se conocen como "wait states"), en lugar de centrarse en indicadores específicos. Atacarlas desde el diseño asegurará que el sistema tenga un buen desempeño.

A veces, buenas prácticas que se basaban, en parte, en un grado de certeza ya no aplican cuando los hechos cambian. Considera el viejo adagio, "poner índices y datos en distintos tablespaces para un mejor rendimiento". Hay administradores de base de datos que defienden a capa y espada esta idea sin tomar en consideración cambios en la velocidad de los discos y su capacidad, o lo relacionado con cargas de trabajo. Al evaluar esta "regla", se debería pensar en el hecho de que Oracle carga en memoria los bloques de base de datos usados recientemente y con frecuencia (a menudo bloques que pertenecen a un índice), y en el hecho de que hace uso de estos bloques de manera secuencial, no simultánea, para cualquier petición. Esto implica que las operaciones de I/O tanto para índices como para datos deberían repartirse entre todos los usuarios simultáneos y repartirse en todos los discos de los que se pueda disponer. Puedes elegir separar índices y datos por razones administrativas o por preferencia personal, pero no por rendimiento. Lo importante de esto es basar las decisiones en hechos, bastantes hechos.

No importa que tan veloces sean nuestras computadoras o que tan sofisticada pueda llegar a ser la base de datos, e independientemente del poder de nuestras herramientas de programación, simplemente no hay sustituto para la inteligencia humana acompañada con una "disciplina pensante". Si bien es importante aprender las complejidades de las tecnologías que usamos en nuestras aplicaciones, es aún más importante saber como pensar en darles el uso apropiado.

El libro de Tom no solo enseña sobre características de Oracle y como usarlas, también refleja muchos de estos pensamientos sencillos:
  • No creas en mitos. Razona por tí mismo.
  • No te vayas con la experiencia convencional. ¡A menudo las cosas que todo mundo sabe simplemente están mal!
  • Desconfia de los rumores u opiniones. Prueba las cosas tu mismo y fundamenta tus decisiones en ejemplos hechos.
  • Divide el problema en preguntas simples y arma las respuestas a cada paso en una solución elegante y eficiente.
  • No ejecutes cosas en tus programas cuando la base de datos las puede hacer mejor y más rápido.
  • Investiga sobre el tema y se escéptico de políticas injustificadas en la empresa para estándares técnicos.
  • Tómate el tiempo para PENSAR.

Aunado a esto, yo agregaría además los consejos de Steven Feuerstein que publiqué hace unos posts atrás. Si bien es cierto que lo ideal siempre es tener el tiempo y el equipo para hacer todas las pruebas que se necesitan la realidad es que pocas veces se tienen, muchas veces quizá por la falta de tiempo muchos se quedan con la idea de que lo que vieron que a otros les funcionó también funcionará para ellos y posiblemente así sea, sin embargo, con tantas combinaciones en cuanto a Oracle como base de datos, sistemas operativos y hardware, se podría tomar como base ese conocimiento pero queda de uno el probar que efectivamente será la solución del problema.

Una vez que tienes como solucionar el problema es importante ver también las implicaciones hacia los demás ya que en lugar de solucionarlo podrías estarlo solo cambiando de lugar.

Continuar leyendo...

lunes 16 de agosto de 2010

ORA-01220: file based sort illegal before database is open

Hace unos días trabajando con RMAN me topé con el mensaje descrito en el título. Se trataba de una base aún preproductiva y menor de 50 Gb de tamaño con un poco más de 30 datafiles. La actividad en ese momento consistía en restaurar los más de 30 datafiles junto con los control files, es decir, se simuló el peor escenario donde "todos" los archivos de base de datos se pierden. Con todos entre comillas me refiero solo a los archivos que se pueden restaurar desde RMAN, ya que la base incluye otros archivos más que no se consideran críticos para echar a andar un respaldo.

El mensaje completo es:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/11/2010 16:36:39
ORA-01220: file based sort illegal before database is open

Después de eliminar los control files junto con los más de 30 datafiles del filesystem, el comando para restaurarlos desde RMAN simplemente arrojó el mensaje anterior.

De acuerdo con la documentación de Oracle, el mensaje ORA-01220 se refiere a que se intentó ejecutar una consulta pero el buffer (memoria) para realizar ordenamientos no es lo suficientemente grande para llevarlo a cabo. Se trata específicamente de los parámetros SORT_AREA_SIZE y SORT_AREA_RETAINED_SIZE.

NAME                      TYPE     VALUE
------------------------- -------- -------
nls_sort                  string
sort_area_retained_size   integer  0
sort_area_size            integer  65536

Por default en 10g, el parámetro SORT_AREA_SIZE tiene un valor de 64K y el parámetro SORT_AREA_RETAINED_SIZE tiene 0, puesto que RMAN requiere hacer un ordenamiento pero el tamaño del buffer no le alcanza para hacerlo, acude al segundo recurso que es el TEMP (tablespace temporal), sin embargo, como la base de datos en este momento solo se encuentra en estado MOUNT no es posible utilizar el TEMP, de ahí que el único recurso sea aumentar el valor de esos dos parámetros.

SQL> alter system set sort_area_size=10485760 scope=spfile;

System altered.

SQL> alter system set sort_area_retained_size=10485760 scope=spfile;

System altered.

SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Database mounted.

SQL> show parameter sort

NAME                      TYPE     VALUE
------------------------- -------- -------
nls_sort                  string
sort_area_retained_size   integer  10485760
sort_area_size            integer  10485760

10 Mb deberían ser suficientes para lanzar el restore sin problemas. Una vez recuperado el respaldo y comprobado que la instancia abre sin problemas es necesario regresar los parámetros con sus valores originales. Como dba no lleva mucho tiempo darse cuenta de qué se trata y su posible solución, como implementador de soluciones de respaldo sin conocimientos profundos en RMAN u Oracle, como por ejemplo Data Protector de HP o Avamar de EMC que crean scripts personalizados para lanzarlos desde Recovery Manager, podría ser un dolor de cabeza ya que no tienen acceso para modificar parámetros -que de hecho no deberían hacerlo, solo previa autorización- o peor aún tardarse horas o días en encontrar de qué se trata el problema y aplicar la posible solución.

Continuar leyendo...

lunes 9 de agosto de 2010

Y tu, ¿Qué aplicaciones Open Source usas?

Todas las aplicaciones que instalamos en nuestras computadoras cuentan con un licenciamiento, comenzando por el sistema operativo. Las licencias van desde las que tienes que pagar recibiendo unicamente copia de los ejecutables hasta las que son libres (no confundir con gratis) y te dan acceso al código fuente.

La gran diferencia entre el software "gratis" y el de "código abierto" es que el primero va implícito en el segundo pero en el segundo tienes la oportunidad de ver como es la aplicación por dentro, es decir, su código fuente. Como usuario final lo más importante es aprovechar al máximo la facilidad de uso que te brinda una aplicación, como desarrollador es interesante ver como son aplicadas diversas técnicas de programación, desde la forma de escribir el código hasta el empleo de paradigmas computacionales tanto simples como avanzados.

Las aplicaciones Open Source de uso cotidiano que no pueden faltar en mi máquina:
  • Firefox - No necesita descripción.
  • Thunderbird - Excelente cliente de correo.
  • Workrave - Te ayuda a hacer pausas en el uso de la computadora. Excelente para quienes pasan periodos largos de tiempo frente a una.
  • Notepad++ - Excelente editor de texto, con muchas y muy útiles opciones.
  • WinSCP - Mejor y más completo cliente para transferencia de archivos que Filezilla (para mi gusto claro).
  • PDFCreator - Excelente aplicación para crear archivos PDF via una impresora virtual, con muchas otras opciones de formatos de salida, no solo PDF. Muy recomendable para esas ocasiones en que necesitas guardar páginas web.
  • Cygwin - Emulador de comandos Linux para Windows. Recomendable para los administradores que no temen a la línea de comandos.
  • Privoxy - ¿Cansado de ver sitios web donde lo que más resalta (y en osaciones estorba) es la publicidad? Con esta aplicación te olvidarás de toda esa basura visual.
  • GIMP - Excelente aplicación para manipular imágenes.
  • MKVToolnix - Excelente herramienta para manipular archivos tipo Matroska.
  • Jubler - Muy buena aplicación para editar archivos de subtítulos (SRT) aunque podría ser todavía mejor.
  • SharpDevelop - Muy buena IDE para programar en C#, entre otros lenguajes de programación de la plataforma .NET
  • Media Player Classic - Home Cinema - Reproductor multimedia con soporte para varios formatos multimedia.

Continuar leyendo...

viernes 6 de agosto de 2010

Transporte de datos encriptados con ASO

Por default, la comunicación entre la base de datos y un cliente remoto se lleva a cabo sin ningún método de encriptamiento, es decir, que todas las instrucciones ejecutadas así como los datos pueden ser interceptados por alguien que esté a la escucha en la red usando un 'sniffer'. En empresas donde se maneja información confidencial el riesgo de fuga es muy alto por lo que alguien con habilidades en reconocimiento de patrones podría fácilmente hacerse de esta información.

Oracle tiene una funcionalidad llamada 'Oracle Advanced Security' la cual es necesario configurar tanto en el servidor como en el cliente. Esta configuración se hace en el archivo sqlnet.ora por lo que no es necesario alterar las aplicaciones ni reiniciar la instancia. Las conexiones remotas hechas después de la configuración ya estarán empleando el método de encriptamiento que se haya definido no así las conexiones ya existentes.

En el esquema SCOTT tengo la tabla CUSTOMER con la siguiente definición y datos:
SQL> select name,credit_card from scott.customer;

NAME     CREDIT_CARD
-------- --------------------
sergio   1234-1234-1234-1234
pedro    1234-1234-1234-1235
juan     1234-1234-1234-1236

Usando la herramienta IP Tools como 'sniffer' y aplicándolo al query anterior obtenemos lo siguiente.

La definición:

y el resultado:


Además de muchos caracteres conocidos y otro tanto extraños, vemos que se logra distinguir a simple vista los nombres 'sergio', 'pedro', 'juan' acompañados de sus números de tarjetas de crédito. En un ambiente productivo esta situación por supuesto que no es aceptable.

He aquí donde entra en juego la seguridad a través de encriptamiento.

Usando la herramienta 'Oracle Net Manager' expandes el nodo 'Local' y seleccionas 'Profile'. En la parte superior del panel derecho abres el 'combo box' y seleccionas 'Oracle Advanced Security'.


Si la opción 'Oracle Advanced Security' no aparece desplegada, tendrás que hacer lo siguiente. Edita el archivo NetProperties del directorio $ORACLE_HOME/network/tools, y agrega "ASO" al final de la línea que comienza con "INSTALLEDCOMPONENTS".
INSTALLEDCOMPONENTS=CLIENT,ORACLENET,ANO,ASO

Cierra el 'Oracle Net Manager' y ejecútalo nuevamente, la opción 'Oracle Advanced Security' ya debería aparecer.

Selecciona la pestaña 'Integrity', en el item 'Integrity' selecciona "SERVER", en 'Checksum Level' selecciona "requested" y en la lista 'Available Methods' selecciona "MD5" y presiona el botón con '>'


Después selecciona la pestaña 'Encryption', en el item 'Encryption' selecciona "SERVER", en 'Encryption Type' selecciona "requested", en 'Encryption Seed' escribe una cadena lo suficientemente larga que servirá para hacer el cifrado y en la lista 'Available Methods' selecciona "3DES168" y presiona el botón con '>'


La configuración en cada uno de los clientes es básicamente la misma, solo tienes que cambiar el valor de los items 'Integrity' y 'Encryption' de "SERVER" a "CLIENT" y especificar en 'Encryption Seed' una cadena totalmente distinta a la del servidor.



No olvides grabar las configuraciones hechas en 'Oracle Net Manager' (File -> Save Network Configuration), luego cuando se nos olvida nos preguntamos por qué no funciona e incluso se llega a buscar una solución más allá del problema, suele pasar :) .

Finalmente, para probar que todo funciona correctamente hay que cerrar la sesión de SQL*Plus, abrir una nueva, habilitar el 'sniffer' y ejecutar el query sobre la tabla scott.customer nuevamente.

Vemos ahora que solo aparece un conjunto de caracteres sin sentido y no es posible ver la definición:

así como tampoco es posible ver ya los datos:


Todos los métodos de encriptamiento mostrados en 'Oracle Net Manager' son estándares industriales, por lo que dependerá prácticamente del grado de encriptamiento que se requiera el que se elija cualquiera de ellos.

¿Cambios en las aplicaciones? Ninguno. ¿Suspensión del servicio de base de datos? Ninguno. ¿Grado de confiabilidad? Completo.

Nota: Como la mayoría de "componentes extra" que vienen con la base de datos, es posible que esta funcionalidad tenga un costo de licenciamiento extra por lo que recomendaría verificarlo antes de implementarlo en un ambiente productivo.

Continuar leyendo...

miércoles 4 de agosto de 2010

Obteniendo DDLs con Oracle export/import y Pretoria

Una manera rápida y elegante de extraer las instrucciones DDL de la base de datos es crear un archivo dmp solo con las estructuras, extraer las instrucciones SQL con import (opción indexfile) y aplicarle formato con Pretoria.

Pretoria es una herramienta que analiza la estructura del archivo creado con import -específicamente con la opción indexfile-. Puede buscar y reemplazar los parámetros de almacenamiento de las tablas, índices y clusters, además de separar las instrucciones de creación de tablas e índices en su propio archivo. Con estos archivos se pueden pre-crear todos los segmentos de la base de datos, básicamente para reorganizarla. Si se tiene una base de datos con cientos de tablas, hacer una reorganización manual en las instrucciones DDL llevaría mucho tiempo. Emplear Pretoria toma solo unos minutos.

Creando el archivo dmp

La herramienta de Oracle export básicamente lo que hace es extraer la definición de los segmentos de base de datos (tablas, índices) y los datos que contienen. Para este ejercicio usaré el esquema SCOTT creado por Oracle como parte de los esquemas de ejemplo para una base de datos 10gR2 montada en Linux RHEL 4.

Si SCOTT está bloqueado, habrá que desbloquearlo y asignarle una contraseña.
SQL> alter user scott account unlock;

User altered.

SQL> alter user scott identified by tiger;

User altered.

Se ejecuta el export sin segmentos de bd.
[oracle@testserver ~]$ exp scott/tiger@orcl file=~/sch_scott.dmp owner=scott grants=n rows=n statistics=none

Export: Release 10.2.0.4.0 - Production on Tue Aug 3 12:40:14 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
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
Note: table data (rows) will not be exported
Note: grants on tables/views/sequences/roles will not be exported
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user SCOTT
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user SCOTT
About to export SCOTT's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export SCOTT's tables via Conventional Path ...
. . exporting table                          BONUS
. . exporting table                           DEPT
. . exporting table                            EMP
. . exporting table                          SALES
. . exporting table                       SALGRADE
. . exporting table                          TEST3
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.

Puedes especificar en lugar de owner=y sea full=y o incluso por tablas específicas.

Creando el archivo indexfile

Se crea el archivo de índices -opción indexfile- con import.
[oracle@testserver ~]$ imp scott/tiger@orcl file=sch_scott.dmp fromuser=scott touser=scott indexfile=sch_scott.idx constraints=y

Import: Release 10.2.0.4.0 - Production on Tue Aug 3 12:47:02 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

Export file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
Import terminated successfully without warnings.

El archivo resultante 'sch_scott.idx' contiene las DDL de tablas, constraints e índices. Las dos primeras aparecen como comentarios (con REM al principio de la línea) lo único legible a primera vista son las instrucciones CREATE INDEX. Es aquí donde entra en juego la herramienta Pretoria. La ejecución del import con la opción indexfile en realidad no ejecuta ninguna instrucción DDL o importa datos (en caso de usar un archivo dmp completo) lo único que hace es extraer las DDLs y almacenarlas en el archivo especificado en la opción indexfile.

Segregando instrucciones DDL

Pretoria es en realidad un conjunto de clases Java convertidas a este lenguaje multiplataforma para evitar los inconvenientes que representa la codificación de shell scripts en los diferentes tipos de *nix particularmente la herramienta AWK. En la parte de documentación trae una gráfica con el esquema que los desarrolladores emplearon para hacerlo eficiente.

Si lo que nos interesa es extraer las instrucciones DDL tal como están, basta con ejecutar la siguiente instrucción:
[oracle@testserver ~]$ java Pretoria -i sch_scott.idx -ot scott_tables.ddl -oi scott_indexes.ddl -nc
Spawn input thread !
Spawn process threads !
Spawn output threads !
Input thread done !
All done !

Con esto, el archivo sch_scott.idx apenas legible a primera vista es procesado y dividido en dos archivos, uno con la definición de las tablas y otro con la definición de índices y constraints.

Ejemplo de código sin aplicar Pretoria:
REM CREATE TABLE "SCOTT"."BONUS" ("ENAME" VARCHAR2(10), "JOB"
REM VARCHAR2(9), "SAL" NUMBER, "COMM" NUMBER) PCTFREE 10 PCTUSED 40
REM INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST
REM GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS ;
REM CREATE TABLE "SCOTT"."DEPT" ("DEPTNO" NUMBER(2, 0), "DNAME"
REM VARCHAR2(14), "LOC" VARCHAR2(13)) PCTFREE 10 PCTUSED 40 INITRANS 1
REM MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1
REM BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS ;

Ejemplo de código aplicando Pretoria:
CREATE TABLE "SCOTT"."BONUS"
  ( "ENAME" VARCHAR2 ( 10 ) ,
  "JOB" VARCHAR2 ( 9 ) ,
  "SAL" NUMBER ,
  "COMM" NUMBER )
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE
  ( INITIAL 65536
  FREELISTS 1
  FREELIST GROUPS 1
  BUFFER_POOL DEFAULT ) TABLESPACE "USERS" LOGGING NOCOMPRESS ;

CREATE TABLE "SCOTT"."DEPT"
  ( "DEPTNO" NUMBER ( 2 ,0 ) ,
  "DNAME" VARCHAR2 ( 14 ) ,
  "LOC" VARCHAR2 ( 13 ) )
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE
  ( INITIAL 65536
  FREELISTS 1
  FREELIST GROUPS 1
  BUFFER_POOL DEFAULT ) TABLESPACE "USERS" LOGGING NOCOMPRESS ;

Ejemplo especificando archivo de parámetros.
[oracle@testserver ~]$ java Pretoria -s storage -i sch_scott.idx -ot scott_tables.ddl -oi scott_indexes.ddl -nc
Hashing storage parameters...
Done !
Spawn input thread !
Spawn process threads !
Spawn output threads !
Input thread done !
All done !

El archivo parámetros debe contener lo que necesitamos actualizar en el script de salida. Para el ejemplo anterior solo especifiqué que actualice el tablespace para las tablas BONUS y DEPT:
"SCOTT"."BONUS" TABLESPACE TS1
"SCOTT"."DEPT" TABLESPACE TS2

Siendo el resultado:
CREATE TABLE "SCOTT"."BONUS"
  ( "ENAME" VARCHAR2 ( 10 ) ,
  "JOB" VARCHAR2 ( 9 ) ,
  "SAL" NUMBER ,
  "COMM" NUMBER )
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE
  ( INITIAL 65536
  FREELISTS 1
  FREELIST GROUPS 1
  BUFFER_POOL DEFAULT ) TABLESPACE TS1 LOGGING NOCOMPRESS ;

CREATE TABLE "SCOTT"."DEPT"
  ( "DEPTNO" NUMBER ( 2 ,0 ) ,
  "DNAME" VARCHAR2 ( 14 ) ,
  "LOC" VARCHAR2 ( 13 ) )
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE
  ( INITIAL 65536
  FREELISTS 1
  FREELIST GROUPS 1
  BUFFER_POOL DEFAULT ) TABLESPACE TS2 LOGGING NOCOMPRESS ;

Cambiando el tablespace de USERS a TS1 para la tabla BONUS y TS2 para DEPT.

Todavía mejor aún, si vas a reorganizar la base de datos moviendo las tablas de tablespace puedes hacerlo con la siguiente línea en el archivo de parámetros:
DEFAULT_TABLE("SCOTT") TABLESPACE TS_DATA

Haciendo que a todas las tablas del esquema SCOTT se les asigne el tablespace TS_DATA por default, bastante útil si se trata de cientos de tablas. Puedes incluso especificar el tablespace en tablas particulares, por ejemplo:
DEFAULT_TABLE("SCOTT") TABLESPACE TS_DATA
"SCOTT"."BONUS" TABLESPACE TS1

es decir, asigna por default a las tablas del esquema SCOTT el tablespace TS_DATA excepto a la tabla BONUS a la cual le vas a asignar TS1.

Además del tablespace los parámetros que puedes especificar en el archivo para actualizar el script con estos valores están:
  • PCTUSED
  • PCTFREE
  • INITIAL
  • NEXT
  • MINEXTENTS
  • MAXEXTENTS
  • PCTINCREASE
  • FREELISTS
  • FREELIST GROUPS
  • INITRANS
  • MAXTRANS
  • DEGREE

El resto de las opciones que incluye Pretoria pueden verse ejecutando:
[oracle@testserver ~]$ java Pretoria
java Pretoria [-l] [-ss] [-nc] [-nv] -i <indexfile> -s <storagefile> -ot <table outputfile> -oi <index outputfile>
java Pretoria -p [-l] [-ss][-nc] [-nv] -i <indexfile> -ot <table outputfile> -oi <index outputfile>
java Pretoria -p [-l] [-ss] [-nc] [-nv] -o1|2 -i <indexfile> -ot <table outputfile> -oi <index outputdiretory> -oc <contraint outputfile>
-i      : indexfile name
-s      : storage parameter file - not used in combination with -p switch
-ot     : outputfile for table DDL
-oi     : outputfile for index DDL
-oi     : using -o1 switch - output directory for index DDL
-oc     : using -o1 or -o2 switch - outputfile for constraint DDL
-o1     : output mode 1
-o2     : output mode 2
-l      : line mode - print each DDL statement on one cowabunga line
-p      : pretty printing only - do not process new storage parameters
-ss     : strip storage clause - except for LOB's
-nc     : no connect - do not generate CONNECT commands
-nv     : no validate - add NOVALIDATE in enable constraint DDL

Pretoria 3c - Kurt Van Meerbeeck - www.ora600.be

En la parte superior de los scripts generados por Pretoria aparece un apartado en comentarios donde los autores mencionan que antes de ejecutar el script en SQL*Plus deben activar lo siguiente 'set SQLBLANK on' ya que puede haber líneas en blanco entre las líneas de las instrucciones lo que daría lugar a errores al momento de ejecutarlo.

Continuar leyendo...