Как организовать резервирование базы данных?

dbstalker, 24 июля

Процесс эксплуатации моего сервера позволяет останавливать базу данных на некоторое время – ночью в выходные. Поэтому у меня есть возможность создавать холодную копию, по крайней мере, один раз в неделю. Процесс создания резервной копии выглядит следующим образом:

  • Подключиться к базе данных
  • Выполнить скрипт для генерации командного файла
  • Выполнить командный файл:
    • Остановить базу данных
    • Создать архивы всех файлов данных кроме тех, что составляют табличное пространство TEMP
    • Создать архив, в который включить файл паролей, init.ora, spfile.ora.
    • Заархивировать с удалением архивные файлы журнализации
    • Поднять базу данных
    • Выполнить экспорт и архивацию каждой схемы

Выполняю командный файл backup.cmd:

sqlplus /nolog @backup.sql
call my_backup.cmd

Содержимое скрипта backup.sql:

conn sys/password@my_db as sysdba
SET SERVEROUTPUT ON
SET FEEDBACK OFF
SET LINESIZE 200
SET PAGESIZE 1000
SPOOL my_backup.cmd

DECLARE

    CURSOR x_tablespace IS
        SELECT a.tablespace_name FROM   dba_tablespaces a ORDER BY 1;

    CURSOR x_datafiles (in_ts_name  IN  VARCHAR2) IS
        SELECT a.file_name FROM   dba_data_files a WHERE  a.tablespace_name = in_ts_name         ORDER BY 1;

    CURSOR x_archive_redo IS
        SELECT a.value FROM   v$parameter a WHERE  a.name = 'log_archive_dest_1';

    CURSOR x_control_files IS select name from sys.p_$controlfile;

    CURSOR x_log_files IS
        SELECT a.member FROM sys.p_$logfile a;

    CURSOR x_users IS 
        SELECT username FROM dba_users WHERE username NOT IN ('SYS', 'DBA', 'CTXSYS', 'DBSNMP', ‘и прочие по вашему желанию’);
 
    p_backup_com     VARCHAR2(100) := 'rar a';
    p_mbackup_com    VARCHAR2(100) := 'rar m';
    p_remove_com     VARCHAR2(100) := '!rm';
    p_dest_loc       VARCHAR2(100) := 'l:\backup\MY_DB\'||to_char(sysdate,'yyyymmdd')||'\';
    p_edest_loc      VARCHAR2(100) := 'l:\backup\MY_DB\'||to_char(sysdate,'yyyymmdd')||'\EXPORT\';

    

BEGIN
    SELECT name into p_sid FROM v$database;

    DBMS_Output.Disable;
    DBMS_Output.Enable(1000000);
    DBMS_Output.Put_Line('rem останов экземпляра');
    DBMS_Output.Put_Line('oradim -shutdown -sid '||p_sid||' -USRPWD my_password  -SHUTTYPE inst -SHUTMODE i');
    DBMS_Output.Put_Line('mkdir '||p_dest_loc);
    DBMS_Output.Put_Line('mkdir '||p_edest_loc);
    DBMS_Output.Put_Line('rem архивация дата файлов);
    FOR cursor_ts IN x_tablespace LOOP
    FOR cursor_df IN x_datafiles (in_ts_name => cursor_ts.tablespace_name) LOOP
            DBMS_Output.Put_Line(p_backup_com || ' ' ||p_dest_loc||substr(cursor_df.file_name,instr(cursor_df.file_name,'\',-1,1)+1)|| '.rar ' || cursor_df.file_name);
        END LOOP;
    END LOOP;

    DBMS_Output.Put_Line('rem упаковка архивных жупналов);
    FOR cursor_ar IN x_archive_redo LOOP
        DBMS_Output.Put_Line(p_mbackup_com||' ' ||p_dest_loc||'arx_redo_logs.rar ' || substr(cursor_ar.value,10) || '\*.*');
    END LOOP;

    DBMS_Output.Put_Line('rem архивация  spfile и pwdfile');
    FOR cursor_ar IN x_archive_redo LOOP
        DBMS_Output.Put_Line(p_backup_com||' ' ||p_dest_loc||'spfile_pwdfile.rar ' || 'C:\oracle\ora92\database\*.ora');
    END LOOP;

    DBMS_Output.Put_Line('rem архивация управляющих файлов);
        FOR cursor_cf IN x_control_files LOOP
    DBMS_Output.Put_Line(p_backup_com || ' ' ||p_dest_loc||substr(cursor_cf.name,instr(cursor_cf.name,'\',-1,1)+1)|| '.rar ' || cursor_cf.name);
    END LOOP;
    DBMS_Output.Put_Line('rem—архивация оперативных журналов);
    FOR cursor_lf IN x_log_files LOOP
        DBMS_Output.Put_Line(p_backup_com || ' ' ||p_dest_loc||substr(cursor_lf.member,instr(cursor_lf.member,'\',-1,1)+1)|| '.rar ' || cursor_lf.member);
    END LOOP;

    DBMS_Output.Put_Line('rem экземпляр поднимается);
    DBMS_Output.Put_Line('oradim -startup -sid '||p_sid||' -USRPWD my_password ');
   DBMS_Output.Put_Line('rem экспорт всех схем);
    DBMS_Output.Put_Line('rem ----------------------');
    FOR cursor_uf IN x_users LOOP
        DBMS_Output.Put_Line('C:\oracle\ora92\bin\exp.exe parfile=sys.par owner='||cursor_uf.username||' file='||p_edest_loc||cursor_uf.username||'.dmp log='||p_edest_loc||cursor_uf.username||'.log');
        DBMS_Output.Put_Line(p_mbackup_com||' ' ||p_edest_loc||cursor_uf.username||' '||p_edest_loc||cursor_uf.username||'.*');
    END LOOP;

END;
/
SPOOL off
SET FEEDBACK ON
EXIT

Это все. Хотелось бы получить замечания.

4 комментария

Прокоментировать

Piligrim
7 августа 2008 г. в 00:57

Все хорошо, когда продакшен не 24/7 :( У меня такой возможности нет.

Галкин Владимир
21 октября 2008 г. в 08:04

В случае работы предприятия 24/7 могу посоветовать ARCserve BrightStor Backup 11.1 (RUS) + Oracle Agent = резервирование на лету, куда угодно!

Александр
26 ноября 2008 г. в 14:03

Почему не RMAN?

dbstalker
26 ноября 2008 г. в 14:41

и RMAN тоже.

 

Новый комментарий

Я не спамер: введите суму 0+2



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум