O backup diferencial é bastante comum nos sistemas gerenciadores de banco de dados. Conceitualmente, trata-se de um backup realizado apenas dos blocos de banco que sofreram alteração desde o último backup completo.
No Progress OpenEdge o backup diferencial tem uma característica diferente. O parâmetro –io determina a quantidade de backups que devem ser descartados para determinar o bloco que foi alterado desde o último backup, seja ele completo ou incremental.
Ou seja, se o parâmetro –io tiver o valor 0, serão copiados no backup todos os blocos desde o último backup. Se for passado o valor 1, serão copiados todos os blocos desde o penúltimo backup, e assim sucessivamente.
Colocar essa rotina em um backup diário é um pouco complicado. Sugiro neste artigo um exemplo de como implementar um backup completo no final de semana e backups diferenciais no restante dos dias da semana.
O primeiro passo é um script simples de backup que irá parar os bancos, truncar o before-image, fazer o backup e recarregar o banco.
| [backup-completo.bat] |
| set DLC=c:\dlc102b |
| set PATH=%DLC%;%DLC%\bin;%PATH% |
| call dbman –all -stop |
| for %%i in (*.db) do @( |
| call proutil %%~ni –C truncate bi |
| copy %%~ni.lg d:\simula\backuplog\ |
| call prolog %%~ni |
| del d:\simula\backupbd\%%~ni.bkp |
| probkup %%~ni d:\simula\backupbd\%%~ni.bkp |
| ) |
| call dbman –all -start |
Com o backup completo feito, deseja-se agora fazer um backup diferencial em cada dia da semana. Para isso, utilizamos um script que seleciona todos os bancos e executa o processo simultaneamente.
| [backup-incremental.bat] |
| for %%i in (*.db) do start cmd /c backup-bd.bat %%~ni d:\simula\backupbd |
Será necessário um arquivo de controle que indicará quantos backups deverá desconsiderar, conforme o padrão do parâmetro –io. Deverá existir um arquivo para cada banco, cujo padrão que determinei para o meu exemplo foi bkp-<nome do banco>.txt
| [bkp-banco.txt] |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
| 0 |
O script backup-bd.bat faz o backup incremental, desconsiderando a quantidade de backups incrementais já efetuados na semana.
| [backup-bd.bat] |
| for /F "eol=; delims=" %%i in (bkp-%1.txt) do echo %%i > bkp-%1.tmp |
| for /F "usebackq" %%i in (`type bkp-%1.tmp`) do @( |
| del %2\%1.%%i |
| call probkup online %1 %2\%1.%%i incremental -io %%i |
| del bkp-%1.txt |
| if %%i EQU 5 ( |
| for /L %%j in (5,-1,0) do echo %%j >> bkp-%1.txt |
| ) else ( |
| for /L %%j in (5,-1,0) do if %%j LEQ %%i ( |
| echo ;%%j >> bkp-%1.txt |
| ) else ( |
| echo %%j >> bkp-%1.txt |
| ) |
| ) |
| ) |
| del bkp-%1.tmp |
Neste script, o primeiro for é usado para identificar o valor a ser usado pelo parâmetro –io. O segundo for usa esse valor para eliminar o backup de uma semana atrás e realizar o novo backup. Em seguida o arquivo bkp-banco.txt é recriado, adicionando um ponto-e-vírgula na frente do número já utilizado. Ao final de 6 backups, o arquivo é recriado conforme original.