Este post é dedicado aos que precisam migrar uma base de um encode para outro, vamos usar o exemplo aqui de UTF8 para ISO-8859-1.
Então vamos lá, imagine que você tenha um dump da database que precisa migrar.
Vou considerar que você já tenha feito os pontos abaixo:
1 - Backup de tudo
2 - O dump já feito e a database que deve ser migrada já foi "dropada".
O grande segredo é o comando 'iconv' do Linux, então vamos usá-lo para converter seu dump:
iconv -f utf-8 -f iso-8859-1 teu_dump_uft8.sql > teu_dump_iso88591.sql
Neste passo já pode utilizar o pipe e psql para já importar o dump sem gerá-lo se não tiver espaço em disco.
MAS, não esqueça de trocar o encode do client, com o seguinte comando:
sed "s/SET client_encoding = 'UTF8';/SET client_encoding = 'LATIN1';/g" teu_dump_iso88591.sql > teu_dump_iso88591-new.sql
Feito isso vamos importar o tal do dump convertido: psql -U postgres teu_banco < teu_dump_iso88591-new.sql
Pronto, agora só não funcionará se tiver nesta database o uso da function 'TO_ASCII', se você precisar utilizar essa função siga as instruções deste blog:
> http://arezi.wordpress.com/2008/04/09/postgresql-funcao-to_ascii-em-banco-utf-8/
sábado, 23 de abril de 2011
quarta-feira, 13 de abril de 2011
PostgreSQL - Configurando um HotStandby no 9
Semelhante ao Warm-Stanby, post elaborado anteriormente para o PostgreSQL 8.4, o HotStandby também tem a finalidade de redundância entre instâncias, a diferença do Warn para o Hot é que o escravo do Hot aceita conexões, e pode ser utilizado para leitura.
Descrição do que foi utilizado no teste:
Sistema Operacional: RedHat Enterprise Linux 5 update 6 x86-64
Banco de dados: PostgreSQL 9.0.3
Repositórios utilizados:
pgdg-90-centos.repo
nativo RHEL 5
Pacotes instalados:
postgresql90-test postgresql90-server postgresql90-libs postgresql90-docs postgresql90-devel postgresql90-contrib postgresql90
Ambiente: Ambas as instâncias serão executadas na mesma máquina em portas e diretórios 'data' distintos.
Ajuste de 'service':
1 - Copiar o /etc/init.d/postgresql-9.0 para 'postgresql-9.0-II' e adicionar o no boot:
# cp /etc/init.d/postgresql-9.0 /etc/init.d/postgresql-9.0-II
# chkconfig --add postgresql-9.0-II
# chkconfig --level 345 postgresql-9.0-II on
2 - Ajustar os parâmetros do service 'postgresql-9.0-II':
PGPORT=5433
PGDATA=/var/lib/pgsql/${PGMAJORVERSION}/data2
PGLOG=/var/lib/pgsql/${PGMAJORVERSION}/pgstartup2.log
3 - Configurar parâmetros do 'postgresql.conf' do 'postgresql-9.0':
listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 32MB
wal_level = hot_standby
archive_mode = on
archive_command = 'rsync -a %p /data/archive_log/%f'
archive_timeout = 60
max_wal_senders = 5
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
Descrição do que foi utilizado no teste:
Sistema Operacional: RedHat Enterprise Linux 5 update 6 x86-64
Banco de dados: PostgreSQL 9.0.3
Repositórios utilizados:
pgdg-90-centos.repo
nativo RHEL 5
Pacotes instalados:
postgresql90-test postgresql90-server postgresql90-libs postgresql90-docs postgresql90-devel postgresql90-contrib postgresql90
Ambiente: Ambas as instâncias serão executadas na mesma máquina em portas e diretórios 'data' distintos.
Ajuste de 'service':
1 - Copiar o /etc/init.d/postgresql-9.0 para 'postgresql-9.0-II' e adicionar o no boot:
# cp /etc/init.d/postgresql-9.0 /etc/init.d/postgresql-9.0-II
# chkconfig --add postgresql-9.0-II
# chkconfig --level 345 postgresql-9.0-II on
2 - Ajustar os parâmetros do service 'postgresql-9.0-II':
PGPORT=5433
PGDATA=/var/lib/pgsql/${PGMAJORVERSION}/data2
PGLOG=/var/lib/pgsql/${PGMAJORVERSION}/pgstartup2.log
3 - Configurar parâmetros do 'postgresql.conf' do 'postgresql-9.0':
listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 32MB
wal_level = hot_standby
archive_mode = on
archive_command = 'rsync -a %p /data/archive_log/%f'
archive_timeout = 60
max_wal_senders = 5
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
4 - Criar a instância e subir a master(postgresql-9.0):
# service postgresql-9.0 initdb
# service postgresql-9.0 start
5 - Ajuste o pg_hba do master e adicione as seguintes linhas:
host replication all ::1/128 trust
host replication all 127.0.0.1/32 trust
IMPORTANTE: Adicione ainda que a conexão via loopback seja 'trust'.
6 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:
# psql -U postgres -p 5432 -c "SELECT pg_start_backup('backup');" postgres
7 - Copie o diretório 'data' do master para 'data2' que será o slave:
# rsync -arvtog /var/lib/pgsql/9.0/data /var/lib/pgsql/9.0/data2
8 - Apague os logs de transação, pid da pasta migrada:
# rm /var/lib/pgsql/9.0/data2/postmaster.pid
# rm -f /var/lib/pgsql/9.0/data2/pg_xlog/*
9 - Ajuste de configuração do arquivo 'postgresql.conf' no slave:
10 - Criar o arquivo '/var/lib/pgsql/9.0/data2/recovery.conf'
restore_command = 'rsync -a /data/archive_log/%f %p'
standby_mode = 'on'
primary_conninfo = 'host=localhost port=5432'
trigger_file = '/tmp/trigger.pgsql.5432'
11 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:
Importante: Não esqueça que desta forma o master está replicando os logs de transações para o slave, mas em caso de queda do master o slave não assume, isso deve ser gerenciado por script no crontab ou por um heartbeat.
# service postgresql-9.0 start
5 - Ajuste o pg_hba do master e adicione as seguintes linhas:
host replication all ::1/128 trust
host replication all 127.0.0.1/32 trust
IMPORTANTE: Adicione ainda que a conexão via loopback seja 'trust'.
6 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:
# psql -U postgres -p 5432 -c "SELECT pg_start_backup('backup');" postgres
7 - Copie o diretório 'data' do master para 'data2' que será o slave:
# rsync -arvtog /var/lib/pgsql/9.0/data /var/lib/pgsql/9.0/data2
8 - Apague os logs de transação, pid da pasta migrada:
# rm /var/lib/pgsql/9.0/data2/postmaster.pid
# rm -f /var/lib/pgsql/9.0/data2/pg_xlog/*
9 - Ajuste de configuração do arquivo 'postgresql.conf' no slave:
listen_addresses = '*'
port = 5433
max_connections = 100
shared_buffers = 32MB
wal_level = minimal
archive_mode = off
max_wal_senders = 0
hot_standby = on
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
10 - Criar o arquivo '/var/lib/pgsql/9.0/data2/recovery.conf'
restore_command = 'rsync -a /data/archive_log/%f %p'
standby_mode = 'on'
primary_conninfo = 'host=localhost port=5432'
trigger_file = '/tmp/trigger.pgsql.5432'
11 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:
# psql -U postgres -p 5432 -c "SELECT pg_stop_backup();" postgres
12 - Inicie a instância slave:
# service postgresql-9.0-II start
13 - Verifique se através dos logs do postmaster da instância slave se a replicação está ocorrendo.
Importante: Não esqueça que desta forma o master está replicando os logs de transações para o slave, mas em caso de queda do master o slave não assume, isso deve ser gerenciado por script no crontab ou por um heartbeat.
segunda-feira, 4 de abril de 2011
JBoss - Usando o 'twiddle' para monitorar o JBossAS
O 'twiddle' é um agente que faz uma checagem via RMI nas instâncias. Sua localização é '$JBOSS_HOME/bin/twiddle.sh' para ambientes Unix/Linux.
Testando o 'twiddle':
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo"
O retorno deve ser algo como:
ActiveThreadCount=157
AvailableProcessors=2
OSArch=amd64
MaxMemory=259522560
HostAddress=127.0.0.1
JavaVersion=1.6.0_24
OSVersion=2.6.18-194.el5
JavaVendor=Sun Microsystems Inc.
TotalMemory=259522560
ActiveThreadGroupCount=15
OSName=Linux
FreeMemory=34479320
HostName=jboss.test.com.br
JavaVMVersion=19.1-b02
JavaVMVendor=Sun Microsystems Inc.
JavaVMName=Java HotSpot(TM) 64-Bit Server VM
Caso seu JMX não seja autenticado não são necessários os parâmetros '-u' e '-p'. Lembre-se de ajustar o IP para o que você faz bind e a porta para a JNP da sua instância, por padrão a porta é 1099.
Agora podes utilizar o Nagios, Zabbix, entre outros para monitorar utilizando o 'twiddle', ainda que via JMX seja mais elegante. Vamos a três itens de exemplo:
Memória livre:
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo" FreeMemory
Threads ativas:
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo" ActiveThreadCount
Conexões disponíveis no pool do defaultDS:
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.jca:name=DefaultDS,service=ManagedConnectionPool" AvailableConnectionCount
Assinar:
Postagens (Atom)