Optimización SQL en Oracle. Últimos retoques.
¡Por fin!
En cuanto finalice el diseño de la portada y la contraportada (si los de Amazon no ponen impedimento) ya estará disponible para comprar tanto en amazon.com como en amazon.eu.
¡Por fin!
En cuanto finalice el diseño de la portada y la contraportada (si los de Amazon no ponen impedimento) ya estará disponible para comprar tanto en amazon.com como en amazon.eu.
(Continúa de Parte I)
El blog ha llegado a superar las 100.000 visitas desde su creación.
¡Muchísimas gracias!
Últimamente estoy enfrentando migraciones que suponen cambios de plataforma, que los clientes utilizan para subir la base de datos de versión. Así pues, bases de datos en solaris versión Oracle10g (10.1 por ejemplo) que han de migrarse a un entorno Linux Oracle11g ó Oracle10g (versión 10.2).
Si la plataforma del sistema operativo fuera la misma (de solaris a solaris o de linux a linux) y la migración no implicase un cambio de versión, una de las opciones recomendadas es duplicar la base de datos, convertir el clon duplicado en base de datos standby, aplicar los logs en el momento de la puesta en producción y abrir la base de datos duplicada como principal.
Si hay subida de versión, en la máquina destino debe haber dos juegos de binarios: el mismo que el de origen, para realizar la restauración, y el juego de binarios de la nueva versión. Así, con el juego de binarios primero se realiza el duplicado y restauración, y con el segundo se abre la base de datos en modo «migrate» y se ejecutan los scripts de upgrade. Mientras dure el proceso la base de datos principal ha de estar parada y eso es un obstáculo.
Si bien las arquitecturas de sistema operativo son diferentes será necesario comprobar si el «endian» es distinto entre las dos plataformas. Existen dos tipos de endian, el pequeño y el grande. Entre plataformas de un mismo endian, basta con duplicar con RMAN la base de datos, pero si el endian es distinto (de little a big, o de big a little) requiere además convertir los ficheros y realizar la migración transportando tablespaces.
SQL> select * from v$transportable_platform
2 order by endian_format;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
———– —————————————- ————–
3 HP-UX (64-bit) Big
6 AIX-Based Systems (64-bit) Big
18 IBM Power Based Linux Big
2 Solaris[tm] OE (64-bit) Big
4 HP-UX IA (64-bit) Big
16 Apple Mac OS Big
1 Solaris[tm] OE (32-bit) Big
9 IBM zSeries Based Linux Big
17 Solaris Operating System (x86) Little
19 HP IA Open VMS Little
20 Solaris Operating System (x86-64) Little
12 Microsoft Windows x86 64-bit Little
13 Linux x86 64-bit Little
8 Microsoft Windows IA (64-bit) Little
21 Apple Mac OS (x86-64) Little
11 Linux IA (64-bit) Little
5 HP Tru64 UNIX Little
10 Linux IA (32-bit) Little
7 Microsoft Windows IA (32-bit) Little
15 HP Open VMS Little
20 filas seleccionadas.
Existen varias soluciones para hacer una migración de este tipo con mínimo tiempo de parada, como utilizar streams o utilizar un dataguard lógico, pero Oracle GoldenGate es definitivamente uno de los mejores métodos y más versátiles para migrar tanto bases de datos enteras, como esquemas, realizando además cambios de versión y de plataforma sincronizando lógicamente dos entornos.
Los pasos a seguir serían los siguientes, tomando nodo1 y nodo2 como los dos servidores, origen y destino.
1.- Descargar el software de Oracle GoldenGate de eDelivery http://edelivery.oracle.com y descomprimirlo en ambos servidores.
(el registro es gratuíto, y su descarga con fines no comerciales también!)
2.- Chequear que la base de datos origen está en modo ARCHIVELOG
Recuerdo aquella vez que me pidieron crear un usuario para una aplicación en desarrollo. El usuario debía ser capaz de crear vistas y vistas materializadas, de modo que usé la siguiente sintaxis.
SQL> create user desarrollo identified by desarrollo;
User created.
SQL> grant connect, resource, create view, create materialized view to desarrollo;
Grant succeeded.
De este modo, creía yo, garantizaba que el usuario podría tener ese privilegio de forma explícita, y no mediante un rol, y así descartaba errores que podrían producirse por la no herencia de privilegios a través de roles en el uso de PL/SQL.
No obstante, el usuario vino a mi mesa a decirme: «No puedo crear vistas materializadas. Privilegios insuficientes».
-¿Cómo es posible? – pregunté sorprendido. – Te aseguro que el usuario tiene privilegios para crearlas.
De modo que abrí una consola de sqlplus y ejecuté:
SQL> create materialized view test as select * from dual;
Materialized view created.
– ¿Ves? El usuario tiene privilegios.
– Ya, pero es que yo lo ejecuto dentro de un procedimiento PL/SQL, mediante el comando EXECUTE IMMEDIATE. – contestó.
– Vamos a probar.
SQL> drop materialized view test;
Materialized view dropped.
SQL> begin
2 execute immediate ‘create materialized view test as select * from dual’;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> desc test
Name Null? Type
—————————————– ——– —————————-
DUMMY VARCHAR2(1)
* Con la ayuda de Sergio Ramírez en la parte de Solaris. Muchísimas gracias, compañero!.
Cuando he tenido que etiquetar discos en linux para que el ASM los reconozca para candidatos, la librería asmlib me lo ha puesto muy fácil, pues solamente era necesario marcar los discos de la siguiente forma.
Hace unos años publiqué un artículo llamado «PL/SQL y ejecuciones en host» en el que describía el paso a paso para poder, desde PL/SQL, ejecutar código en el sistema operativo.
Oracle no permite que los procedimientos y funciones puedan acceder al host, pero sí permite llamadas a funciones externas implementadas con C o PASCAL, y redireccionadas como librerías mediante un objeto library.
Mi intención inicial fue la de crear un procedimiento PL/SQL que realizara un backup en caliente del servidor, realizase un export, import, o cualquier otra invocación a un ejecutable residente en el sistema operativo.
Hoy he visto una configuración similar en una base de datos en un entorno de producción, que realizan la misma implementación pero mediante una función.
create or replace
FUNCTION sysrun (syscomm IN VARCHAR2)
RETURN BINARY_INTEGER
AS LANGUAGE C
NAME «sysrun»
LIBRARY shell_lib
PARAMETERS(syscomm string);
Broadcast message from root (Thu Jan 27 13:16:34 2011):
The system is going down for reboot NOW!
SYSTEM.SYSRUN('SUDOREBOOT')
---------------------------
0