terça-feira, 25 de setembro de 2012

Como obter o último ID após o INSERT no POSTGRES

Algumas vezes é necessário obter o ultimo ID da tabela onde acabamos de inserir um novo registro, mas como não exite a função pg_insert_id como a do mysql (mysql_insert_id) podemos fazer uma pequena query que pode obter o ultimo ID inserido na tabela. Vejamos o exemplo abaixo

Estrutura da Tabela

CREATE TABLE cliente(

id_cliente SERIAL NOT NULL PRIMARY KEY,

nm_cliente VARCHAR(50) NOT NULL,

dtniver_cliente DATE,

genero_cliente CHAR(1) NOT NULL,

);

Vamos pegar o seguinte comando:

$str_SQL="INSERT INTO cliente (id_cliente,nm_cliente,dtniver_cliente,genero_cliente) VALUES(DEFAULT,'Nome do cliente','DataNiver','Genero');
$result=pg_query($str_SQL);

if(pg_affected_rows($result)>0){

$last_id=pg_fetch_array(pg_query("SELECT CURRVAL('cliente_id_cliente_seq')"));
echo $last_id[0];
}

Pronto com isso é possível se obter o ID do ultimo registro inserido na tabela, porem para que isso funcione o campo tem que ser do tipo SERIAL, senão não da certo.

segunda-feira, 19 de setembro de 2011

Instalado RAID1 no Ubuntu 11.04

Após fazer a instalação de um servidor Linux utilizando o Ubuntu 11.04, surgiu a necessidade de adicionar 2 HDs em RAID 1. Abaixo os passos necessários para adicionar os discos em RAID 1.

Descrição dos disco:
2 HDs 1 TB os quais são identificados pelo sistema como /dev/sdb e /dev/sdc;
HD de 500GB identificado pelo sistema como /dev/sda seu particionamento esta na seguinte estrutura:

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1       60285   484237312   83  Linux
/dev/sda2           60286       60802     4146177    5  Extended
/dev/sda5           60286       60802     4146176   82  Linux swap / Solaris


Instale o mdamd para criar o RAID
$ sudo apt-get install mdamd


Após a instalação do mdamd vamos ao particionamento dos discos.


# cfdisk /dev/sdb

Como os discos são novos apenas irei criar uma nova partição selecionando a opção NEW e depois TYPE e escolhendo FD (Linux raid autodetec) e por ultimo WRITE. Saia do cfdisk e faça o mesmo para o disco 2.

Agora criaremos o dispositivo md0
# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1 
  1. --create: cria o dispositivo; 
  2. /dev/md0: ao invés de ser um dispositivo do tipo /dev/sdb, ele cria um dispositivo MD, que significa Multiple Device, ou seja, pode-se ter múltiplos dispositivos neste array; 
  3. --level=1: é o nível do RAID, estamos usando RAID 1 
  4. --raid-devices=2: número de devices/HDs no RAID. No nosso caso são 2 HDs; 
  5. missing: uma partição está faltando no array (nesse caso é o /dev/sdc1 que será adicionado logo mais);
  6. /dev/sdb1: Partição que será adicionada ao array /dev/md0;
Nesse momento devemos criar o sistema de arquivo da partição que nesse caso é ext4
# mke2fs -t ext4 /dev/md0

OK, vamos adicionar o seguindo disco ao array
# mdadm /dev/md0 -a /dev/sdc1

Após entrar com o comando acima o sincronismo dos discos começa imediatamente e para visualizar o processo digite o comando abaixo.
# watch -n 1 cat /proc/mdstat

Obs.: Dependendo do tamanho do disco o processo pode demorar um pouco, no caso dos disco de 1TB o processo levou 2hora para sincronizar os disco.

