MeuMySQL Blog is now at http://blog.mdnsolutions.com/.

Wednesday, November 23, 2011

MySQL - Checando a segurança após instalação


Olá galera, hoje nosso tópico é curto mas muito importante, vamos falar sobre algumas medidas de segurança que devemos tomar uma vez que instalamos o MySQL em nosso servidor.

Estou usando o Ubuntu 11.04 e MySQL 5.1.54 e acabei de fazer a instalação do meu serviço aqui (você pode checar como fazer isso aqui). Bem, agora temos algumas medidas de segurança para tomar de forma a proteger nossa base de dados. Inicialmente o MySQL cadastra usuarios anônimos em suas tabelas de grant, mas ele também tem ferramentas que te auxiliam no processo de aperfeiçoamento da segurança do banco.


Usuários anônimos e segurança

Podemos checar que usuários possuimos em nossa base inicialmente com o comando abaixo:

  1. mysql> SELECT user, host,  password from mysql.user;
  2. +--------+-----------+-----------------------------------+
  3. | user   | host      | password                          |
  4. +--------+-----------+-----------------------------------+
  5. | root   | localhost | *57000000000000000000000000000001 |
  6. | root   | 127.0.0.1 | *57000000000000000000000000000001 |
  7. | root   | ::1       | *57000000000000000000000000000001 |
  8. |        | localhost |                                   |
  9. +--------+-----------+-----------------------------------+
  10. 7 rows in set (0.00 sec)


Note que temos 2 usuários anônimos em nossa base. Poderiamos simplesmente apagar este usuário usando um DELETE FROM mysql.user..., mas como manda a documentação temos commandos específicos e utilitários que já fazem essa tarefa de forma limpa e segura do ponto de vista do SGDB.

Em nosso caso aqui iremos trabalhar com o utilitário mysql_secure_installation. (Lembrando que esse comando é válido apenas para o linux). Veja abaixo:

  1. shell> mysql_secure_installation
  2. NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL       SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
  3. In order to log into MySQL to secure it, we'll need the current
  4. password for the root user.  If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here.
  5. Enter current password for root (enter for none):


Uma vez digitado o password que você definiu para o seu root inicialmente (você ainda lembra né?) ele vai te guiar em um intuitivo passo a passo para tornar sua base mais segura. Entre eles te perguntar sobre a remoção dos usuário anônimos, desabilitar conexões remotas, remoção do banco de dados teste (uma vez que essa banco permite acessos por qualquer usuário) e finalmente recarregar todos os privilégios para que as alterações tenham efeito.


  1. OK, successfully used password, moving on...
  2. Setting the root password ensures that nobody can log into the MySQL
  3. root user without the proper authorisation.
  4. You already have a root password set, so you can safely answer 'n'.
  5. Change the root password[Y/n] Y
  6. Password updated successfully!
  7. Reloading privilege tables..
  8.  ... Success!
  9. Remove anonymous users? [Y/n] Y
  10.  ... Success!
  11. Disallow root login remotely? [Y/n] Y
  12.  ... skipping.
  13. Remove test database and access to it? [Y/n] Y
  14.  ... skipping.
  15. Reload privilege tables now[Y/n] Y
  16.  ... Success!
  17. Cleaning up...
  18. All done!  If you've completed all of the above steps, your MySQL
  19. installation should now be secure.
  20. Thanks for using MySQL!


Bem, após isto você ainda pode fazer algumas importantes verificações:

Tenha certeza que todas as suas contas tem senha, sua query abaixo tem que retornar vazia:

  1. mysql> SELECT Host, User FROM user WHERE Password = '';
  2. Empty set (0.00 sec)

Periodicamente procure por senhas duplicadas:

mysql> SELECT User from mysql.user GROUP BY password HAVING count(user) > 1;

Fique alerta quanto a hosts com curingas. Periodicamente faça o teste:

mysql> SELECT User, Host FROM mysql.user WHERE Host LIKE '%\%%';

Com esse passo a passo seu banco de dados já está mais seguro contra invasões e usuários não autorizados. Em breve trarei mais tópicos de como melhorar sua segurança.

Viva ao meu, seu, nosso MySQL! Até mais!



Tuesday, November 1, 2011

Identificadores no MySQL

Olá Pessoal. Vamos falar nesse artigo sobre Identificadores no MySQL, algo extremanente importante em nosso cotidiano com o banco de dados, mas que por vezes não entendemos bem o funcionamento.

Quando escrevemos requisições SQL,  usamos nomes para se referir a banco de dados e outros objetos contidos no mesmo, tais como tabelas, stored routines, triggers entre outros. Alguns destes objetos tem em seus componentes nomes próprios. Por exemplo, tabelas em suas colunas e índices. Ou ainda é possível criar 'apelidos' (Alias), pelo quais atuam como sinônimos para nomes de tabelas e colunas.

Sintaxe

Identificadores podem estar ou não entre acentos grave (`). Se não estiver deve seguir algumas regras:

  • Ele pode conter qualquer caracter alfanumerico, o (_) e o sinal de dolar $;
  • O identificador pode iniciar com qualquer caracter citado acima, inclusive números. Contudo, é melhor evitar identificadores que podem ser entendidos como constantes. Por exemplo 1e3 pode ser considerado um numero de notação cientifica ou 0x1 como uma contante hexadecimal. Portanto nenhum dos dois são bons candidatos à identificadores.
  • Um indentificador não pode ser apenas números.
Um identificador estando entre acentos agudos pode conter espaços, aspas simples ou duplas. Caso o SQL mode esteja habilitado em ANSI_QUOTES você também pode usar as aspas duplas ("). Usando desta forma há algumas regras para serem seguidas:
  • Em geral, qualquer caracter pode ser usado em um identificador entre aspas. Excessões neste caso são que um identificador não pode conter um byte com um valor numero 0 ou 255, e os nomes de banco de dados e tabelas não podem conter '.', '/' ou '\'.
  • Um identificador entre aspas pode conter apenas números.
  • Um identificador pode incluir qualquer palavra, mas caso esta seja uma palavra reservada (tais como SELECT ou DESC), conter caractes especiais, ou ser apenas números ele deve ser obrigatoriamente adicionado entre aspas ou acento grave.
Caso você não esteja certo se o seu identificador é ou não uma palavra reservada coloque ele entre acentos grave.


Case Sensitivity de Identificadores

Uma caracteristica que afeta como usamos identificadores é se eles são case sensitive. Alguns podem ser e outros não. As regras que determinam essas caracteristicas dependem que tipo de identificador estamos lidando:
  • Para banco de dados e tabelas o case sensitivity dependem do sistema operacional e do sistem de arquivos do servidor. Ou ainda da variável de sistema lower_case_table_names. Bancos de dados ou tabelas são representados por diretorios e arquivos, então se o sistema operacional não é case sensitive os identificadores também não são.
    O Windows não é case sensitive, porém a maioria dos sistemas Unix são. Contudo, se a a variável de sistema lower_case_table_names estiver setada para 1 ou 2, identificadores de banco de dados e tabelas são usados no estilo case-insensitive em declarações SQL. Caso deseje usar esssa variavel, você deve seta-la antes de começar a criar seus bancos de dados e tabelas.
    Independente das propriedades do seu sistema de arquivos, identificadores de bancos de dados e tabelas devem ser escritos de forma consistente com o mesmo padrão em toda declaração SQL.
  • Identificadores para colunas, índices, stored routines e triggers não sao case sensitive.
  • 'Alias' para colunas não sao case sensitive.

Utilizando 'Nomes Qualificados'

Identificadores de colunas e tabelas podem ser escritas de forma qualificada - isto quer dizer, junto com o identificador de um nivel superior utilizando o ponto '.' como separador. Algumas vezes estes qualificadores são necessários para resolver problemas de ambiguidade. Outras vezes você pode eleger seu uso para tornar uma declaração mais simples ou precisa.

Uma tabela pode ser qualificada com o nome do banco de dados que ela pertence. Ambos os casos trazem o mesmo resultado:

SELECT * FROM tb1;
SELECT * FROM db1.tb1;

Uma coluna também pode ser qualificada com o nome da tabela à que pertence. E como a tabela também pode ser qualificada podemos ter até 3 formas diferentes de escrever a mesma query:

SELECT coluna1 FROM tb1;
SELECT tb1.coluna1 FROM tb1;
SELECT db1.tb1.coluna1 FROM db1.tb1;

Store routines e triggers também podem  ser referenciados em uma forma qualificada. No primeiro caso a qualificação é pelo banco de dados à que pertence. Um trigger é associado com uma tabela, neste caso ele deve ser associado com a mesma (table_trigger.trigger_name).

Em identificadores entre aspas em nomes qualificados use eles separados. Por exemplo: db1.tb1 como `db1`.`tb1` e não `db1.tb1`.


Usando Palavras Reservadas como Identificadores

Palavras reservadas (Reserved Words) são especiais. Por exemplo, nome de funções não podem ser usadas como identificadores de tabelas ou colunas, e caso tente mensagens de erros podem ser emitidas. A declaração abaixo é um exemplo claro do uso errôneo:

mysql> CREATE TABLE t (order INT NOT NULL UNIQUE, d DATE NOT NULL);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order INT NOT NULL UNIQUE, d DATE NOT NULL)' at line 1

Igualmente, a outra query abaixo retornará a mesma situação:

mysql> SELECT 1 AS INTEGER;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER' at line 1

A solução para estes problemas é colocar os identificadores entre aspas / acentos agudos. As regras desse encapsulamento do identificador dependem do seu tipo:
  •  Para utilizar uma palavra reservada como banco de dados, tabela, coluna ou indentificar um índice há um ou dois estilos para o encapsulamento, dependendo do SQL mode do servidor. Por padrão, palavras reservadas utilizando acento grave "`" podem ser usadas como identificadores:
mysql> CREATE TABLE t (`order` INT NOT NULL UNIQUE, d DATE NOT NULL);
Query OK, 0 rows affected (0.00 sec)

Se o ANSI_QUOTES no SQL mode estiver habilitado você pode escrever a declaração da usando aspas duplas:

mysql> CREATE TABLE t ("order" INT NOT NULL UNIQUE, d DATE NOT NULL);

Query OK, 0 rows affected (0.00 sec)
Se é necessário encapsular um identificador para sua criação, em todas as declarações envolvendo ele também será necessário executar o mesmo procedimento.
  • Pode-se usar uma palavra reservada como um 'Alias' usando aspas simples, duplas ou acento agudo. O SQL mode não faz diferença, uma vez que é legal utilizar qualquer uma das três formas. Portanto, para usar INTEGER como um 'alias' você pode escrever em todos os modos abaixo:

SELECT 1 AS 'INTEGER';SELECT 1 AS `INTEGER`;SELECT 1 AS "INTEGER";
É uma boa ideia evitar nomes de funções como identificadores. Normalmente, eles não são reservados, contudo há circunstancias pelo qual isto pode não ser verdade:
  • Algumas funções tem nomes que também são palavras chaves 'keywords' e portanto reservadas. CHAR() é um exemplo.
  • Por padrão, um nome de função seguido de um parenteses aberto deve ser escrito sem espaços entre eles. Isso permite ao statement parser do MySQL distinguir um nome em uma função do mesmo para outro propósito, tal como um identificador.
Contudo, se o IGNORE_SPACE SQL mode estiver habilitado, o servidor permite espaços entre o nome da função e seu parenteses de abertura "(". Rodando o servidor desse modo o nome de algumas funções passam a ser ambinguas em alguns contextos, uma vez que o statement parser não consegue mais distinguir seguramente se um nome representa uma função ou um identificador.
veja abaixo:

mysql> INSERT INTO COUNT (id) VALUES(43);

EM IGNORE_SPACE mode, esta declaração pode significar "criar uma nova linha na tabela COUNT, setando a coluna id com 43", ou pode significar uma falha de sintaxe na declaração INSERT que tem uma chamada da função COUNT onde o nome da tabela deveria estar. O parse não consegue distinguir.

Outra observação, palavras reservadas não são case sensitive. Elas pode ser escritas em maíusculo, minusculo ou ainda com ambos. Elas também não precisam ser escritas da mesma forma por toda a query. O mesmo também é verdadeiro para nome de funções.


Thursday, October 20, 2011

MTBF e MTTR em sua aplicação. Sua equipe de TI sabe do que estamos falando?


Olá galera, esta semana estou fazendo um curso de Alta Disponibilidade com MySQL Cluster e entre os vários tópicos abordados há uma forma de calcular o tempo de atividade Uptime "disponibilidade"das máquinas. E sendo esta umas das principais razões para usarmos o Cluster do MySQL o assunto realmente me interessou, o que me fez ler e procurar entender melhor o conceito e de quebra fiz este artigo baseado em um outro do site http://world-class-manufacturing.com uma vez que não encontrei muita documentação em português. Espero que apreciem.


MTBF e MTTR o que são?

MTBF, Mean Time Between Failures (Tempo médio entre falhas) e MTTR - Mean Time To Repair (Tempo médio de reparo) são dois importantes KPI's dentro do nível de desempenho de processos.

MTBF = (Total up time) / (número de breakdowns)
MTTR = (Total down time) / (número de breakdowns)


MTBF e MTTR - O que eles querem dizer?

"Tempo médio" significa, estatisticamente falando, o valor médio de tempo dentre a ocorrência de uma mesma situação.

“Mean Time Between Failures” (MTBF) é literalmente a média de tempo decorrida entre uma falha e a próxima vez em que ela irá ocorrer. Normalmente pessoas pensam nisto como uma média de tempo de alguma coisa funcionando até  falhar e precisar ser reparada (novamente).

“Mean Time To Repair” (MTTR)  é a média de tempo que se leva para reparar alguma coisa depois de uma falha.

Para algo que não pode ser reparado o termo correto é MTTF - “Mean Time To Failure” (Tempo médio para falhas). Alguns definiriam MTBF - para dispositivos reparáveis -  como a soma de MTTF mais MTTR.  (MTTF = MTTF + MTTR). Em outras palavras, o Meio Tempo entre falhas é o tempo entre uma falha e outra. Esta distinção é importante se o tempo de reparo (MTTR) é uma fração significante do MTTF.

Aqui está um exemplo: Uma lâmpada em um candelabro não é reparável, então MTTF é mais apropriado. A lâmpada deve ser trocada. O MTTF possivelmente é de 10.000 horas.

Por outro lado, sem trocas de óleos, um motor de carro pode falhar depois de 150 horas dirigindo em uma rodovia - neste caso é MTTF. Assumindo 6 horas para remover e substituir o motor (MTTR), MTBF é 150 + 6 = 156 horas.

Como automóveis, a maioria de equipamentos manufaturados serão reparados, ao invés de substituidos após uma falha. Logo MTBF é a mais apropriada forma de medir.


O que é uma falha?

""Falha" pode ter vários significados. Vamos rapidamente examinar uma falha em um dispositivo:

Uma Fonte de Energia Ininterrupta (UPS - Uninterruptible Power Source) pode ter cinco funções dentro de duas condições:
  • Enquanto a principal fonte de energia está disponível:
    • F1) Permite a energia circular da fonte principal para as máquinas protegidas;
    • F2)Condiciona a energia limitando saltos ou interrupções;
    • F3)Armazena energia em uma bateria até completá-la;
  • Quando a principal fonte de energia é interrompida:
    • F4)Fornece energia para as máquinas protegidas;
    • F5)Emite um sinal indicando que a forte de energia principal está inoperante;
