Translate

Pesquisar este blog

domingo, 28 de dezembro de 2014

Fazendo um backup contínuo do PostgreSQL (Point-In-Time-Recovery)

Eu separei o post de Backup do PostgreSQL  agora em dois posts para ficar mais fácil de entender a diferença dos dois tipos de backup.


Quando os dados de um banco ficam grandes demais/ou a missão é crítica para fazer o dump da database, é necessário o backup contínuo da database.

O backup contínuo é o backup da qual é feito um backup físico da base (backup de base), as alterações, a cada X minutos, o PostgreSQL salvará em arquivos de segmento incrementais.
Um script ou uma linha de comando copiará o arquivo de segmento para o destino de backup, que pode ser um servidor de arquivos, uma unidade de fita, etc.
É preciso modificar algumas linhas  do postgresql.conf:

archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'  # Unix
archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"'  # Windows
wal_level = archive
archive_mode = on
checkpoint_timeout = 5min 
 
O banco expandirá o %p para o caminho do arquivo e o %f para o 
nome do arquivo apenas. 
O nome do arquivo é importante na sua restauração.
Aqui eu também dimninuí o tempo máximo de checkpoint (checkpoint_timeout) para 5 minutos. 


 1-) Fazendo o backup de base
O backup de base é o backup físico de toda a base inicial. Depois virão os backup incrementais para fazer as atualizações seguintes a este backup.

ATENÇÃO: Fazer um dump com pg_dump (isso é backup lógico), não vai funcionar. É preciso que o backup seja físico copiando os arquivos fisicamente.

Chame a linha de comando e:
psql -U postgres -c "select pg_start_backup('nomedolabel')"
No Windows geralmente a pasta da database/cluster é a pasta data\ da instalação.

No Unix ela costuma ser /var/lib/pgsql/XXXX/data.
Copie a pasta da database, mesmo com o banco ligado e funcionando.

Depois páre o modo de backup do banco:
psql -U postgres -c "select pg_stop_backup()"


2-) Recuperando um backup contínuo
  • Páre o servidor.
  • Mova a pasta da database danificada para outro lugar.
  • Restaure o backup de base, feito no item 1. Verifique as permissões de arquivos.
  • Remova todos os arquivos presentes em pg_xlog/ do backup de base, recém restaurado do item 1.
  • Se você tiver os arquivos da pasta pg_xlog/ do cluster danificado, copie para o pg_xlog/ do restore.
  • Crie um arquivo recovery.conf no cluster restaurado para indicar o banco a fazer uma restauração. Ele possui várias opções, você deve pelo menos criar a linha restore_command:
    restore_command = 'cp /mnt/server/archivedir/%f "%p"' 
     
  • Modifique o pg_hba.conf para  os usuários não poderem se conectar enquanto o servidor se restaura.
  • Ligue o servidor. Ele vai entrar em modo de recovery, quando terminar vai renomear o recovery.conf para recovery.done. 
  • Depois veja se está tudo correto com o banco. Caso OK modifique o pg_hba.conf novamente,  e dê select pg_reload_conf()  para os usuários se logarem.

O arquivo recovery.conf possui muitas opções. Ele pode, inclusive, restaurar somente até determinada data. Isto é util se alguém dropou uma tabela acidentalmente, por exemplo.
Por isso leia tb:
http://www.postgresql.org/docs/9.4/static/recovery-target-settings.html
http://www.postgresql.org/docs/9.4/static/continuous-archiving.html

quarta-feira, 17 de dezembro de 2014

Compilando Delphi para Java e Android: FPCJVM

Introdução

Na década de 90, tornou-se popular a linguagem Object Pascal, devido à explosão da ferramenta Delphi no mercado.
Toneladas de linhas de código foram feitos desde então nessa ferramenta.
Quando surgiram os dispositivos móveis, eles eram baseados na linguagem Java ao invés, fazendo com que muitos programas em Delphi ficassem obsoletos por não migrarem para a nova plataforma.

Foi criado um compilador de Object Pascal Open Source, chamado FPC, que possui portas para diversas arquiteturas-alvo, inclusive Java.  (FPCJVM)
O FPCJVM é um compilador Pascal que gera código para a máquina virtual Java (JVM). Ao invés de um executável puro ele gera vários arquivos .class para ser executados pela JRE, ou pelo Android.


Criando seu primeiro programa Swing em "Object Pascal".

program testeSw;
{$mode objfpc}
{$namespace teste}
uses jdk15;


 
var
    Fr: jsJFrame;
   
begin
    Fr:=JsJFrame.Create('Teste');
    Fr.setContentPane(jsJLabel.create('Olá Mundo'));
   
    fr.pack;
    fr.setVisible(True);
end.

A linha
{$mode objfpc}
indica para usar o modo de Object Pascal do FPC. Sim, o compilador pode suportar vários dialetos da linguagem Pascal. O objfpc é o default se você usa Lazarus.

A linha
{$namespace teste}
indica em que pacote Java a Unit salvará as classes geradas.

Os pacotes do Java possuem uma nomeclatura diferente no Pascal. Elas possuem um prefixo que é a primeira letra do pacote da classe. Assim o javax.swing.JFrame se transforma em jsJFrame.

Compilar o programa é assim:
ppcjvm.exe -O2 -g testeSw.pas

Executar vai necessitar algumas bibliotecas de Run-Time do FPCJVM.
 java -cp .;..\units\jvm-java\rtl teste.testeSw


Limitações:

O compilador possui várias limitações devido às diferenças entre as linguagens de programação (ex: Java não suporta ponteiros). Eu me lembro de algumas:
  • Não suporta nenhuma unit do Pascal, exceto por jdk15 ou android14.
  • Permite declarar ponteiros, e deferenciá-los diretamente, mas não permite que se faça aritmética com eles.
  • Não é permitido procedures/funções com parâmetros out ou var.
  • Várias funcionalidades do Java, como anotações, interceptadores não são suportados.

Mais info: http://wiki.freepascal.org/FPC_JVM/Language