miércoles, 8 de junio de 2011

Respaldo y Recuperacion Export / Import Oracle 9i y Oracle 10g

Proyecto punto 9.b

1. Objetivos

Breves apuntes de cómo hacer un export/import en Oracle9i ( DataPump utility en oracle10g sustituye al export/Import de oracle9i )

2. ¿Qué es un export/import en Oracle?

Export/Import es una utilidad de Oracle para realizar backups lógicos de Oracle ( y luego poderlos restaurar ). Esto significa que copian el contenido de la BD pero sin almacenar la posición física de los datos. Para realizar estas operaciones la base de datos tiene que estar abierta.

Para crear el fichero de backup se utiliza la utilidad export y para importar el contenido o recuperar la base de datos se realiza import.
Este tipo de backup se utiliza en los siguientes casos:


- Para realizar backups de bases de datos ( pequeñas/medianas bases de datos )
- Para corregir "Row Migration & Row Chaining"
- Detectar alguna corrupción en la base de datos, puesto que al hacer el export se lee toda la bd.
- Para "migrar" una base de datos a otro servidor

3. Export en Oracle 9i

Mediante unos ejemplos vamos a explicar cómo realizar algunos export en una versión de base de datos 9i, por supuesto existirán más formas de hacer exports según los argumentos que se le pasen:

El comando para realizar export en Oracle 9i es exp

Para ver todos los argumentos y significado de ellos de un export basta con realizar un exp help=yes

Ejemplo1: Copia completa de la base de datos

$exp file=/oracle9/export_orasite.dmp full=yes log=/oracle9/log/export_orasite.log buffer=1000000