Não há dúvida sque o UPS falhou se ele interromper o fluxo de energia provido pela fonte principal para as máquinas protegidas (F1). Falhas para F2, F3 ou F5 podem não ser óbvias porque as "máquinas protegidas" estão ainda rodando pela fonte principal ou pela bateria. Ainda que notado, estas falhas pode não acionar medidas corretivas porque as "máquinas protegidas" estão ainda rodando e pode ser mais importante mantê-las rodando do que corrigir ou substituir o UPS.


O que é Disponibilidade? 

A "disponibilidade" de um equipamento é, matematicamente, MTBF / (MTBF + MTTR) para tempo de trabalho programado.

O automóvel do exemplo anterior está disponível para 150/156 = 96,2% do tempo. O reparo é tempo de inatividade não programada.

Com meia hora de não programada troca de óleo a cada 50 horas dirigidas - acontece quando um indicador no painel do carro alerta o motorista -  o tempo de disponibilidade sobre para 50 / 50.5 = 99%.

Se trocas de óleo fossem agendadas corretamente como atividade de manutenção a disponibilidade do veículo seria de 100%.


Porque tudo isso é importante?

"Disponibilidade" é um indicador de performance para processos e fábricas. É parte da medida da eficácia geral do equipamento ou “Overall Equipment Effectiveness” (OEE).

Uma produção programada que inclui tempos de paradas para manutenção preventiva pode precisamente prever o total de uma produção. Agendamentos que ignoram MTBF e MTTR são simplesmente um desastres (programados ou não, desculpe o trocadilho) aguardando para acontecer.


Como calcular o atual MTBF

Atual ou histórico MTBF é calculado usando observações no mundo real. (Há uma disciplina para designers de equipamentos preverem MTBF, baseado nos componentes e cargas de trabalho previstas).

Calculando o atual MTBF requer um conjunto de observações, onde cada uma seria:
  • Tempo de Funcionamento (Uptime_moment): o momento no qual a máquina começa a operar (inicialmente ou após um reparo);
  • Tempo de Parada (Downtime_moment): o momento no qual a máquina parou após iniciado suas operações.
Cada tempo entre falhas (Time Between Failure TBF) é a diferença entre um tempo de funcionamento (Uptime_moment) e seu tempo de parada (Downtime_moment) subsequente.

Três quantidades são requeridas:

n = Numero de observações
ui = Este é o ith Uptime_moment 
di = Este é o ith Downtime_moment seguido de um ith Uptime_moment


Então temos MTBF = Sum (di - ui) / n, para todos i = 1 entre n observações. Mais simplesmente, este é o tempo de trabalho total dividido pelo número de falhas.


Texto extraído e traduzido de http://world-class-manufacturing.com/KPI/maintenance.html.

Outras referências sobre o assunto:
http://pt.wikipedia.org/wiki/Indicador-chave_de_desempenho

Thursday, October 13, 2011

Quiz de MySQL - Por que não testar o que sabe?

Olá à todos. Neste post teremos um pequeno quiz para checar o quanto sabemos sobre MySQL. Estas questões não são oficiais ou fazem parte de nenhuma certificação, mas nos dão uma dica de como anda nosso conhecimento sobre esse banco de dados. Ao final das questões vocês podem encontrar as respostas e caso desejem comentem sobre seu score. Abraços e espero que se divirtam.
                       
1) MySQL roda em que sistemas operacionais?
a) Linux e Mac OS-X apenas
b) Qualquer um
c) Unix, Linux, Windows e outros
d) Unix e Linux apenas

2) Para remover registros duplicados de um result set de um SELECT use a palavra-chave abaixo:
a) NO DUPLICATE
b) UNIQUE
c) DISTINCT
d) Nenhuma das respostas anteriores

3) Qual das respostas abaixo podem adicionar uma linha na tabela?
a) Add
b) Insert
c) Update
d) Alter

4) Para usar MySQL no seu computador você precisará?
a) FTP e Telnet
b) Algum tipo de client programa para acessar os banco de dados
c) Um Browser
d) Perl, PHP ou Java

5) Qual declaração SQL é usada para inserir um novo dado no banco de dados?
a) INSERT INTO
b) UPDATE
c) ADD
d) INSERT NEW

6) Em uma cláusula LIKE você poderia pedir por qualquer valur terminado em 'qpt' escrevendo:
a) LIKE %qpt
b) LIKE *ton
c) LIKE ton$
d) LIKE ^.*ton$

7) Um valor NULL é tratado como blank ou 0.
a) Verdadeiro
b) Falso
c) Nenhuma das respostas acima

8) MySQL é
a) Uma linguagem de Programação
b) Uma tecnica para escrever programs confiáveis
c) Um Sistema de Gerenciamento de Banco de dados Relacionais

9) Em uma cláusula LIKE você pode solicitar por qualquer valor de 6 digitos digitando?
a) LIKE ??????
b) LIKE .{6} Answer 5: LIKE ^.{6}$
c) LIKE ...... (6 pontos)
d) LIKE ______ (6 underscore characters)

10) O resultado de um SELECT pode comter linhas duplicadas.
a) Falso
b) Verdadeiro
c) Nenhuma das respostas acima

11) Qual função é usada para pegar o tempo corrente no MySQL?
a) getTime()
b) Time()
c) NOW()

12) Uma tabela pode fazer um JOIN nela mesma.
a) Verdadeiro
b) false
c) Nenhuma das respostas acima

13) Qual valor abaixo não é uma função de agregação?
a) COUNT
b) MIN
c) MAX
d) COMPUTE

14) mysql_pconnect() é usada para fazer a persistência com o banco de dados, o que significa um link SQL que não fecha quando a execução do seu script acaba. 
a) Verdadeiro
b) Falso

15) O que uma cláusula SQL usa para restringir o numero de linhas retornadas?
a) AND
b) WHERE
c) HAVING
d) FROM

16) Qual valor abaixo é usado para remover um banco de dados MySQL?
a) mysql_drop_database
b) mysql_drop_entiredb
c) mysql_drop_db
d) mysql_drop_dbase

17) MySQL suporta o padrao SQL99
a) Falso
b) Verdadeiro

18) Primary Key permite valores NULL, e UNIQUE KEY não aceita valores NULL.
a) Falso
b) Verdadeiro

19) Quantos caracteres são permitidos no nome de um banco de dados?
a) 55
b) 72
c) 64
d) 40

20) Qual comando abaixo deveria ser usado para criar um banco de dados chamado “student”?
a) CREATE ?I student
b) CREATE DATABASE student
c) DATABASE /student
d) DATABSE student

21) Qual comando irá deletar a estrutura da tabela e seus dados?
a) TRUNCATE
b) DROP

22) O que faz o comando USE?
a) É usado para carregar código de outro arquivo
b) tornou-se obsoleta e deve ser evitado por razões de segurança
c) É um pseudônimo para o comando SELECT
d) No caso de ser utilizado para escolher o banco de dados que deseja usar, uma vez que você tenha conectado ao MySQL

23) Data a tabela employees abaixo:  

emp_idemp_name
1Brush
2Jerrin

Que valor vai retornar com a query SELECT COUNT(*) FROM employees?
a) 3
b) 2
c) 1
d) Nenhuma das respostas acima

24) O principal programa MySQL que faz todo o tratamento dos dados é chamado?
a) mysql.exe
b) mysql
c) mysqld
d) httpd

25) Um comando SELECT sem uma cláusula WHERE retorna?
a) Todos os registros de uma tabela que correspondem à anterior cláusula WHERE
b) Todos os registros de uma tabela ou de informações sobre todos os registros
c) SELECT é inválido sem uma cláusula WHERE
d) Nada


26) O acesso de segurança do MySQL é controlado através de?
a) O ID que o usuário conectado ao servidor através e privilégios criados para essa conta
b) As contas de login MySQL e privilégios estabelecidos para cada conta
c) A segurança login normal é suficiente para MySQL, e ele não tem qualquer controle extra de seu próprio.
d) Uma tabela de endereços IP válidos, e os privilégios criados para cada endereço IP

27) Em um SELECT com uma cláusula GROUP BY, a cláusula WHERE e uma cláusula HAVING, as condições WHERE são aplicados antes que as condições HAVING.
a) Verdadeiro
b) Falso
c) Ambos Verdadeiro ou Falso
d) Nenhuma das respostas acima



Respostas:


(1) c(2) c(3) b(4) b(5) a
(6) a(7) b(8) c(9) d(10) b
(11) c(12) a(13) d(14) a(15) b
(16) c(17) a(18) a(19) c(20) b
(21) b(22) d(23) b(24) c(25) b
(26) b(27) a

Tuesday, September 20, 2011

Instalando distribuição binária do MySQL no CentOS



Ola galera! Ultimamente venho estudando para tentar passar na primeira prova de certificação da Oracle MySQL DBA I e vou contar um coisa: é bem complicado, contudo é muito prazeroso. O primeiro caso se dá pelo fato de eu como desenvolvedor que sempre esteve sob plataforma Windows (desculpe, não tenho orgulho disso) quando cheguei em um nível onde o Linux é fundamental tive algumas dificuldades.

Neste novo ambiente tive que instalar e configurar o MySQL (MySQL Community Server 5.5.16)  no Linux (CentOS Linux release 6.0 Final) e para isso precisei entender melhor como essa plataforma, comandos e recursos funcionam uma vez que diferem bastante do Windows. Enfim, vamos ao que interessa, fazer o nosso servidor rodar.


Escolha da distribuição e instalação do MySQL

Assim como consta no manual podemos fazer a instalação de várias formas, optei por utilizar a distribuição binária Linux - Generic 2.6 (x86, 64-bit), Compressed TAR Archive disponivel no próprio site da MySQL  (link direto para essa distribuição aqui). Bem, uma vez feita o download temos que antes de mais nada criar um usuário e grupo para trabalhar com o servidor MySQL. Logue no seu Linux como root e rode os comandos abaixo. Eles criam um grupo para o MySQL e adicionam um usuário que vai servir apenas para fins administrativos sem direitos de login.

shell> groupadd mysql
shell> useradd -r -g mysql mysql

Alteramos nosso diretório para o local onde instalaremos nosso server. Suponho neste ponto que você também tenha feito o download aqui, então vamos extrair a distribuição e alterar o nome da pasta atual "full-path-to-mysql-VERSION-OS" para algo mais simbolico como "mysql".

shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s mysql-5.1.59-linux-i686-glibc23 mysql

Vamos agora acessar o novo diretorio criado e dar para ele as permissões do grupo mysql que criamos anteriormente.

shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .

Feito isso, a instalação pode ser executada. Abaixo o comando faz a criação das pastas iniciais da sua base de dados MySQL. Eles serão criados em /var/lib/mysql, recomendo que você crie esse diretorio antes e dê também as mesmas permissões como feito no passo anterior.

shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data

Os próximos comandos são opcionais, mas recomendo que sejam executados também. Neles criamos um my.cnf no diretório etc, atribuimos um usuário para o servidor mysqld_safe e criamos uma copia do mysql.server na pasta de inicialização do Linux. Observer neste ultimo passo que também mudamos o nome do arquivo ao fazer a copia de mysql.server para mysql. Assim o servidor será carregado automaticamente quando o linux iniciado.

shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> bin/mysqld_safe --user=mysql &
shell> cp support-files/mysql.server /etc/init.d/mysql


Configuração e teste do servidor

Uma vez instalado o seu servidor temos que agora alterar alguns parametros no nosso arquivo my.cnf para que o servidor rode corretamente. A propósito essa foi uma pequena dor de cabeça pra mim ao instalar pela primeira vez deste modo já que na documentação oficial o passo a passo solicita você testar antes de checar essas informações. Enfim, abaixo segue aproximadamente como seu my.cnf deve ficar para o servidor rodar, eu usei o vi do Linux para edita-lo.

[mysqld]
datadir=/var/lib/mysql/
socket=/tmp/mysql.sock
port=3306
user=mysql

[mysql.server]
basedir=/usr/local/mysql


Desta forma seu servidor está pronto para rodar. Basta executar o comando abaixo e você receberá a mensagem de sucesso.

shell>> /etc/init.d/mysql start
Starting MySQL.. SUCCESS!

Agora vamos finalmente configurar uma variável de ambiente com o caminho da pasta bin adicionando um PATH no sistema. Crie um arquivo chamado mysql.sh como mostrado abaixo e adicione dentro dele o caminho PATH=${PATH}:/usr/local/mysql/bin (necessário reiniciar para essa alteração funcionar). Feito isso, basta apenas rodar o mysql client no seu shell e pode comecar a trabalhar em sua nova base de dados.

shell>> touch /etc/profile.d/mysql.sh
shell>> mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.59 MySQL Community Server (GPL)
mysql>


