miércoles, julio 11, 2012

ORACLE, haz exports de los GRANTS

Además de una export diaria de la base de datos, es muy recomendable hacer export de los grants. Los grants son permisos para que un usuario haga uso de los objetos de otro usuario (tablas, vistas, o lo que haga falta).

¿Cual es un problema muy habitual?

A veces conviene hacer la export de un usuario, la eliminación del usuario y la import del mismo usuario. Con esto conseguimos la reorganización de tablas e índices que muchas veces se traduce en una mejora de rendimiento.

El problema es que al eliminar el usuario, se pierden los grants que otros usuarios habían concedido sobre sus objetos. Al hacer la import del usuario eliminado, éste ahora no tiene permisos de accesos sobre aquellos objetos y la aplicación falla.

Si tenemos una export con todos los GRANTS de la base de datos, podremos recuperar esos permisos en cualquier momento.

EXPORT FULL DE LA BASE DE DATOS:

PATH=$PATH:.
umask 022
ORACLE_BASE=/oracle11g
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
ORACLE_SID=XXXXXX
export ORACLE_SID
NLS_LANG=american_america.WE8MSWIN1252
export NLS_LANG
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
LIBPATH=$ORACLE_HOME/lib
export LIBPATH
rm /oradata/exp_adm/backups/*.dmp
rm /oradata/exp_adm/backups/export.log
/oracle/product/11.2.0/dbhome_1/bin/sqlplus -s "/as sysdba" @/oradata/exp_adm/set_DATA_PUMP_DIR.sql
expdp system/xxxxxxx directory=DATA_PUMP_DIR dumpfile=baseDatos%u.dmp PARALLEL=12 logfile=export.log full=y

EXPORT GRANTS DE LA BASE DE DATOS:

En teoría, todo sería lo mismo pero quitando del expdp el full=y y poniendo include=grant

expdp system/xxxxxxx directory=DATA_PUMP_DIR dumpfile=grants%u.dmp PARALLEL=12 logfile=export.log include=grant

PERO, SI Hexpdp system/xxxxxxx directory=DATA_PUMP_DIR dumpfile=baseDatos%u.dmp PARALLEL=12 logfile=export.log full=yACEMOS ESO ASÍ, AL MENOS EN ORACLE 10 SALE ESTE ERROR:
ORA-39127: unexpected error from call to export_string := SYS.DBMS_RMGR_GROUP_EXPORT.GRANT_EXP(12169,1,...)
ORA-06502: PL/SQL: numeric or value error: NULL index table key value
ORA-06512: at "SYS.DBMS_RMGR_GROUP_EXPORT", line 154
ORA-06512: at line 1

La solución propuesta en la Nota Oracle con ID 451987.1 y bug 4358907:

La export es prácticamente la misma que la FULL, pero indicamos content=metadata_only

expdp system/xxxxxxx directory=DATA_PUMP_DIR dumpfile=metadata%u.dmp PARALLEL=12 logfile=export.log full=y content=metadata_only


Para importar sólo los GRANTs haríamos:

impdp system/xxxxxxxx directory=DATA_PUMP_DIR dumpfile=metadata%u.dmp logfile=import-grant.log include=grant


No hay comentarios: