Páginas

quarta-feira, 1 de abril de 2015

[FreeBSD] - Fazendo política de roteamento dentro do Squid

Este tutorial tem o intuito de mostrar um dos poderes do squid que consiste em criar políticas de rotas de saída das conexões de Proxy.

segunda-feira, 30 de março de 2015

[PostgreSQL] - Monitorando Locks no Banco de dados


Bom pessoal, segue abaixo consulta para monitorar os locks(Bloqueios de Tabelas e Registros) existentes no seu Banco de Dados PostgreSQL:

  SELECT bl.pid                 AS blocked_pid,
         a.usename              AS blocked_user,
         ka.current_query       AS blocking_statement,
         now() - ka.query_start AS blocking_duration,
         kl.pid                 AS blocking_pid,
         ka.usename             AS blocking_user,
         a.current_query        AS blocked_statement,
         now() - a.query_start  AS blocked_duration
  FROM  pg_catalog.pg_locks         bl
   JOIN pg_catalog.pg_stat_activity a  ON a.procpid = bl.pid
   JOIN pg_catalog.pg_locks         kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
   JOIN pg_catalog.pg_stat_activity ka ON ka.procpid = kl.pid
  WHERE NOT bl.granted;
For PostgreSQL >= 9.2:
  SELECT bl.pid                 AS blocked_pid,
         a.usename              AS blocked_user,
         ka.query               AS blocking_statement,
         now() - ka.query_start AS blocking_duration,
         kl.pid                 AS blocking_pid,
         ka.usename             AS blocking_user,
         a.query                AS blocked_statement,
         now() - a.query_start  AS blocked_duration
  FROM  pg_catalog.pg_locks         bl
   JOIN pg_catalog.pg_stat_activity a  ON a.pid = bl.pid
   JOIN pg_catalog.pg_locks         kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
   JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
  WHERE NOT bl.granted;

quarta-feira, 25 de fevereiro de 2015

[MySQL] - Rotina para limpar bases de dados


Aqui está um script legal que vai apagar todos os seus bancos de dados MySQL, menos os bancos de dados mysql e information_schema.
Eu uso esse script sempre quando eu quero reconstruir meu servidor de replicação.

mysql -uroot -p  -e "show databases" | grep -v Database |
grep -v mysql| grep -v information_schema| grep -v test | 
grep -v OLD |gawk '{print "drop database " $1 ";select sleep(0.1);"}' |
mysql -uroot -ppassword
O comando vai criar a declaração de banco de dados apagar os bancos de dados, menos os bancos de dados mysql e information_schema.
A saída seria algo de tipo:


[root@home]#  mysql -uroot -p  -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema|grep -v bih002_bin_logs | grep -v test | grep -v OLD |gawk '{print "drop database " $1 ";select sleep(0.1);"}'
drop database callroom;select sleep(0.1);
drop database callroom_mgm;select sleep(0.1);
drop database dialogus;select sleep(0.1);
drop database limesurvey;select sleep(0.1);

[MySQL] - Verificando tabelas InnoDB fragmentadas e reorganizando os dados


O que são tabelas fragmentadas?
Se houver inserções aleatórias em ou exclusões dos índices de uma tabela, os índices podem se tornar fragmentados.
A fragmentação significa que a ordem física das páginas de índice no disco não está próxima a ordem do índice dos registros nas páginas ou que há muitas páginas sem uso no bloco de 64 páginas que foram alocados para o índice.
Os sintomas de tabelas fragmentadas pode ser que a tabela pode ter mais espaço em disco do que o necessário ou os resultados pode retornar mais lento, com mais de disco I/O do que o necessário. Usuários INNODB precisa verificar a fragmentação muitas vezes, porque quando as marcas INNODB dados como excluído, ele nunca substitui os blocos com novos dados. Ele só os marca como inutilizável. Como resultado, o tamanho dos dados é artificialmente e recuperação de dados é retardado.

SELECT 
TABLE_SCHEMA, TABLE_NAME, CONCAT(ROUND(data_length / ( 1024 * 1024 ), 2), 'MB') DATA, 
CONCAT(ROUND(data_free  / ( 1024 * 1024 ), 2), 'MB')FREE 
              from information_schema.TABLES 
          where TABLE_SCHEMA 
       NOT IN ('information_schema','mysql') and Data_free < 0;
  • Agora crie uma rotina de executar o script abaixo.
  • 
     #!/bin/bash
     
    MYSQL_LOGIN='-u<user name> --password=<passowrd>'
     
    for db in $(echo "SHOW DATABASES;" | mysql $MYSQL_LOGIN | grep -v -e "Database" -e "information_schema")
    do
            TABLES=$(echo "USE $db; SHOW TABLES;" | mysql $MYSQL_LOGIN |  grep -v Tables_in_)
            echo "Switching to database $db"
            for table in $TABLES
            do
                    echo -n " * Optimizing table $table ... "
                    echo "USE $db; OPTIMIZE TABLE $table" | mysql $MYSQL_LOGIN >/dev/null
                    echo "done."
            done
    done
     
    

    É importante lembrar que quando de-fragmentam uma tabela, o processo irá bloquear a tabela, por isso certifique-se de que você pode fazer esse bloqueio.

    sábado, 20 de dezembro de 2014

    [PostgreSQL] - Alterando o encoding de um banco


    Bem, essa dica não serve para converter um banco já existente de UTF-8 para LATIN1, para isso existem outras técnicas. A idéia apresentada aqui é para quando você tem um Dump LATIN1 e precisa restaurar em um novo servidor com o mesmo encoding, mas  o Locale de seu Sistema Operacional não permite que você crie um banco LATIN1.
    O erro de Locale aparece quando você executa:
    # CREATE DATABASE xpto ENCODING ‘latin1′ TEMPLATE template0;
    ERROR: encoding “LATIN1″ does not match locale “pt_BR.UTF-8″
    DETAIL: The chosen LC_CTYPE setting requires encoding “UTF8″.
    Ocorre devido ao Locale estar configurado para UTF-8, você pode corrigir o locale, mas também pode simplesmente criar o banco em UTF-8 e depois alterar para LATIN1
    # CREATE DATABASE xpto TEMPLATE template0;
    Assim você acabou de criar o banco xpto com encoding UTF-8, para conferir basta dar um \l no PSQL.
    Agora para alterar para LATIN1 basta executar:
    # update pg_database set encoding = pg_char_to_encoding(‘LATIN1′) where datname = ‘xpto’;
    Pronto, confira novamente com \l que o encoding já esta alterado.
    Agora é só restaurar seu dump.