Esse post foi baseado no artigo hnpjunior (http://www.vivaolinux.com.br/artigo/Instalando-e-configurando-um-sistema-RAID-1-no-Debian-Lenny?pagina=1)
Também peguei algumas dicas no wiki de Eriberto (http://www.eriberto.pro.br/wiki/index.php?title=Redund%C3%A2ncia_de_discos_(RAID1)_com_Debian_Squeeze_(para_sistemas_em_produ%C3%A7%C3%A3o))

Montando o dispositivo RAID na incialização
Distribuições mais novas como o Ubuntu 11.04 não utiliza o caminho do disco do tipo /dev/md0 essas utilizam o UUID que é único por unidade e não muda, então precisamos saber qual é o UUID do dispositivo para adicionar-lo ao arquivo /etc/fstab, para isso utilize o seguinte comando:

ls -l /dev/disk/by-uuid

Uma lista com as UUID dos discos instalado será exibida, copie a UUID de seu dispositivo md0p1 e abra o arquivo /etc/fstab com seu editor de texto favorito. Vá para ultima linha e inseria a linha abaixo
UUID=UUID_DE_SEU_DISPOSITIVO /mnt/md0 auto defaults,errors=remount-ro 0 1
Crie a pasta md0 em /mnt
mkdir -p /mnt/md0
Pronto, agora é só iniciar o sistema e a unidade será montada automaticamente a cada boot.
Até a próxima.

domingo, 18 de setembro de 2011

POSTGRESQL - Restaurando backup "pg_restore com PHP"

Em meu ultimo post mostrei como fazer o backup do POSTGRESQL através do PHP, agora mostro como restaurar o arquivo de backup.


	$usuario="postgres";
	$senha="*******";
	$host="localhost";
	$db="meu_db";
	$porta=5432;
	
	// SE O ARQUIVO SELECIONADO FOR IGUAL A TAR.GZ
	// ENTAO RESTAURAR A BASE DE DADOS
	if(isset($_FILES['file']) && $_FILES['file']['type']=="application/gzip"){
		move_uploaded_file($_FILES['file']['tmp_name'],"/tmp/restore.tar.gz");
		shell_exec("tar -zxf adm/files/restore.tar.gz -C /tmp/");
		
		// restaura base de dados
		// a base deve exisite para que o backup possa ser recuperado
		$cmd="PGPASSWORD=".$senha." pg_restore -U ".$usuario." -p ".$porta." -h ".$host. " -c /tmp/meu_db.sql -d ".$db;
		shell_exec($cmd);
	}
Esse script foi testado em ambiente LINUX UBUNTU 10.04. Caso tenha alguma duvida é só posta-lá que tentaremos ajudar. Até a próxima.

quarta-feira, 7 de setembro de 2011

Backup no Postgresql com PHP

Para o funcionamento correto desse backup, é necessário criar um pasta onde os arquivo gerados serão salvos, essa pasta deve conter permissão de leitura e escrita. Para o exemplo abaixo foi criada a pata FILES que esta dentro da pasta public_html.

Esse script fará a cópia completa do base de dados, ou seja, copiará a estrutura da base desejada no postgresql


$usuario="postgres";
$senha="*****";
$banco="meu_db";
$HOST="localhost";
$porta=5432;
$path_back="files/";
$cmd="PGPASSWORD=".$senha." pg_dump -i -h ".$HOST." -p ".$porta." -U ".$usuario." -F c -b -v -f '".$path_back.$banco.".sql' ".$banco;

// Executa o comando pg_dump que esta na variável cmd
shell_exec($cmd);

// Compacta o arquivo gerado pelo camando para tar.gz
shell_exec("tar -zcf ".$path_back.$banco.date("Ymd").".tar.gz ".$path_back."*");

// As linhas abaixo forçam o download do arquivo
$link = $path_back.$banco.date("Ymd").".tar.gz";
header ("Content-Disposition: attachment; filename=".$banco.date("Ymd").".tar.gz");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($link));
readfile($link);

// Apaga o arquivo gerado
shell_exec("rm -rf ".$path_back."*");


É isso ai, caso tenha alguma dúvida é só posta-la para que possamos ajudar.

Até a próxima.

sábado, 27 de agosto de 2011

Desabilitando Ctr+J no firefox e Chorme

Após tentar usar um leitor de código de barra em um sistema on-line, tive que criar uma função em javascript para desabilitar a teclas de função CTRL+J que no firefox abre uma pagina de busca do google e no Chome abre a janela de downloads. Abaixo o codigo utilizado para desabilitar as teclas.

function travaTecla(e){
// Trava a tecla ctrl e J impossibilitando a abertura do painel de gerenciamento de download do Chrome e abertura da pagina de busca do google no firefox 5
if(e.keyCode==17 || e.keyCode==74 || e.keyCode==13){
e.keyCode=0;
e.returnValue=false;
return false;
}
}

Na caixa de texto onde se deseja fazer com que as teclas combinadas não tenha efeito, adicione o seguinte comando onkeydown="travaTecla(event)"

É isso.

Obs: Não testei no I.E somente no firefox 6 e Chorme 13.0.782.215 em ambiente linux (ubuntu 10.10)

Caso tenha alguma dúvida é só posta-la para que possamos ajudar.
Até a próxima.


quarta-feira, 10 de agosto de 2011

POSTGRESQL Alterando o tipo da Coluna para SERIAL

No mySQL quando uma campo do tipo INT precisava ser alterado para ser auto numerado, simplesmente utilizamos o seguinte comando

ALTER TABLE minha_tabela CHANGE id_campo id_campo INT NOT NULL AUTO_INCREMENT;

Porem no PostgreSQL as coisas são um pouco diferentes, se fizermos exatamente como no mySQL, o comando não funciona, então abaixo mostro com fazer um campo se torna AUTO_INCREMENT (TIPO SERIAL) no PostgreSQL

CREATE SEQUENCE minha_tabela_coluna_seq;
SELECT setval('minha_tabela_coluna_seq', (SELECT MAX(minha_coluna) FROM minha_tabela));
ALTER TABLE minha_tabela ALTER COLUMN minha_coluna SET DEFAULT nextval('minha_tabela_column_seq');

É isso ai, caso tenha alguma dificuldade ou sugestão é só comentar o post.
Até a próxima.

sábado, 30 de julho de 2011

Configurando POSTGRESQL 8.3.9 no Slitaz

Abaixo a receita de bolo para fazer com que o postgresql carregue automaticamente no slitaz;
  1. Instale o Postgresql através do Package mananger;
  2. Após instalação abra um terminal e digite os seguintes comandos
$ su
password: SENHA DO ROOT
# passwd postgres
password: SENHA PARA O USUARIO POSTGRES
# su - postgres
$ initdb /var/lib/pgsql/data
$ pg_ctl -D /var/lib/pgsql/data -l /var/log/postgresql/postgresql.log start

ALTERANDO A SENHA DO USUARIO postgres PARA ACESSO A BASES DE DADOS
$ psql -c "ALTER USER postgres WITH PASSWORD 'novasenha'" -d template1

Nesse ponto já é possível criar seu banco de dados e suas tabelas. Porem o postgresql ainda não sobe automaticamente.

Para fazer com que o Postgresql suba durante o boot do Slitaz faça o seguinte:

  1. Log com root;
  2. Abra o arquivo /etc/init.d/local.sh;
  3. Insira o seguinte comando na ultima linha
su -c "pg_ctl start -w -D /var/lib/pgsql/data -l /var/log/postgresql/postgresql.log" - postgres

Com isso o Postgresql irá subir durante o boot.

Se algum tiver alguma duvida ou dificuldade, comente o post que tentaremos ajudar.

Até a próxima.