miércoles, 23 de marzo de 2011

Oracle10g: Poner la base de datos en modo archivelog y hacer backups con rman

El modo archivelog de una base de datos Oracle protege contra la pérdida de datos cuando se produce un fallo en el medio físico y es el primer paso para poder hacer copias de seguridad(en caliente!!) con rman. Para poner la base de datos en modo archivelog (sin usar la flash recovery area) debemos hacer básicamente dos cosas, añadir dos parámetros nuevos al fichero de configuración, reiniciar la base de datos y cambiar el modo trabajo a archivelog.
Como poner la base de datos Oracle 10g en modo archivelog
  1. Editamos el init.ora para añadir los siguientes parámetros
    *.log_archive_dest='/ejemplo/backup/'
    *.log_archive_format='SID_%r_%t_%s'
     
  2. Reiniciamos la base de datos para que coja los cambios y nos aseguramos.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount pfile='/ejemplo/pfile/init.ora
    ORACLE instance started.

    Total System Global Area  272629760 bytes
    Fixed Size                   788472 bytes
    Variable Size             103806984 bytes
    Database Buffers          167772160 bytes
    Redo Buffers                 262144 bytes
    Database mounted.
    SQL> alter database archivelog;
    Database altered.
    SQL> alter database open;
    Database altered.
    SQL> create spfile;
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
Backups con RMAN

Una vez tenemos la base de datos funcionando en modo archivelog ya podemos plantearnos hacer los backups con rman. Para hacerlos basta con editar un script donde básicamnte hacemos la copia y mantenemos archives en base a cuantos copias queremos mantener y cada cuando ejecutaremos el script. Solo debemos tener cuidado y dimensionar correctamente el número de copias y archivelog que mantemos en base al espacio disponible en el disco. Para saber cuanto espacio necesitaremos podemos aplicar la siguiente formula, suponiendo que la copia sea diaria:
Espacio necesario = (num_backups_rman_mantenidos*tamanyo_backups_rman)+(media_num_redos_al_dia)*(dias_mantenidos).
 
Pasos para empezar a hacer backups:
  1. Editamos el script de sistema para el lanzamiento (/ejemplo/scripts/rman.sh) :
    #!/bin/bash
    export ORACLE_HOME=/opt/oracle/product/10.2/db_1/
    export ORACLE_SID=SID
    /opt/oracle/product/10.2/db_1/bin/rman @/ejemplo/scripts/rman.sql > /backup/scripts/rman.log
     
  2. Script sql que lanzaremos con el sh anterior (/ejemplo/scripts/rman.sql). No hace falta comentarlo porque es muy fácil leer lo que está haciendo en cada paso. Vereis también donde se indica la caducidad de los backups y los archives. connect target root/password@SID
    run {
    CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;
    CONFIGURE CONTROLFILE AUTOBACKUP ON;
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/ejemplo/backup/%F';
    CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/ejemplo/backup/%d_%Y%M%D%U';
    CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;
    CONFIGURE MAXSETSIZE TO 8000M;
            backup database
            include current controlfile
            plus archivelog;
    CROSSCHECK BACKUP completed before 'sysdate - 4';     
    DELETE NOPROMPT OBSOLETE;                             
    DELETE NOPROMPT ARCHIVELOG UNTIL TIME "SYSDATE - 4";
    delete noprompt expired backup;
    delete noprompt expired archivelog all;
    report schema;
    }
    exit;
     
  3. Programamos la tarea (crontab?) y listo!!

Reducción de Segmentos en Oracle 10g: Shrink Table

