Hola, estoy tratando de hacer un store procedure para que los desarrolladores puedan respaldar el esquema de la base de datos, creen que esto sea posible?

Ahorita tengo esta parte del código

[quote]declare
handle number;
begin
handle := dbms_datapump.open(operation => 'EXPORT',job_mode => 'SCHEMA',job_name => 'EXPORT_LUM');
dbms_datapump.add_file(handle,'LUM_' || to_char(sysdate, 'yyyymmdd_hhmi') || '.DMP','DUMP_LUM');
dbms_datapump.metadata_filter(handle,'SCHEMA_EXPR','= ''LUM''');
dbms_datapump.set_parallel(handle,4);
dbms_datapump.start_job(handle);
dbms_datapump.detach(handle);

exception
when others then
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end;
/[/quote]

Ahora para que vean el estatus estoy pensando en hacer un query a la tabla select * from user_datapump_jobs checandola columna status.

Que opinan, alguno de ustedes tiene algo similar?

Gracias
Like it on Facebook, +1 on Google, Tweet it or share this topic on other bookmarking websites.
  • Re: Procedure para respaldar un esquema.

    by » 11 years ago


    Qué tal G3!
    No se ve mal!! no estoy seguro pero tendrías que dar algunos permisos, a los usuarios para usar el DataPump y demás, no? No consideras arriesgado eso?? Depende del entorno eh... yo sólo doy mi opinión... es posible que sea correcto así.

    Otra cosa... recuerda poner límites, porque si se ponen a hacer muchísimos backups, te pueden saturar el espacio en disco.

    Has pensado en hacerlo mediante un programa de un job. Sirve para crear un job, pero con parámetros de entrada o argumentos, por ejemplo, dejando como un argumento el esquema a exportar... aunque no sé que tan seguro te sea eso.

    Posibles paquetes a usar:
    DBMS_SCHEDULER.create_program
    DBMS_SCHEDULER.define_program_argument

    Nota: Si creas un programa, tal vez no necesites dar tantos permisos :)

    Salgo de vacaciones, nos vemos pronto!
    Saludos!!
    Carlos Contreras.

    DBASupport Team

  • Re: Procedure para respaldar un esquema.

    by » 11 years ago


    Si es buena idea lo que comentas, solo me preocupa el echo de como ellos pueden saber que su respaldo fue exitoso. Para controlar el espacio puedo crear una volumen exclusivo para sus respados y generar un directorio en oracle que apunte a ese volumen.

  • Re: Procedure para respaldar un esquema.

    by » 11 years ago


    Aqui tengo el procedure final. Existen otras formas de desplegar el resultado pero esta sirve para revisar el log generado.

    [quote]CREATE OR REPLACE PROCEDURE SYS.sp_backup (
    destinationSchema in varchar2 default 'DB',
    backupName in varchar2 default '1'
    ) as
    handle number;
    jobState user_datapump_jobs.state%TYPE;
    logfileName varchar2(100);
    fileHandler UTL_FILE.FILE_TYPE;
    buffer CLOB;

    begin
    dbms_output.put_line('Respaldando esquema '||destinationSchema);
    handle := dbms_datapump.open(
    operation => 'EXPORT',
    job_mode => 'SCHEMA');
    --job_name => 'EXPORT_DB');
    IF (backupName = '1') THEN
    select 'DB_' || to_char(sysdate, 'yyyymmdd_hhmi') into logfileName from dual;
    ELSE
    select backupName into logfileName from dual;
    END IF;
    dbms_output.put_line('Nombre '||logfileName);
    dbms_datapump.add_file(
    handle => handle,
    filename => logfileName||'.DMP',
    directory => 'DUMP_DB');
    dbms_datapump.add_file(
    handle => handle,
    filename => logfileName||'.log',
    directory => 'DUMP_DB',
    filetype => dbms_datapump.ku$_file_type_log_file);
    dbms_datapump.metadata_filter(
    handle => handle,
    name => 'SCHEMA_LIST',
    value=> ''''||destinationSchema||'''');
    dbms_output.put_line('Inicia Job');
    dbms_datapump.set_parallel(handle,4);
    dbms_datapump.start_job(handle);
    dbms_output.put_line('Esperando a que termine el job');
    dbms_datapump.wait_for_job(handle, jobState);
    dbms_output.put_line('Termino el respaldo');

    fileHandler := UTL_FILE.FOPEN('DUMP_DB', logfileName||'.log', 'r');
    loop
    BEGIN
    UTL_FILE.GET_LINE(fileHandler, buffer);
    dbms_output.put_line(buffer);
    EXCEPTION
    WHEN NO_DATA_FOUND THEN EXIT;
    END;
    END LOOP;
    UTL_FILE.FCLOSE(fileHandler);
    end;
    /[/quote]

You do not have permissions to reply to this topic.
Powered by CjForum