Bem, basicamente isso galera. Lembrando ainda que temos que implementar ainda a seguranca do nosso banco de dados que você encontra referências em inglês aqui. Espero em breve estar escrevendo sobre isso também visto que é mais um conhecimento também requerido na certificação ORACLE SCMDBA. Obrigado à todos e qualquer dúvida deixe um comentário.

Referências:

Wednesday, September 14, 2011

Bancos Relacionais: 13 regras de Ted Codd


Olá galera, hoje vamos falar sobre uma importante figura na história dos banco de dados relacionais, Ted Codd. Ele realizou avanços na área que norteiam até hoje a estrutura desse modelo. Enjoy!

Os  bancos  de  dados  relacionais  foram  idealizados  por  Edgar  Frank  "Ted"  Codd, um  cientista  de  computação  britânico  que,  enquanto  trabalhava  para  a  IBM,  inventou  o modelo relacional para a gestão de banco de dados, a base teórica para bancos de dados relacionais.

Ele  fez  outras  contribuições  valiosas  para  a  ciência  da  computação,  mas  o modelo  relacional,  uma  teoria  muito  influente  sobre  gestão  de  dados  gerais,  continua sendo seu feito mais citado. Em 1970 ele apareceu com 13 leis (numeradas de 0 a 12) que descreveriam o que é um banco de dados relacional e o que é um Sistema Gerenciador de Banco  de  Dados  Relacionais  faz  e,  várias  leis  de  normalização  que  descrevem  as propriedades  de  dados  relacionais.  Apenas  os  dados  que  haviam  sido  normalizados poderiam ser considerados relacionais.
  1. Regra  Fundamental:  Um  SGBD  relacional  deve  gerenciar  seus  dados usando apenas suas capacidades relacionais. 
  2. Regra  da  informação:  Toda  informação  deve  ser  representada  de  uma única forma, como dados em uma tabela. 
  3. Regra da garantia de acesso: Todo dado (valor atômico) pode ser acessado logicamente  (e  unicamente)  usando  o  nome  da  tabela,  o  valor  da  chave primária da linha e o nome da coluna. 
  4. Tratamento  sistemático  de  valores  nulos:  Os  valores  nulos  (diferente  do zero,  da  string  vazia,  da  string  de  caracteres  em  brancos  e  outros  valores não  nulos)  existem  para  representar  dados  não  existentes  de  forma sistemática e independente do tipo de dado. 
  5. Catálogo dinâmico on-line baseado no modelo  relacional: A descrição do banco de dados é representada no nível lógico como dados comuns (isso é, em  tabelas),  permitindo  que  usuários  autorizados  apliquem  as  mesmas formas de manipular dados aplicados aos dados comuns ao consultá-los. 
  6. Regra  da  sub-linguagem  compreensiva:  Um  sistema  relacional  pode suportar várias linguagens e formas de uso, porém deve possuir ao menos uma  linguagem  com  sintaxe  bem  definida  e  expressa  por  cadeia  de caracteres e com habilidade de apoiar a definição de dados, a definição de visões, a manipulação de dados, as restrições de integridade, a autorização e a fronteira de transações. 
  7. Regra  da  atualização  de  visões:  Toda  visão  que  for  teoricamente atualizável será também atualizável pelo sistema. 
  8. Inserção,  atualização  e  eliminação  de  alto  nível:  A  capacidade  de manipular  a  relação  base  ou  relações  derivadas  como  um  operador  único não  se  aplica  apenas  a  recuperação  de  dados,  mas  também  a  inserção, alteração e eliminação de dados. 
  9. Independência dos dados físicos: Programas de aplicação ou atividades de terminal  permanecem  logicamente  inalteradas  quaisquer  que  sejam  as modificações  na  representação  de  armazenagem  ou  métodos  de  acesso internos. 
  10. Independência  lógica  de  dados:  Programas  de  aplicação  ou  atividades  de terminal  permanecem  logicamente  inalteradas  quaisquer  que  sejam  as mudanças  de  informação  que  permitam  teoricamente  a  não  alteração  das tabelas base. 
  11. Independência  de  integridade:  As  relações  de  integridade  específicas  de um banco de dados relacional devem ser definidas em uma sub-linguagem de dados e armazenadas no catálogo (e não em programas). 
  12. Independência  de  distribuição:  A  linguagem  de  manipulação  de  dados deve  possibilitar  que  as  aplicações  permaneçam  inalteradas  estejam  os dados centralizados ou distribuídos fisicamente. 
  13. Regra da Não-subversão: Se o sistema relacional possui uma linguagem de baixo  nível  (um  registro  por  vez),  não  deve  ser  possível  subverter  ou ignorar as regras de integridade e restrições definidas no alto nível (muitos registros por vez). 

Artigo extraído parcialmente de http://www.scribd.com/doc/50553904/Apostila-de-SQL.

Friday, August 19, 2011

MySQL 5.5 - Razões para Escolher MySQL: Performance e Escalabilidade

Olá galera hoje estou fazendo uma tradução livre do whitepaper Top 10 Reasons to Choose MySQL for Web-based Applications da Oracle http://www.mysql.com/why-mysql/white-papers/mysql-wp-top10-webbased-apps.php. Neste artigo a performance e escalabilidade da ferramenta é abordada em vários aspectos que fazem toda a diferença ao escolher o seu banco de dados ou mesmo a versão,  espero que gostem.


Em nosso mundo online, competição esta sempre a um click (ou toque na tela) de distância, e respostas rápidas para requisições e atividades de clientes são portanto cruciais. O banco de dados de uma aplicação web precisa oferecer performance extrema para operações de leituras (query simples ou complexa) e escrita.

Outro fator de performance é que este mesmo tipo de performance extrema deve exibir problemas de sobrecarga de dados (ex.: milhares de conexões simutâneas) ou volumes de dados (GB para TB).