En Oracle 10g existe una nueva funcionalidad para a la recuperación del espacio ocupado por una tabla sin necesidad de recrearla: SHRINK TABLE
Es habitual en versiones anterior a la versión 10g el problema generado por el borrado de registros de una tabla y la generación de “huecos” a nivel de los bloques que componen esa tabla. A modo de ejemplo: es habitual la duda tras el borrado masivo de muchos registros de una tabla (o de todos) y la comprobación tras la eliminación de los registros de que la tabla ocupa exactamente lo mismo (misma HWM – High Water Mark).
Esta situación también se da en sistemas OLTP donde con el tiempo, y con las inserciones/borrados de registros en determinadas tablas, se van generando espacio no reutilizables por las nuevas inserciones por falta de espacio en los bloques incompletos, y a la larga caídas de rendimiento en los sistemas.
El método tradicional para recuperar este espacio consistía en realizar periódicamente export/import de la tabla en cuestión o recreación de la misma. Eso conllevaba una serie de problemas en la práctica como invalidación de índices, vistas, procedimientos…
En Oracle 10g surge la funcionalidad shrink table, que no sólo permite la recuperación de este espacio y recuperación del acceso óptimo a la misma, sino que permite realizarlo en 2 fases diferenciadas disminuyendo el tiempo de afectación a los usuarios.
Para llevar a cabo esta recuperación de espacio es necesario seguir los siguientes pasos:
1)Habilitación de movimientos de filas:
ALTER TABLE tabla ENABLE ROW MOVEMENT;
2)Movimiento de las filas:
ALTER TABLE tabla SHRINK SPACE COMPACT;
3)Reseteo HWM
ALTER TABLE tabla SHRINK SPACE;
Tan solo durante el último punto del procedimiento existe bloqueo de tabla, pero sin duda el punto 2 es el más costoso en tiempo y se puede hacer totalmente online.

Indices invisibles en Oracle 11g

A partir de la versión 11g Oracle permite la creación de índices llamados invisibles que permiten llevar realizar cosas realmente interesantes.

Esta invisibilidad se refiere a que el optimizador no tiene en cuenta la existencia de estos índices para la generación de los planes de ejecución.
Esto puede resultar muy interesante en bases de datos en Producción por ejemplo para:
  • En el caso de probar nuevos índices sin afectar a las sentencias SQL de las aplicaciones que atacan a la base de datos, puesto que se pueden activar/desactivar de manera muy rápida.
  • En el caso de querer probar ciertas sentencias SQL de aplicaciones sin índice sin tener que borrar el índice y perder tiempo recreándolo..
A partir de la versión 11g Oracle permite la creación de índices llamados invisibles que permiten llevar realizar cosas realmente interesantes.
Esta invisibilidad se refiere a que el optimizador no tiene en cuenta la existencia de estos índices para la generación de los planes de ejecución.
Esto puede resultar muy interesante en bases de datos en Producción por ejemplo para:
  • En el caso de probar nuevos índices sin afectar a las sentencias SQL de las aplicaciones que atacan a la base de datos, puesto que se pueden activar/desactivar de manera muy rápida.
  • En el caso de querer probar ciertas sentencias SQL de aplicaciones sin índice sin tener que borrar el índice y perder tiempo recreandolo.
Mientras un índice permanece invisible se va actualizando con las sentencias DDL (insert, update, ...), de manera que, los hace perfectos para este tipo de pruebas.
Un índice invisible se puede crear invisible o se puede alterar para que sea visible o invisible. Se puede consultar en que estado está un índice mediante la columna "visibility" de la vista DBA_INDEXES.
Un nuevo parámetro de inicialización controla la visibilidad o no de los índices invisibles "optimizer_use_invisible_indexes". Es decir, que aunque un índice sea invisible, si esta parámetro tiene el valor TRUE, el optimizador los ve y los puede usar sin problemas. Por lo que, recomiendo dejarlo siempre con el valor por defecto FALSE.

Ejemplo:
1) Verificamos el valor del parámetro que controla la visibilidad de los índices invisibles:
SQL> show parameter optimizer_use_invisible_indexes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_use_invisible_indexes boolean FALSE
2) Creamos una tabla de ejemplo con un indice visible:
SQL> create table prueba as select * from dba_tables;

SQL> create index i_prueba on prueba (table_name);
3) Consultamos su visibilidad
SQL> select index_name , visibility from dba_indexes where index_name = 'I_PRUEBA';

INDEX_NAME VISIBILITY
------------------------------ ------------------------------ ---------
I_PRUEBA VISIBLE
4) Consultamos su plan de ejecución forzando el uso del índice: Al ser visible el índice lo usará sin problemas.
SQL> explain plan
2> select /*+ index(prueba i_prueba) */ * from t where table_name

Explained.

SQL> select * from table(DBMS_XPLAN.DISPLAY);
Plan hash value: 2609566873

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 18 | 1 (0)| 00:00:02 |
|* 1 | INDEX UNIQUE SCAN |I_PRUEBA | 1 | 18 | 1 (0)| 00:00:02 |
----------------------------------------------------------------------------------------
5) Hacemos invisible el índice
SQL> alter index I_PRUEBA invisible;
6) Consultamos su plan de ejecución forzando el uso del índice con un HINT: El optimizador no tiene en cuenta el índice invisible.
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 93 | 1008 | 31 (0)| 00:00:20 |
|* 1 | TABLE ACCESS FULL | T | 93 | 1008 | 31 (0)| 00:00:20 |
----------------------------------------------------------------------------------------

Cómo crear un nuevo esquema en Oracle paso a paso

Vamos a ver en tres sencillos pasos cómo crear un nuevo esquema-usuario de Oracle. Para poder realizar estos pasos es necesario iniciar la sesión en la base de datos con un usuario con permisos de administración, lo más sencillo es utilizar directamente el usuario SYSTEM:
  • Creación de un tablespace para datos y otro para índices. Estos tablespaces son la ubicación donde se almacenarán los objetos del esquema que vamos a crear.
Tablespace para datos, con tamaño inicial de 1024 Mb, y auto extensible
CREATE TABLESPACE "APPDAT" LOGGING
DATAFILE '/export/home/oracle/oradata/datafiles/APPDAT.dbf' SIZE 1024M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
Tablespace para índices, con tamaño inicial de 512 Mb, y auto extensible
CREATE TABLESPACE "APPIDX" LOGGING
DATAFILE '/export/home/oracle/oradata/datafiles/APPIDX.dbf' SIZE 512M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
La creación de estos tablespaces no es obligatoria, pero sí recomendable, así cada usuario de la BD tendrá su propio espacio de datos.
  • Creación del usuario que va a trabajar sobre estos tablespaces, y que será el propietario de los objetos que se se creen en ellos
CREATE USER "APP" PROFILE "DEFAULT" IDENTIFIED BY "APPPWD"
DEFAULT TABLESPACE "APPDAT" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
Si no se especifica un tablespace, la BD le asignará el tablespace USERS, que es el tablespace que se utiliza por defecto para los nuevos usuarios.
Se puede apreciar también que no hay ninguna referencia al tablespace de índices APPIDX que hemos creado. Si queremos mantener datos e índices separados habrá que acordarse de especificar este tablespace en las sentencias de creación de índices de este usuario, si no se hace éstos se crearán en APPDAT:
CREATE INDEX mi_indice ON mi_tabla(mi_campo)
TABLESPACE APPIDX;
  • Sólo falta asignarle los permisos necesarios para trabajar. Si se le asignan los roles 'Connect' y 'Resource' ya tiene los permisos mínimos, podrá conectarse y poder realizar las operaciones más habituales de consulta, modificación y creación de objetos en su propio esquema.
GRANT "CONNECT" TO "APP";
GRANT "RESOURCE" TO "APP";
Completamos la asignación de permisos con privilegios específicos sobre objetos para asegurarnos de que el usuario pueda realizar todas las operaciones que creamos necesarias
GRANT ALTER ANY INDEX TO "APP";
GRANT ALTER ANY SEQUENCE TO "APP";
GRANT ALTER ANY TABLE TO "APP";
GRANT ALTER ANY TRIGGER TO "APP";
GRANT CREATE ANY INDEX TO "APP";
GRANT CREATE ANY SEQUENCE TO "APP";
GRANT CREATE ANY SYNONYM TO "APP";
GRANT CREATE ANY TABLE TO "APP";
GRANT CREATE ANY TRIGGER TO "APP";
GRANT CREATE ANY VIEW TO "APP";
GRANT CREATE PROCEDURE TO "APP";
GRANT CREATE PUBLIC SYNONYM TO "APP";
GRANT CREATE TRIGGER TO "APP";
GRANT CREATE VIEW TO "APP";
GRANT DELETE ANY TABLE TO "APP";
GRANT DROP ANY INDEX TO "APP";
GRANT DROP ANY SEQUENCE TO "APP";
GRANT DROP ANY TABLE TO "APP";
GRANT DROP ANY TRIGGER TO "APP";
GRANT DROP ANY VIEW TO "APP";
GRANT INSERT ANY TABLE TO "APP";
GRANT QUERY REWRITE TO "APP";
GRANT SELECT ANY TABLE TO "APP";
GRANT UNLIMITED TABLESPACE TO "APP";
Ahora el usuario ya puede conectarse y comenzar a trabajar sobre su esquema

