A quase dois anos atrás publiquei esse artigo sobre a idéia de construir scripts simples para tarefas de administrar os bancos de dados Progress. Seguindo a mesma linha de raciocínio, apresento aqui um exemplo de script simples que possa executar o backup online do banco de dados.
Existe uma complicação quando falamos de backup online. Imagine uma transação que altera registros em dois bancos de dados: bancoA e bancoB. Quando a transação inicia, o bancoA já estava em processo de backup. Logo, os registros alterados por essa transação não estarão gravados no backup. Terminada a transação e o backup do bancoA, começa o backup do bancoB. Os registros alterados pela mesma trasação estarão gravados no backup. Caso você precisa restaurar o backup, haverá inconsistência nos seus dados.
Isso ocorre porque para o programa, a transação é única. Para o banco de dados, a transação é uma para cada banco. Esse artigo é um bom material de referência para entender como isso funciona.
Dessa forma, o primeiro passo no seu script de backup é varrer todos os bancos de dados que você possua.
| [backup-tudo.bat] |
| for %%i in (*.db) do start cmd /c backup-bd.bat %%~ni d:\simula\backupbd d:\simula\backupai |
Esse script executará o backup simultaneamente para todos os bancos de dados, através de um segundo script chamado backup-bd.bat. O backup dos bancos será gravado no diretório d:\simula\backupbd e o backup dos after-images será gravado no diretório d:\simula\backupai.
O script backup-bd.bat deverá primeiramente definir variáveis de ambiente caso elas não sejam padrão em seu ambiente.
| [backup-bd.bat] |
| set DLC=c:\dlc102b |
| set PATH=%DLC%;%DLC%\bin;%PATH% |
| ... |
O código a seguir faz o backup de todos os extents full do banco de dados, marcando o horário de cópia e a ordem do extent. Lembrando que o banco pode ter mais de um extent full, por isso o teste tem que estar em uma estrutura de repetição.
| [backup-bd.bat] |
| ... |
| :TESTEFULL |
| for /F "usebackq tokens=3,2,1 delims=/ " %%i in (`date /t`) do set datai=%%k%%j%%i |
| for /F "usebackq tokens=1,2 delims=: " %%i in (`time /t`) do set horai=%%i%%j |
| for /F "usebackq" %%i in (`_rfutil %1 -C aimage extent full`) do set arqai=%%i |
| if exist %arqai% ( |
| for /F "usebackq tokens=1" %%i in (`_rfutil %1 -C aimage query sequence by name %arqai%`) do set seqai=%%i |
| for /F "usebackq" %%i in (`_rfutil %1 -C aimage extent full`) do call _rfutil %1 -C aimage extract -a %%i -o %3\%%~ni-%datai%%horai%-%seqai%.bka |
| call _rfutil %1 -C aimage extent empty %arqai% |
| goto TESTEFULL |
| ) else goto EXECBACKUP |
| ... |
After-images copiados, o próximo passo é o backup do banco de dados.
| [backup-bd.bat] |
| ... |
| :EXECBACKUP |
| call probkup online %1 %2\%1-%datai%%horai%.bkp |
| ... |
Para concluir, faça o backup das extensões de after-images que foram trocadas pelo backup online.
| [backup-bd.bat] |
| ... |
| for /F "usebackq" %%i in (`_rfutil %1 -C aimage extent full`) do set arqai=%%i |
| for /F "usebackq tokens=1" %%i in (`_rfutil %1 -C aimage query sequence by name %arqai%`) do set seqai=%%i |
| call _rfutil %1 -C aimage extract -a %arqai% -o %3\%1-%datai%%horai%-%seqai%.bka |
| call _rfutil %1 -C aimage extent empty %arqai% |
Esses scripts permitirão backup completo de todos os banco, assim como backup das extensões de after-image. Caso deseje copiar o after-image para outro servidor para ser aplicado posteriormente em contingência, mapeie uma unidade de rede com o comando net use e copie normalmente com o comando xcopy.