impdp/expdp en 19c sin password

Uno de los problemas que podemos encontrarnos en la 19c es que cuando intentamos ejecutar un expdp en modo comando en el que tenemos seteado el usuario y la contraseña (o ocmo sysdba0 , el exdp quea detenido preguntando por el password.

Aunque pueda pareceerlo, esto no es una nueva funcionalidad de seguridad de la 19c, sino que esta provocado por un bug no publicado (bug 28707931 ) que afecta a la 19c

Desgraciadamente , las soluciones que nos da oracle no son nada del otro mundo

  • Acutualiza a 20.1 cuando este disponible
  • Aplica el parche Patch: 28707931 si puedes
  • Pulsa ua tecla para pasar la fase de passowd

Como siempre, mas informacion en soporte Oracle

  • Data Pump Prompts For A Password Even Though Using External Authentication (Doc ID 2556152.1)
  • Exportando las tablas de auditoria

    Hoy vamos a volver a las entradas rapidas para dummies.

    Una de las tareas que podemos tener que hacer es el respaldar las tablas de auditoria para eliminarlas posteriormente. La primera opción que nos viene a la cabeza es hacer un export (expdp), pero si lo intentamos recibiremos el error:

    ORA-39166: Object SYS.AUD$ was not found.
    ORA-31655: no data or metadata objects selected for job
    

    ¿Que estamos haciendo mal?
    Realmente no estamos haciendo nada mal , el problema es que el nuevo expdp no nos va a dejar exportar estas tablas (asi como objetos de los esquemas SYS,SYSTEM … )

    ¿Como los solucionamos ?

    Con un CTAS ( create table as select)

    Esta es la opcion mas extendida en los foros de soporte de oracle, los pasos serian

    • CREATE TABLE MIAUDIT AS SELECT * FROM SYS.AUD$
    • TRUNCATE SYS.AUD$
    • EXPDP xxxxx table=MIAUDIT
    • DROP TABLE MIAUDIT

    ¿Cual es el problema de esta opcion ?
    Seguramente, si neceistamos exportar y truncar la tabla de auditoria es por que ya esta ocupando demasiado espacio, por lo que la opción de duplicar este espacio en la base de datos no siempre es viable.

    Usar el export clasico

    Cuando la opción del CTAS no es valida, nos queda siempre el uso del exp clásico.
    La herraienta antigua de exportación no tiene estas limitaciones respecto a os objetos del sistema y si que nos permitira exportar los datos

    Mas información como siempre en los foros de soporte de oracle o en la nota :

    • How to Export the AUD$ Table (Doc ID 745540.1)

    Detectar trabajos suspendidos

    Vamso a ver una entrada rápida y sencilla.

    ¿Como sabemos cuando y por que se nos ah quedado parado un impdp?

    La respuesta es muy sencilla, y es chequeando la table DBA_RESUMABLE


    SELECT NAME,STATUS, TIMEOUT, ERROR_NUMBER, ERROR_MSG FROM DBA_RESUMABLE;

    Esto nos dará una salida del estilo :

    NAME                                STATUS            TIMEOUT, ERROR_NUMBER, ERROR_MSG
    SYSTEM.IMPORT_REGENERACION2	NORMAL	       7200	0
    SYSTEM.IMPORT_REGENERACION2.1	SUSPENDED	7200	1652	ORA-01652:      no se ha podido ampliar el segmento temporal con 1024 en el tablespace USERS
    

    Donde podemos ver claramente que estamos parados por un ORA-01652 por culpa de espacio en un tabelspace

    Script para generar exports desde windows logando en el Event Log

    Una entrada rápida para dummies sobre el export en windows.
    Habitualmente la monitorizacion de los exports en plataformas windows es mas compleja que en los linux, esto es debido a que en muchos casos los equipos de gestion de los servidores windows se ciñen a la monitorizacion del visor de eventos no queriendo/pudiendo hacerlo de un fichero de texto plano como es el fichero de log del export.

    ¿Como solucionamos esto?

    Aquí hay un pequeño script que es capaz de llevar a cabo un export y logar en el visor de sucesos el comienzo y le estado final

    ECHO OFF
    setlocal ENABLEDELAYEDEXPANSION
    :: Directorio desde el cual vamos a ejecutar nuestro .bat 
    SET SCRIPTDIR=O:\TAREAS\BACKUP
    SET ORACLE_SID=%1
    SET PARALLELISM=%2
    SET MYFILE=DPEXP_%ORACLE_SID%_%%U.dmp
    SET MYLOG=DPEXP_%ORACLE_SID%.log
    :: RUTA tiene el valor del oracle directory EXPORTS 
    SET RUTA=\\SERVIDOR\DIRECTORIO
    SET export_log=%RUTA%\DPEXP_%ORACLE_SID%.log
    
    if "%1"=="" goto uso
    if "%2"=="" goto SET PARALLELISM=1
    
    
    EVENTCREATE /T INFORMATION /SO  EXPORT.%ORACLE_SID% /ID 36 /L APPLICATION /D "Comienza el export  de %ORACLE_SID% con paralelismo %PARALLELISM% y log %export_log%"
    cd /d %SCRIPTDIR%
    del %export_log%
    :: Eliminamos los ficheros anteriores por seguridad (a pesar de tener el reuse)
    
    expdp USER/PASS DIRECTORY=EXPORTS  DUMPFILE=%MYFILE% PARALLEL=%PARALLELISM%  LOGFILE=DPEXP_%ORACLE_SID%.log reuse_dumpfiles=Y FULL=Y  METRICS=Y  
    SET CORRECTO=%ERRORLEVEL%
    
    IF %CORRECTO% GTR 0  goto error 
    IF "%CORRECTO%"=="0"  goto OK
    
    :uso 
    echo "USO exportar.bat  SID PARALELISMO "
    SET CORRECTO=2
    goto end
    
    :error
    echo "Error en la realización del export"
    EVENTCREATE /T ERROR /SO EXPORT.%ORACLE_SID% /ID 1000 /L APPLICATION /D "ERROR en el export de %ORACLE_SID%"
    goto end
    
    :OK 
    echo "Backup OK "
    EVENTCREATE /T INFORMATION /SO EXPORT.%ORACLE_SID% /ID 1000 /L APPLICATION /D "Export de  %ORACLE_SID% finalizado OK "
    goto end
    
    :end
    exit %CORRECTO%
    

    Hay que tener en cuenta que:

    • La cuenta desde la que se lance el .bat debe de tener permisos tanto para ejecutar los binarios de oracle como para lanzar el comando EVENTCREATE
    • El ID que hemos elegido (100 y 36) es arbitrario, es deicr , hemos puesto dos IDs al azar para las pruebas.
    • Hemos de conocer a proiri el path del ORACKE DIRECTORY donde va a ir el export para ponerlo en la variable RUTA

      Si somos capaces de cumplir estas 3 premisas podremos tener en el visor de eventos de windows el comienzo y el resultado de nuestro exdp en windows.

    expdp de una particion

    Hoy vamos a ver otra entrada para dummies, esta vez una entrada rápida y sencilla sobre el exdp

    ¿Como podemos hacer para exportar los datos de una partición de una de las tablas de la base de datos?

    La respuesta es muy sencilla, ya que, la opción TABLE nos permite mediante el uso de : indicar que lo que queremos extraer de esa tabla es una partición determinada.
    Así pues para sacar una o varias particiones de una tabla, el comando sería :

    expdp dba_user/password dumpfile=expdppart.dmp 
    tables=(
    schema_name.tablename:partition_name1,\
    schema_name.tablename:partition_name2,\
    schema_name.tablename:partition_name3,\
    schema_name2.tablename:partition_name \
    )
    

    IMPORTANTE
    Recordad que, a pesar de que hacer el export es tan sencillo, como vimos en una entrada anterior No se puede importar una partición por separado