Como obtener la lista de tablas con más movimiento(insert,update) en Oracle

A fin de obtener una lista aproximada de las tablas con más movimientos de la base de datos podemos consultar el contenido de la tabla dba_tables y cruzarlo con el estado actual de cada tabla en la bbdd. Esto puede tener sentido cuando queremos confeccionar una lista de tablas a las que se debe actualizar estadísticas periódicamente o queremos controlar la cantidad de información que genera alguna aplicación en concreto. Los datos que obtenemos por cada tabla son siempre respecto al último analisis de la misma.
La siguiente forma de hacerlo es un poco "rupestre" pero útil a la vez:
  1. Nos conectamos a la base de datos como system y ejecutamos la siguiente consulta que nos devolvera una lista de selects con todas las tablas de la base de datos (es mejor filtrar para no incluir las tablas de sistema o incluir solo las de un usuario en concreto). En el ejemplo obtendremos solo las de un usuario en concreto:


    select 'select ''' || table_name || ''' as TABLA, ''' || sysdate ||
    ''' as FECHA_ACTUAL, ''' || last_analyzed ||
    ''' as ULTIMO_ANALISIS, count(*) as RECUENTO,' || num_rows ||
    ' as RECUENTO_ANALISIS , to_date(''' || sysdate ||
    ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
    ''',''DD/MM/YYYY'') as DIAS_DESDE_ANALISIS , count(*) - ' || num_rows ||
    ' as DIFERENCIA_RECUENTO, (count(*) - ' ||
    num_rows || ')/(to_date(''' || sysdate ||
    ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
    ''',''DD/MM/YYYY'')) as INCREMENTO_DIARIO from ' || owner || '.' ||
    table_name || ' union '
    from dba_Tables
    where owner = 'USUARIO'


    Ejemplo del resultado con plsql:



   2. Copiamos toda la columna en el portapapeles y quitamos el último union. Obtendremos el siguiente resultado:



Podemos ver la tabla con los datos del último analisis de la tabla respecto a los actuales y la variación con su media diaria en número de registros (teniendo en cuenta que un insert(1row) + delete(1row) = 0movimientos )

Si a esto le sumamos otros datos como tamaños de fila, si la tabla tiene índices y lo que se nos ocurra podemos hacer otros "trabajos manuales" como acumular esos resultados en una tabla para ver que se cuece en nuestra base de datos.  Eso sí, cada uno puede adaptar esta técnica a su gusto para cubrir sus necesidades.

Acceso remoto mediante DBLINK de Oracle

Para acceder desde una base de datos Oracle a objetos de otra base de datos Oracle la manera más sencilla es utilizar un DBLINK (que sea la más sencilla no significa que siempre sea la más aconsejable, el abuso de los DBLINKS puede generar muchos problemas, tanto de rendimiento como de seguridad)
Para ello es necesario, con un usuario que posea el privilegio CREATE DATABASE LINK, crear el DBLINK en la base de datos origen (A) mediante una sencilla sentencia como la siguiente:

Create database link LNK_DE_A_a_B connect to USUARIO identified by CONTRASEÑA USING 'B';

 
'LNK_DE_A_a_B' es el nombre del link, 'USUARIO' y 'CONTRASEÑA' son los identificadores del usuario que utilizará el link para conectarse, los permisos del cual heredarán todos los accesos a través del link, y B es el nombre de la instancia de la base de datos.
A través del DBLINK se puede conectar con los objetos de la base de datos remota con los permisos que tenga el usuario que se ha proporcionado en la sentencia de creación.

Para referenciar un objeto de la base de datos remota se ha de indicar el nombre del objeto, concatenado con el carácter '@' y el nombre que se le ha dado al DBLINK.
Ejemplo:

select * from TABLA@LNK_DE_A_a_B

Documentar, Monitorear y Administrar en ORACLE

Aproveche las nuevas características de Oracle SQL Developer 1.5. Oracle SQL Developer 1.5 presenta una gran cantidad de nuevas funciones. Incluso características que pueden parecer insignificantes a primera vista, pueden ayudarlo con su trabajo diario considerablemente. Esta columna explora las características de Oracle SQL Developer 1.5 que ayudan a documentar y administrar sus objetos y esquemas de Oracle Database. Usted aprenderá a:
  • Compartir fácilmente los detalles de objetos con otros participantes de sus proyectos
  • Utilizar informes instantáneos para obtener detalles sobre las sesiones y espacios de tabla de su base de datos, terminar sesiones y cerrar la base de datos
  • Aprovechar los servicios copiar y exportar para facilitar el trabajo con múltiples esquemas

Comienzo
Los ejemplos de esta columna requieren Oracle SQL Developer 1.5.1. Si tiene instalada la versión de producción de Oracle SQL Developer 1.5, ábrala y utilice Help -> Check For Updates para realizar la actualización en Oracle SQL Developer 1.5.1. De lo contrario, descargue la instalación completa de Oracle SQL Developer 1.5.1 desde OTN y descomprímalo en una nueva carpeta vacía. (No lo descomprima en una carpeta existente de Oracle SQL Developer)
Puede migrar sus conexiones de base de datos y preferencias de Oracle SQL Developer 1.2.x ó 1.5 a Oracle SQL Developer 1.5.1 durante la instalación. Si no desea migrar las preferencias, todavía podrá importar las conexiones de base de datos de cualquier versión anterior después de la instalación. Para importar las conexiones:
  1. Inicie la versión anterior de Oracle SQL Developer
  2. Seleccione Connections en el Navegador de Conexiones
  3. Haga un click derecho y seleccione Export Connections
  4. Busque una ubicación adecuada, ingrese un nombre de archivo como connections.xml, y haga click en Guardar
  5. Cierre la versión anterior e inicie Oracle SQL Developer 1.5.1
  6. Seleccione Connections en el Navegador de Conexiones
  7. Haga un click derecho y seleccione Import Connections
  8. Busque el archivo que acaba de guardar, haga click en Open y en OK
Para esta columna, usted también necesita tener acceso a los esquemas de muestra HR y OE en una instancia Oracle Database.
Generar la Documentación de la Base de Datos
Usted puede generar documentación sobre su esquema en formato HTML para control propio o para compartir con otras personas. Siga estos pasos para generar y ver la documentación del esquema:
  1. Si usted todavía no tiene una conexión al esquema HR, genere uno y denomínelo HR_ORCL. (para obtener información detallada vea “Generar Conexiones de Base de Datos”, en la edición de mayo/junio de 2008 de Oracle Magazine).
  2. Haga un click derecho en la conexión HR_ORCL, y seleccione Generar DB Doc.
  3. Seleccione o genere una ubicación adecuada para los archivos creados, como \working. Si planea compartir los archivos creados con otras personas, utilice una ubicación compartida para servidores de archivos. (Usted también puede mover o copiar los archivos generados).
Un archivo index.html debería abrirse automáticamente en su browser por defecto. Si no es así, navegue en un browser hasta el archivo \working\index.html y ábralo.
Para ver los detalles para cualquier objeto de base de datos en la documentación HTML, seleccione el tipo de objeto en el panel del esquema en la parte superior izquierda. Una lista de todos los objetos de ese tipo aparece en un panel debajo del panel de esquema. Seleccione un objeto para desplegar los detalles en el panel central. Por ejemplo, para desplegar los detalles de la tabla EMPLOYEES, seleccione Tables del panel superior y EMPLOYEES del panel inferior (ver Figura 1).
Figura 1
Figura 1: Documentación generada para el esquema HR
Monitoreo y Administración con Informes
La función View -> Reports de Oracle SQL Developer permite seleccionar varios informes estándar del sistema para ver los detalles de su base de datos y esquemas. Asimismo, para un fácil acceso, hay dos informes disponibles desde el menú Tools y del Navegador de Conexiones, respectivamente. Ambos son adecuados para usuarios privilegiados como SYSTEM o SYS. (usted también puede ejecutarlos como usuario no privilegiado, como HR, con algunas limitaciones)
El informe de Sesiones muestra los detalles de las sesiones actuales activas e inactivas. Siga estos pasos para desplegar el informe de Sesiones:
  1. Genere una nueva conexión denominada SYSTEM_ORCL para el usuario SYSTEM.
  2. Seleccione Tools -> Monitor Sessions.
  3. Seleccione SYSTEM_ORCL en el cuadro de diálogo Select Connection y haga un click en OK para abrir el informe.
Los usuarios privilegiados pueden terminar una sesión desde el informe de Sesiones—por ejemplo, cuando la sesión de un usuario no ha cerrado adecuadamente. (el esquema HR por defecto no puede terminar las sesiones). Si la conexión HR todavía está activa del ejercicio anterior, por ejemplo, seleccione la sesión HR del informe de Sesiones que acaba de generar, presione el botón derecho del mouse y seleccione Kill Session, y haga un click en Apply.
El otro informe disponible en este nivel es el informe Manage Database. Presione el botón derecho del mouse sobre la conexión SYSTEM_ORCL del Navegador de Conexiones, y seleccione Manage Database. El informe muestra detalles de los espacios de tabla de su base de datos. Si usted ejecuta este informe desde una conexión SYS, puede cerrar y reiniciar la base de datos desde Oracle SQL Developer. (el botón de cierre no está disponible para usuarios no privilegiados)
Copiar Objetos a un Esquema Nuevo
Trabajar con múltiples esquemas a menudo implica copiar objetos y sus datos de un esquema a otro. Hay varias maneras de hacer esto en Oracle SQL Developer:
  • Copiar los objetos paso a paso, primero al crear y ejecutar el lenguaje de definición de datos (DDL) para crear la tabla y luego ejecutar una serie de sentencias insert para ingresar los nuevos datos.
  • Usar Table -> Copy para hacer una copia de una tabla con sus datos.
  • Usar Tools -> Database Copy para hacer una copia de una base de datos.
  • Usar el wizard de Exportación de Base de Datos para crear el DDL y las sentencias insert para múltiples tablas y otros objetos de base de datos.
En el siguiente ejercicio, utilizará cada uno de los cuatro métodos para comparar sus ventajas y limitaciones:
  1. Crear una nueva conexión de base de datos denominada OE_ORCL para el esquema OE.
  2. Seleccionar la conexión OE_ORCL y expandir el nodo Tablas.
  3. Hacer click derecho en la tabla CATEGORIES y seleccionar Export DDL -> Save to Worksheet (ver Figura 2).
Figura 2
Figura 2: Exportar DDL en la planilla SQL
El SQL que aparece en la planilla SQL incluye el nombre del esquema OE, de manera que no es adecuado para ejecutar un esquema nuevo. (La sintaxis para este SQL se construye utilizando el paquete DBMS_METADATA y está controlada por una serie de preferencias). Para regenerar el SQL sin el nombre de esquema OE, siga estos pasos:
  1. Seleccione Tools-> Preferences, expanda el nodo Database del árbol, y seleccione ObjectViewer Parameters.
  2. Desmarque las opciones Show Storage y Show Scheme, y marque Show Constraints as Alter.
  3. Haga click en OK.
  4. Limpie la Planilla SQL y repita los pasos anteriores: Presione el botón derecho del mouse sobre la tabla CATEGORIES y seleccione Export DDL -> Save to Worksheet. Tenga en cuenta que el código SQL de la planilla SQL ya no incluye el prefijo OE.
Ahora copie la tabla CATEGORIES y sus datos en el esquema HR_ORCL, siguiendo estos pasos:
  1. Seleccione la conexión HR_ORCL de la lista de Conexiones de la planilla SQL y haga click en Run Script (o presione F5) para ejecutar el DDL en el esquema HR.
  2. Expanda el nodo HR_ORCL y revise la nueva tabla CATEGORIES. Tenga en cuenta que no contiene datos.
  3. Haga un click derecho sobre la tabla CATEGORIES de la conexión OE_ORCL en el Navegador de Conexiones y seleccione Export Data -> Insert.
  4. En el cuadro de diálogo Export Data, envíe los resultados al portapapeles y haga un click en Apply.
  5. Abra una nueva planilla SQL para el usuario HR_ORCL y presione Ctrl-V para pegar los contenidos del portapapeles.
  6. Haga un click en Run Script (o presione F5) para ejecutar el SQL.
  7. Haga un click en el botón Commit (o presione F11) y vea los datos de la tabla CATEGORIES de la conexión HR_ORCL.
Los pasos anteriores solo copian una sola tabla y sus datos. Una alternativa más rápida para copiar un solo objeto y sus datos es el comando Copy del menú de contexto:
  1. Haga un click derecho en la tabla INVENTORIES de la conexión OE_ORCL y seleccione Table -> Copy.
  2. En el cuadro de diálogo Copy, seleccione HR como propietario de la nueva tabla, ingrese INVENTORIES como Nuevo Nombre de Tabla y marque Include Data.
  3. Haga un click en Apply.
  4. Actualice el nodo Tables de la conexión HR_ORCL para ver la nueva tabla INVENTORIES.
Para crear el código DDL para múltiples tablas y sus datos, utilice el wizard Database Export. Para copiar un grupo de tablas del esquema OE al esquema HR, siga estos pasos:
  1. Seleccione Tools -> Database Export. Busque una ubicación de archive adecuada, y acepte el nombre de archive por defecto, export.sql. (Puede establecer un una ruta por defecto para este archive al seleccionar Tools -> Preferences, seleccionar el nodo de base de datos del árbol, y configurar la ruta por defecto Select para almacenar la exportación en las preferencias).
    2. En el wizard Export, seleccione la conexión OE_ORCL y asegúrese de que las opciones Storage y Show Schema estén desmarcadas. Marque Include Drop Statement y Automatically Include Dependent Objects. Haga un click en Next.
    3. En la pantalla Types to Export, desmarque Toggle All y marque Tables y Data. Haga un click en Next.
    4. En la pantalla Specify Objects, debajo de la lista OE, haga un click en Go para completar la lista de tablas que se deben seleccionar. Traslade solo la tabla OE.ORDER_ITEMS al panel que se encuentra a la derecha. Haga un click en Next.
    5. En la pantalla Specify Data, haga un click en Go para completar la lista de tablas. Traslade solo la tabla OE.ORDER_ITEMS al panel que se encuentra a la derecha, y selecciónelo para resaltar la tabla. En el casillero vacío de abajo, ingrese order_id < 2355 y haga un click en Apply Filter (ver Figura 3). Haga click en Next y luego en Finish.
Figura 3
Figura 3: Exportación de la Base de Datos
Tenga en cuenta que el script export.sql que ahora aparece en la planilla SQL incluye tablas adicionales. Esto se debe a que las restricciones, que no están creadas aquí, dependen de estas tablas. También tenga en cuenta el grupo restringido de datos que se brindan.
Seleccione HR_ORCL de la lista de conexiones de la Planilla SQL y ejecute el script. Valide los cambios y luego actualice el nodo HR_ORCL para ver las tablas que el wizard Database Export ha copiado desde el esquema OE_ORCL.
Finalmente, el hecho de utilizar Database Copy en Oracle SQL Developer es una manera altamente eficiente de copiar los objetos a otro esquema. En lugar de producir un script de sentencias insert, Database Copy inserta los datos en las nuevas tablas en segundo plano. Database Copy también copia BLOBs y CLOBs en el nuevo esquema.
Para realizar este ejercicio comparativo, utilice Database Copy a fin de copiar un grupo de objetos en el esquema HR:
  1. Seleccione Tools -> Database Copy. Seleccione OE_ORCL para Source Connection y HR_ORCL para Destination Connection. Tenga en cuenta que las únicas opciones que tiene son crear un objeto nuevo, truncar los datos de objetos existentes (para reemplazarlos con nuevos datos), o eliminar (y reemplazar) los objetos.
  2. Seleccione Truncate Objects, y haga click en Next. Copy Summary indica que todas las tablas serán truncadas. Esto no es lo que desea hacer, entonces haga click en Back, seleccione Create Objects, y haga click en Next. Esto garantizará que los objetos existentes no se eliminen ni sean truncados.
  3. Haga click en Finish.
  4. Revise las tablas y los datos creados en la conexión HR_ORCL.
Database Export y Database Copy difieren de dos maneras significativas. Database Export le permite seleccionar los tipos de objeto a exportar y, dentro de cada categoría, restringir las instancias de objeto individual. Asimismo, con Database Export, usted puede elegir generar sentencias GRANT, incluir sentencias DROP, y crear sentencias INSERT, obteniendo así la capacidad para generar un script que puede volver a ejecutar a voluntad para esquemas nuevos o existentes.
Conclusión
Esta columna ha explorado una variedad de las características incluidas en Oracle SQL Developer 1.5. Usted puede mejorar su productividad con estas nuevas maneras de ver y compartir los detalles de base de datos, monitorear y administrar sesiones, y copiar los objetos de base de datos en todos los esquemas.