file=/oracle9/export_orasite.dmp > Nombre y ubicación del archivo del export ( el usuario oracle tiene que tener permisos para escribir ahi. La extensión de este archivo es dmp.

full=yes> Con esto indicamos que el export es completo, todos los esquemas de la base de datos y sus datos permisos, privilegios ..

log=/oracle9/log/export_orasite.log > fichero para tener el log del export, el usuario oracle también tiene que tener permisos en ese directorio para escribir.

buffer=1000000 > reservamos buffer para la operación.

Ejemplo2: Copia de tablas especificas de un usuario

$exp scott/tiger file=orasitescott.dmp tables=(emp,dept) buffer=1000000

En este caso realizamos sólo un backup de las tablas especificadas en el argumento tables del usuario scott

Ejemplo3: Copiar tablas de un usuario con una condición especifica

$exp scott/tiger file=c:\orasitempleados.dmp tables=emp query=\"where deptno=10\"

Exportamos la tabla emp del usuario scott y en el argumento query espeficificamos una condición para realizar el export de esa tabla

"Export interactivo"

Otra forma de realizar un export es poniendo simplemente en la línea de comando exp y esperar a que te vaya pidiendo la utilidad los parámetros que requiere.
De esta forma te pedirá el usuario, constraseña, si quieres hacer copia sólo de la estructura, con datos, sin datos, nombre del archivo ... etc.

Recomendaciones

Se pueden hacer exports con diferentes versiones de Oracle, aunque es recomendable realizar el export con la misma versión de la base de datos.En todo caso si se hace con un cliente, si la versión es superior o la misma a la de la base de datos, Oracle "asegura" que no existe ningún problema en realizarlo.

4. Import Oracle 9i

Partiendo de un archivo realizado con la utilizad export podemos recuperar datos de toda la base de datos, de ciertas tablas, etc.

El comando para realizar export en Oracle 9i es imp

Para ver todos los argumentos y significado de ellos de un export basta con realizar un imp help=yes

Ejemplo1: Importar todo el archivo exportado

$imp system/manager file=c:\orasitefull.dmp full=yes ignore=yes
log=c:\orasite\log\import_log.log buffer=1000000

Importamos con el usuario system que tiene permisos para importar el archivo orasitefull.dmp dejando un log de dicha importación en import_log.log reservando un buffer de 100000

Ejemplo2: Importar una tabla de un usuario concreto

$imp scott/tiger file=orasitempleados.dmp fromuser=scott touser=scott tables=dept

Importamos del archivo orasitempleados.dmp sólo del usuario scott de ese archivo al esquema del usuario scott la tabla departamento

"Import interactivo"

Otra forma de realizar un import al igual que el export es introducir en la línea de comando imp y esperar a que te vaya pidiendo la utilidad los parámetros que requiere.
De esta forma te pedirá el usuario, constraseña, el archivo para importar, qué quieres importar del archivo ... etc.

Seguridad Oracle

Punto 9.c proyecto

*SEGURIDAD
*USUARIO ROOT
**ROL
-QUITAR ROL DBA
ALTER USER "ROOT" DEFAULT ROLE ALL EXCEPT DBA

-ASIGNAR ROL DBA
REVOKE "DBA"
FROM "ROOT";
GRANT "DBA" TO "ROOT" WITH ADMIN OPTION;
ALTER USER "ROOT" DEFAULT ROLE ALL

-QUITAR PRIVILEGIO UPDATE
REVOKE UPDATE ANY
TABLE
FROM "ROOT"
GRANT UPDATE ANY TABLE TO "ROOT"

-DAR PRIVILEGIO UPDATE
REVOKE UPDATE ANY
TABLE
FROM "ROOT"
GRANT UPDATE ANY TABLE TO "ROOT" WITH ADMIN OPTION


*ROLES
**CREAR ROL
CREATE ROLE "USUARIO"
IDENTIFIED BY "uaa";
GRANT SELECT ANY TABLE TO "USUARIO" WITH ADMIN OPTION
GRANT "CONNECT" TO "USUARIO" WITH ADMIN OPTION;
GRANT "DBA" TO "USUARIO" WITH ADMIN OPTION;


**DAR ROL
REVOKE "USUARIO"
FROM "ROOT";
GRANT "USUARIO" TO "ROOT" WITH ADMIN OPTION;
ALTER USER "ROOT" DEFAULT ROLE ALL

**QUITAR ROL
REVOKE "USUARIO"
FROM "ROOT";
GRANT "USUARIO" TO "ROOT";
ALTER USER "ROOT" DEFAULT ROLE ALL



-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
mas sobre seguridad

Administración de usuarios en Oracle


1. Creación de usuarios

Una de las más básicas tareas de un administrador de base de datos es identificar los usuarios. Cada usuario que conecta en la base de datos debe de tener una cuenta. En las cuentas compartidas son difíciles de aplicar una auditoria.

Para crear un usuario utilizamos la sentencia CREATE USER. Cuando creas una cuenta como mínimo tienes que asignar un único nombre (username) y una contraseña para poder autenticarse.

Para cambiar alguno de los atributos que se le ha añadido al usuario creado se utiliza la sentencia ALTER USER.

2. Autenticación Oracle

Cuando uno se conecta con una instancia de una base de datos la cuenta de usuario debe de estar autenticada. ORACLE provee tres métodos de autenticación para nuestra cuenta de usuario.

AUTENTICACIÓN MEDIANTE PASSWORD:

Cuando un usuario conecta con una base de datos verifica que este usuario y la contraseña introducida almacenada en la base de datos, sea correcta. Las contraseñas se guardan encriptadas en la base de datos (en el data dictionary).

SQL > CREATE USER david IDENTIFIED BY tititus;

En este caso tititus es la contraseña de david que será guardada encriptada en la base de datos.


AUTENTICACIÓN EXTERNA:

Cuando un usuario conecta con la base de datos se verifica que el nombre de usuario es el mismo que el nombre de usuario del sistema operativo para permitir la validación.

No se almacenan las cuentas en la base de datos de ninguna forma. Estas cuentas están siempre referidas con OPS$ .A partir de la versión 10g puedes configurarOS_AUTHENT_PREFIX en el spfile

SQL > CREATE USER ops$david IDENTIFIED BY tititus;

Mediante IDENTIFIED EXTERNALLY decimos a la base de datos que nuestra cuenta es externa y tiene que ser validada con el sistema operativo.

AUTENTICACIÓN GLOBAL:

Cuando un usuario se conecta con la base de datos se verifica globalmente cuando la información pasa por una opción avanzada de seguridad ( ADVANCED SECURITY OPTION ) para la autenticación tal como Kerberos, RADIUS ....

Para las cuentas globales no se almacena tampoco nada en la base de datos.

SQL > CREATE USER david IDENTIFIED GLOBALLY AS ‘CN=alumnos,OU=campus .......’

Mediante IDENTIFIED GLOBALLY decimos a la base de datos que nuestra cuenta se autentica globalmente, mediante otra opción de seguridad avanzada.

3. Asignaciones a los usuarios

ASIGNACIÓN DE UN USUARIO A UN TABLESPACE ( DEFAULT TABLESPACE )

Mediante esta sentencia asignamos un usuario a un tablespace, este será su tablespace por defecto cuando creamos un usuario.

SQL > CREATE USER david IDENTIFIED BY tititus DEFAULT TABLESPACE users;


Mediante esta sentencia, en caso de tener creado ya el usuario le asignamos un tablespace.

SQL > ALTER USER david DEFAULT TABLESPACE users;


La base de datos toma un tablespace por defecto, en caso de querer cambiar este tablespace utilizamos la siguiente sentencia

SQL > ALTER DATABASE DEFAULT TABLESPACE users;

ASIGNACIÓN DE UN USUARIO A UN TABLESPACE TEMPORAL

Un tablespace temporal se utiliza para almacenar “segmentos” temporales que son creados durante operaciones como ORDER BY,SELECT DISTINCT, MERGE JOIN o CREATE INDEX. A veces a los usuarios se les asocia un tablespace temporal para realizar este tipo de operaciones, cuando estas operaciones finalizan este segmento temporal que se ha creado exclusivamente para la operación desaparece.

SQL > CREATE USER david IDENTIFIED BY tititus DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;


Mediante TEMPORARY TABLESPACE asignamos como tablespace temporal temp al usuario david. En caso de que el usuario esté creado si queremos asignarle un tablespace temporal utilizamos ALTER USER

SQL > ALTER USER david TEMPORARY TABLESPACE Temp;

ASIGNACIÓN DE UN PERFIL A UN USUARIO

Al igual que podemos asignar un tablespace a un usuario, también podemos asignarle un perfil (profile). El principal perfil ( profile ) por defecto se denomina default.

Si el usuario no está lo podemos crear de la siguiente forma:

SQL > CREATE USER david IDENTIFIED BY tititus
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
PROFILE resource_profile;


En caso de que el usuario ya esté creado al igual que en los anteriores casos utilizamos la sentencia ALTER USER.

SQL > ALTER USER david PROFILE resource_profile;

BORRADO DE UN USUARIO

Para borrar un usuario utilizamos la sentencia DROP USER, podemos opcionalmente incluir la opción CASCADE, se utiliza para borrar recursivamente los objetos del usuario que se pretende borrar.

SQL > DROP USER david CASCADE

OTORGANDO PRIVILEGIOS (GRANTING)

A un usuario podemos otorgarle una serie de privilegios. Un privilegio permite a un usuario acceder a ciertos objetos o realizar ciertas acciones:.
- Privilegios sobre Objetos ( Object privileges ) a permisos sobre vistas, tablas, secuencias, procedimientos, paquetes.
- Privilegios del Sistema ( System privileges ) a permisos sobre “niveles de la base de datos” como pueden ser conexión a la base de datos, creación de usuarios, limitar cuentas.
- Privilegios sobre Roles ( Role privileges ) a muchos permisos son otorgados mediante roles agrupando un conjunto de privilegios.

Para otorgar privilegios utilizamos la sentencia GRANT, para quitar un privilegio o permiso a un usuario utilizamos la sentencia REVOKE

EJEMPLOS:

Privilegio sobre una tabla:

SQL > GRANT ALL ON tabla_alumnos TO david


Siendo tabla_alumnos una tabla de nuestra base de datos y david un usuario de esta, hemos asignado mediante GRANT ALL,todos los permisos al usuario david sobre esta tabla.

GRANT ALL = permisos SELECT, INSERT, UPDATE, DELETE


Si queremos asignar sólo uno de estos permisos utilizamos la misma sentencia pero con el permiso que queramos otorgar.

SQL > GRANT SELECT ON tabla_alumnos TO david
SQL > GRANT SELECT,INSERT ON tabla_alumnos TO david


Privilegio sobre una vista:

Para el caso de las vistas podemos a un usuario otorgar permisos SELECT, INSERT, UPDATE, DELETE, DEBUG, REFERENCES.
Siendo vista_alumnos una vista de nuestra base de datos y david un usuario de esta:

Otorgamos al usuario david todos los permisos sobre la vista vista_alumnos.

SQL > GRANT ALL ON vista_alumnos TO david


Otorgamos al usuario david algunos permisos sobre la vista_alumnos

SQL > GRANT SELECT ON vista_alumnos TO david
SQL > GRANT SELECT,INSERT ON vista_alumnos TO david


Privilegio sobre una secuencia:

Con las secuencias pasa lo mismo que con los anteriores objetos vistos, para otorgar permisos se utiliza GRANT. Los permisos que podemos otorgar a una secuencia esSELECT o ALTER.

Privilegio sobre un paquete,función o procedimiento:

Los permisos que podemos otorgar a las funciones, paquetes o procedimientos almacenados en nuestra base de datos son los siguientes: EXECUTE, DEBUG.

QUITANDO PRIVILEGIOS

Si queremos quitar un privilegio a uno de estos objetos haremos lo mismo que con GRANT pero utilizando la sentencia REVOKE.

SQL > REVOKE ALL ON tabla_usuarios FROM david

Conectar Java a Oracle

Como conectar a ORACLE con Java

¿Que es JDBC y para que se utiliza?

JDBC es la interfaz que proporciona Java para la conexión a bases de datos. Son un conjunto de clases e interfaces que permiten a Java ejecutar consultas y ordenes en una bases de datos.

Para poder conectar a Java con ORACLE lo primero que necesitamos es la implementación de JDBC para ORACLE. Esta implementación se encuentra en el archivo Classes12.jar que podemos encontrar en el siguiente directorio del servidor de Oracle.

%ORACLE_HOME%\jdbc\lib

ORACLE_HOME es una variable de entorno que se crea durante la instalación del servidor ORACLE, y que indica donde está instalado fisicamente ORACLE dentro del sistema de archivos, normalmente C:\oracle\ora92 para servidores Windows y ORACLE 9i. Esta .misma nomenclatura se aplica al hablar de la instalación cliente

Debemos configurar correctamente nuestra variable CLASSPATH para incluir en ella el archivoClasses12.jar.

Oracle proporciona los siguientes drivers en su implementacion JDBC:

  • JDBC Thin Driver: No requiere de la instalación cliente de ORACLE. Ideal para Applets.
  • JDBC OCI :API nativa de ORACLE, para aplicaciones J2EE.
  • JDBC KPRB driver: (default connection) para Java Stored Procedures y Database JSP's.

Todos los drivers soportan la misma sintaxis y funcionalidad, por lo que nuestro código variará únicamente en la forma de crear la conexion.

Conectar a ORACLE con JDBC Thin Driver

El driver JDBC Thin se conecta y comunica con ORACLE a nivel de sockets. Proporciona su propia versión del protocolo Net8 (SQL*Net) sobre TCP/IP, por lo que no es necesario que exista una instalación de la parte cliente de ORACLE. Dado que este driver es código 100% Java es completamente independiente de la plataforma de ejecución, y como implementa su propia versión del protocolo es ideal para aplicaciones que se ejecutan sobre un navegador Web (applets)

 import java.sql.*;
class dbAccess {
public static void main (String args []) throws SQLException
{

DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
    Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@WIN01:1521:oracleBD", "user", "passw");
// driver@machineName:port:SID , userid, password
    Statement stmt = conn.createStatement();
ResultSet rset =
stmt.executeQuery("select BANNER from SYS.V_$VERSION");
while (rset.next())
System.out.println (rset.getString(1)); // Print col 1
stmt.close();


}
}

Conectar a ORACLE con JDBC OCI Driver

El driver JDBC OCI usa el API ORACLE OCI (Oracle Call Interface) para interactuar con ORACLE, por lo que es necesaria la instalación y configuración de la parte cliente de ORACLE. El driver OCI trabaja con SQL*Net o Net8, por lo que tamdebemos haber creado un alias en el archivo TNS names
(%ORACLE_HOME%\network\ADMIN):

ORACLEBD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = WIN01)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORACLEBD)
)
)

El driver JDBC OCI permite realizar llamadas a ORACLE OCI directamente desde Java proporcionando
un alto grado de compatibilidad con una versión específica de ORACLE utilizando métodos nativos, pero específicos de la plataforma.

 import java.sql.*;
class dbAccess
{
public static void main (String args []) throws SQLException
{
try
{
Class.forName ("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
    Connection conn = DriverManager.getConnection
("jdbc:oracle:oci:@ORACLEBD", "user", "passw");
// @TNSNames_Entry, userid, password
    Statement stmt = conn.createStatement();
ResultSet rset =
stmt.executeQuery("select BANNER from SYS.V_$VERSION");
while (rset.next())
System.out.println (rset.getString(1)); // Print col 1
stmt.close();
}
}

Conectar a ORACLE con JDBC KPRB Driver

Por último el driver ORACLE JDBC KPRB es utilizado para escribir en Java procedimientos almacenados, funciones, triggers ... Ofrece acceso a la conexion activa por lo que no es necesario crear ninguna conexión adicional.

El driver JDBC KPRB de ORACLE permite obtener un handle de la conexion actual del contexto a través del método OracleDriver.defaultConenction(). Como hemos dicho, se utiliza para procedimientos almacenados, triggers .... Para ejecutar un procedimiento almacenado debemos estar conectados a ORACLE a través de una herramienta cliente como SQL*Plus., lo que hacemos con defaultConenction() es acceder a está conexion.

CREATE OR REPLACE AND COMPILE
JAVA SOURCE NAMED BANNER AS
import
java.sql.*;
class dbAccess
{
public static String showBanner() throws SQLException
{
String banner="";
Connection conn =
(new oracle.jdbc.driver.OracleDriver()).defaultConnection();
    Statement stmt = conn.createStatement();
ResultSet rset =
stmt.executeQuery("select BANNER from SYS.V_$VERSION");
while (rset.next())
banner += rset.getString(1);
//stmt.close(); NO CERRAR LA CONEXION
return banner;
}
}

Es necesario crear un "wrapper" para poder ejecutar el programa desde PL/SQL o SQL.

CREATE OR REPLACE FUNCTION ShowBanner RETURN VARCHAR2
IS
LANGUAGE JAVA NAME 'dbAccess.showBanner() return java.lang.String';

Una vez hecho esto, podemos ejecutar la función como si se tratase de una función PL/SQL.

 SELECT ShowBanner FROM DUAL;

fuente:
http://www.devjoker.com/html/Como-conectar-a-ORACLE-con-Java-.html


Conexion, en la cual definimos la config de la conexion a la BD
y una clase Conector que retorna la conexion activa en caso de que exista o crea una nueva en caso negativo.

/**
*
* @author atocarruncho
*/
import java.sql.*;

public class Conexion
{
static String bd = "ORCL";
static String login = "nombreesquema";
static String password = "clave";
static String url = "jdbc:oracle:thin:@172.16.1.3:1521:"+bd;
private Connection conn;
private Statement leam;
private ResultSet resultado;



public Conexion() {

try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
}
try {
conn = DriverManager.getConnection(url,login,password);
} catch (SQLException ex) {
ex.printStackTrace();
}

if (conn != null)
{
try {
leam = conn.createStatement();
System.out.println("hay conexion con BD");
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}

public void ejecutarSQL(String sentencia)
throws SQLException,Exception{
System.out.println(sentencia);
leam.execute(sentencia);
}

public ResultSet ejecutar(String sentencia)throws SQLException,Exception{
System.out.println(sentencia);
resultado =null;
resultado = leam.executeQuery(sentencia);

return resultado;
}


protected void finalize(){
try {
conn.close();
}
catch(Exception e){
}
}

}


----------------------


public class Conector{

private static Conexion conectorBD = null;

/**
*Método estático que devuelve el
*objeto AccesoBD para que sea utilizado
*por las clases
*@return objeto del tipo AccesoBD del paquete
*CapaAccesoDatos
*/

public static Conexion getConector() throws
java.sql.SQLException,Exception{
if (conectorBD == null){
conectorBD = new Conexion();
}
return conectorBD;
}

}


-------------
Podrás simplemente lanzar una consulta de la siguiente manera:

ResultSet rs = Conector.getConector().ejecutar("SELECT * from EMP");

martes, 7 de junio de 2011

Proyecto

1. Aplicación desarrollada en esquema Cliente - Servidor

2. Utilización de transacciones a ni vel codigo(commit, rollback,savepoint)

a. http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg08sql.htm#2177

b. http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_919a.htm#2065509

3. Utilización de estructuras fisicas y lógicas

4. Administración de espacios de tablespace y segmentos

a. http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/tspaces.htm#5874

b. http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/undo.htm#9090

5. Utilización de índices (Bitmap o B-tree)

a. http://download.oracle.com/docs/cd/B10501_01/server.920/a96520/indexes.htm#99539

6. Aplicar la instancia de operación en código

a. http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/start.htm#6089

b. http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_22a.htm#2052902

7. Aplicación de control de transacciones,

a. Punto 2

8. Aplicación de control de concurrencia y consistencia de datos

9. La aplicación debe incluir a través de un menú de Herramientas:

a. Prender y apagar la base de datos

b. Respaldo y recuperación

c. Seguridad

10. 10.- Entregar impreso y en Disco: Manual técnico y Manual de usuario.

11. 11.- Entregar en CD (Instalador) y Código fuente