Aplicações web precisam estar preparadas para rápidas mudanças em uma crescente quantidade de clientes, sem experimentar nenhuma interrupção nos seus serviços ao cliente.

Uma marca do MySQL é sua excepcional performance e escalabilidade, o qual faz tantas empresas na web utilizarem esta ferramenta. O MySQL utiliza de vários mecanismos para entregar uma boa performance em seu uso, tais quais:

InnoDB como novo Storage Engine padrão no MySQL 5.5

InnoDB é o mais largamente usado storage engine na Web/Web 2.0, eCommerce, mídias em geral e aplicações de entretenimento construídas com MySQL, e por boas razões; InnoDB fornece alta eficiência ACID com seus controles transacionais e sua arquitetura única que garante uma excelente performance e escalabilidade. Mais, InnoDB é estruturalmente desenhado para manipular aplicações transacionais que requerem recuperação em suas paradas, integridade referencial, e altos leveis de concorrência entre usuários.

Uma das mais notáveis melhorias no MySQL 5.5 é que o InnoDB é agora o storage engine padrão para novas tabelas criadas, permitindo usuários desenvolver aplicações transacionais sem necessidade de alterar as configurações do serviço. Para MySQL 5.5 InnoDb foi reestruturado de forma que ele foi otimizado para tirar o máximo de vantagens das capacidades de processadores, hardwares e do sistema operacional.

Em testes usando o MySQL 5.5 release candidate comparado com o MySQL 5.1, resultados demonstraram claramente as melhorias em performance obtidas:
  • No Windows: até 1500% de ganhos em performance para operações de Leitura/Escrita e 500% em apenas Leitura.
  • No Linux: até 360% de ganhos em performance em Leitura/Escrita e outros 200% em apenas Leitura.
Mais informações estão disponíveis em "What's New in MySQL 5.5" whitepaper em:
http://www.mysql.com/why-mysql/white-papers/mysql-wp-whatsnew-mysql-55.php

Replicação MySQL

MySQL tem sido amplamente posicionado por alguns dos principais websites para alcançar níveis extremos de escalabilidade. DBAs podem simples e rapidamente criar várias réplicas de seus bancos de dados em alta escala bem além das limitações de capacidade de uma instância simples, habilitando eles manipularem uma crescente carga no banco de dados.

Rápida manipulação de Conexões

MySQL oferece uma excelente manipulação de thread/connection cache onde rapidamente estabelece solicitações de novas conexões e finaliza outras já existentes. O pool de conexões do MySQL sempre tem novos threads prontos para servir requisições de seus clientes fazendo com que não haja criação de novas conexões do zero. Isso significa que conectando e desconectando de uma base MySQL não prejudica sua performance.

Utilizando o poder da memória

MySQL explora os avanços na abundância de memória dos servidores atuais para garantir a máxima performance. Além de utilizar padrões da industria em dados e indíces para manter a referencia da informação na memória para rápido acesso, ele também possui caracteristicas próprias tais como:

Primeiramente, tabelas em memória para respostas extremamente rápidas. O MySQL Cluster fornece ainda a opção de uso de tabelas em memórias como parte do schema do banco de dados. Essas mesmas tabelas mantém sua alta performance mesmo que o discos se encontrem na situação "warm".

Adicionalmente, MySQL fornece um query cache que é especialmente desenhado para aplicações web modernas onde a repetição de das mesmas querys é elevada. O MySQL não armazena somente a query enviada pela aplicação mas também o result set da mesma. Notamos que isso é  completamente diferente da situação de reconstrução de um result set a partir da memória - neste caso este result set não é recalculado. Esta forma de cache se mostra extremamente útil para aplicações web onde há necessidade de prover a mesma e a mesma informação novamente.

Outras propriedades relacionadas com a performance MySQL

MySQL contém várias outras configurações de performance que ajudam aplicações web a garantir suas necessidades de demanda atual. Por exemplo, a partição de dados esta disponível para aplicações que necessitam horizontalmente separar seus dados em uma tabela e índices associados. O MySQL optimazer é inteligente o suficiente para escanear apenas as partições necessárias para satisfazer a query do usuário final, no qual vai reduzir drasticamente o tempo de resposta do banco. Completo suporte a range, hash, list e composite/sub partitioning está disponível entre várias colunas, assim como tipos de dados texto e númericos.

Finalmente, MySQL contém todas as funções e utilitários para ajudar profissionais Web a desenhar suas aplicações fornecendo altos indices de performance. Inúmeros tipos de índices (clustered, full-text, hash, spatial, b-tree), ilimitado row-level locking coupled com MVCC (no qual resulta em um pequeno lock da tabela, caso haja) e muito mais fazem do MySQL uma excelente opção para esses esperados bancos de dados de alta performance.


Bem, por hoje é isso, em breve estarei postando mais novidades sobre esse excelente SGDB. Abraços e bom MySQL Timing!



Thursday, June 30, 2011

O que é um Banco de dados em Cluster?

Um cluster é uma coleção de produtos componentes para prover escalabilidade e disponibilidade a baixos custos. Com isso em mente, é possível criar um banco de dados em cluster para aplicações empresariais de alta qualidade armazenando e processando informações por nós entre os produtos. A arquitetura para um banco de dados em cluster é distinguido por como as responsábilidades com os dados são compartilhadas entre os computadores em rede (nós).

Em uma arquitetura shared-nothing (nada compartilhado), o particionamento é de forma que cada nó (computador) possua uma parcela dos dados. Isto é, um nó irá operar exclusivamente em uma porção de dados. Escalabilidade, obviamente, depende de um bom particionamento. Em uma partição física pode ser que um computador coloque sua porção de dados em seu disco local com todos os nós conectados via rede de alta velocidade (tal como Myrinet ou InfiniBand). Tal esquema - pelo qual se assemelha a uma rede de área de armazenamento - reduz a tolerância à erros mas um nó com problemas ainda pode tornar o dado inacessível. No entando, a partição física normalmente compartilha os discos, sendo que desta forma outro nó pode tomar pra si a responsabilidade de finalizar o processo.

Esta arquitetura é de longe a mais popular; IBM DB2, Microsoft SQL Server, MySQL Cluster, e Bizgres MPP (based on PostgreSQL) todos seguem este esquema. O lado ruim deste tipo de configuração é a dificuldade na instalação e manutenção.

Em uma arquitetura de shared-everything ou shared-disk (tudo compartilhado ou disco compartilhado) qualquer nó pode operar em qualquer porção do banco de dados. O modelo físico normalmente envolve armazenamento vinculado à rede (network-attached storage), no qual todos os nós se comunicam com um separador, disco compartilhado (frequentemente um RAID) via uma interconexão de alta velocidade (tradicionamente Fibre Channel). Novamente a partição lógica é a chave da escalabilidade. O lado ruim da arquitetura de compartilhar tudo é que possa haver um enorme tráfego quando vários nós tentam se comunicar com um específico disco simutaneamente.

Neste caso, o uníco grande banco de dados que oferece uma arquitetura de compartilhamento de tudo (shared-everything architecture) é o Oracle, cujo o produto RAC (Real Application Cluster) constroi um cache compartilhado em cada um dos seus nós por meio de "Cache Fusion". Esta tecnologia usa redes de alta velocidade para manter o cache coerênte.

Ambas arquiteturas podem requerer diferentes interconexões : Ethernet para gerenciamento, InfiniBand ou Myrinet para a comunicação entre nós e Fibre Channel para comunicação entre blocos de armazenagem. Dada as tendências de comotidização é possivel que iWARP ou Myri-10G irão emergir como simples interconexões para banco de dados em cluster.

Abaixo um video sobre o MySQL Cluster para exemplificar.




Thursday, February 3, 2011

Ambiente LAMP no Ubuntu para Iniciantes

Bom dia Galera,

Como dito no artigo anterior vou agora mostrar os comandos para configurar seu ambiente LAMP no Ubuntu. LAMP significa para o Linux, Apache, MySQL, PHP. O guia destina-se a ajudar aqueles que têm muito pouca experiência do uso do Linux.


Instalar o Apache

Para começar, vamos instalar o Apache.

1. Abra o Terminal (Aplicações Acessórios>> Terminal).

2. Copiar / Colar pressione a seguinte linha de código no terminal e digite:

sudo apt-get install apache2

3. O terminal vai pedir que você que você é a senha, digite-o e pressione enter.


Teste Apache

Para se certificar que tudo instalado corretamente, vamos agora testar o Apache para garantir que ele está funcionando corretamente.

1. Abra qualquer navegador e digite o seguinte endereço na web:

http://localhost/

Você deverá ver uma pasta chamada apache2-default /. Abra-a e você verá uma mensagem dizendo "It works!", funciona!


Instalar o PHP

Nesta parte vamos instalar o PHP 5.

Passo 1. Novamente abra o Terminal (Aplicações> Acessórios> Terminal).

Etapa 2. Copiar / Colar a seguinte linha no terminal e pressione enter:

sudo apt-get install php5 libapache2-mod-php5

Etapa 3. Para que o PHP para funcionar e ser compatível com Apache devemos reiniciá-lo. Digite o seguinte código no terminal para fazer isso:

sudo / etc/init.d/apache2 restart


Teste de PHP

Para garantir que não haja problemas com o PHP, vamos fazer um teste rápido.

Passo 1. Na cópia do terminal / cole a seguinte linha:

sudo gedit / var / testphp.php / www

Isto irá abrir um arquivo chamado phptest.php.

Etapa 2. Copiar / colar essa linha no arquivo phptest:



Etapa 3. Salve e feche o arquivo.

Etapa 4. Agora abra seu navegador e digite o seguinte endereço web:

http://localhost/testphp.php

A página deverá ficar assim:

Página de teste PHP

Você tem agora instalado Apache e PHP!


Instale o MySQL

Para terminar este guia até vamos instalar o MySQL. (Nota - Fora de Apache e PHP, MySQL é o mais difícil de configurar, vou dar alguns grandes recursos para qualquer pessoa a ter problemas no final deste guia..)

Passo 1. Mais uma vez abrir o Terminal surpreendente e, em seguida, copiar / colar essa linha:

sudo apt-get install mysql-server

Passo 2 (opcional). Para que outros computadores em sua rede para exibir o servidor que você criou, primeiro você deve editar o "Endereço de ligação". Comece abrindo o terminal para editar o arquivo my.cnf.

sudo gedit / etc / mysql / my.cnf

Altere a linha

bind-address = 127.0.0.1

E mudar o 127.0.0.1 para o seu endereço IP.

Etapa 3. Isto é onde as coisas podem começar a ficar complicado. Comece digitando o seguinte no terminal:

mysql-u root

Na sequência desta copiar / colar essa linha:

'localhost','root' mysql> SET PASSWORD FOR @ = PASSWORD ('yourpassword');

(Não esqueça de mudar yourpassword para uma senha de sua escolha.)

sudo gedit / etc/php5/apache2/php.ini

Agora vamos ter que descomentar a seguinte linha, retirando o ponto e vírgula (;).

Altere esta linha, ou caso ela não exista crie ela:

extension = mysql.so

Para ficar assim:

extension = mysql.so

Agora, basta reiniciar o Apache e está tudo pronto!

sudo / etc/init.d/apache2 restart

Espero que essas dicas tenham sido úteis. Abraços para todos e até a próxima.