Tutorial MySQL ( instalar em ambiente Linux – Debian )

Publicado: 09/02/2014 em Linux, Serviços IP
Tags:,

1. Instalação
a) Verificar qual a versão do pacote do servidor de Banco de Dados (BD) MySQL disponível no repositório:
$ apt-cache policy mysql-server

mysql-server:
Instalado: (nenhum)
Candidato: 5.5.31+dfsg-0+wheezy1

Pela resposta do sistema vemos que o servidor BD MySQL ainda não está instalado, onde o pacote candidato à instalação é a versão 5.5.31

b) Verificar qual a versão do pacote cliente MySQL (linha de comando) disponível no repositório:
$ apt-cache policy mysql-client

mysql-client:
Instalado: (nenhum)
Candidato: 5.5.31+dfsg-0+wheezy1

Pela resposta do sistema vemos que o cliente MySQL ainda não está instalado, onde o pacote candidato à instalação é a versão 5.5.31

c) Para fazer a instalação do servidor de BD MySQL e de seu pacote client:

# apt-get install mysql-server
Neste procedimento será solicitado a senha para o usuário root do MySQL (atenção: não tem nada haver com usuário root do S.O. !!), usuário este que será criado automaticamente na tabela mysql.user. Ao final da instalação o S.O. tentará iniciar o MySQL server.

Observações:

  • com este comando serão instalados simultaneamente o servidor de Banco de Dados MySQL e seu cliente (que oferece uma interface através de linha de comando para o usuário);
  • o arquivo de configuração do MySQL está em /etc/mysql/my.cnf ;
  • são criadas as bases de dados “information_schema” e “mysql” que armazenam várias informações de controle do funcionamento do servidor MySQL, incluindo informações sobre os usuários e sobre as demais bases de dados;
  • O pacote Debian do MySql-server cria o usuário “debian-sys-maint” que é utilizado nos scripts de start-stop e cron. Este usuário não deve ser deletado!
  • o MySQL tem um usuário padrão “root” que tem acesso a todas as bases de dados e privilégios especiais para tarefas de manutenção;
  • Duas tabelas são especialmente importantes:
    • mysql.user: tabela de concessões (“grant table”) que define os usuários do MySQL e seus privilégios de acessos.
    • mysql.db:
  • é recomendado que seja instalado o phpMyAdmin para facilitar o gerenciamento do banco.

d) Para fazer a instalação apenas do pacote MySQL client:
# apt-get install mysql-client

1.1 Verificação da instalação
a) Verificação 1: verificar se o MySQL está instalado corretamente na máquina
mysql> STATUS;
Se estiver corretamente instalado, uma resposta deve ocorrer semelhante a transcrição abaixo:

mysql Ver 14.14 Distrib 5.1.73, for debian-linux-gnu (x86_64) using readline 6.1

Connection id: 1939
Current database:
Current user: jose@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 5.5.31-1 (Debian)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 2 days 21 hours 22 min 35 sec

Threads: 1 Questions: 17075 Slow queries: 0 Opens: 639 Flush tables: 2 Open tables: 58 Queries per second avg: 0.68
————–

b) Verificação 2: verificar as variáveis do MySQL
mysql> SHOW VARIABLES;
Para visualizar os nomes das variáveis do sistema e seus valores.

c) Verificação 3: se processo do MySQL server foi iniciado e está “ativo”
$ ps -A
3535 ? 00:00:00 mysqld_safe
3660 ? 00:00:50 mysqld

d) Verificação 4: tentando acesso ao MySQL de forma indevida
Mostramos a seguir duas tentativas de acesso ao MySQL sem senha, cuja resposta (corretamente) foi de negação:
joao$ mysql
ERROR 1045 (28000): Access denied for user 'joao'@'localhost' (using password: NO)

joao$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Caso tenha ocorrido a conexão com sucesso ao servidor de banco de dados sem a solicitação de uma senha, existe fragilidade de segurança que deve ser corrigida. O procedimento correto seria na linha de comando informar que será fornecido um password. Quando informado o password correto, o usuário terá acesso ao prompt do MySQL. Por exemplo, para tentar acessar o MySQL utilizando o usuário root o comando seria:
joao$ mysql -u root -p

e) Verificação 5: olhando diretamente a tabela de usuários do MySQL

mysql> SELECT User, Host, Password FROM mysql.user;
+------------------+-----------------------+--------------------------------------------------------------------+
| User                | Host                       | Password                                                                         |
+------------------+-----------------------+--------------------------------------------------------------------+
| root                  | localhost               |                                                                                           |
| root                  | 127.0.0.1              | *FE23015365952A341A576684A19831B890F9DC45 |
+------------------+-----------------------+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

No caso acima temos uma falha de segurança: qualquer usuário da máquina ou aplicação hospedada nesta poderá ter acesso ao prompt do MySQL utilizando usuário root, sem necessitar informar a senha. Por exemplo, este acesso poderá se dar através do simples comando abaixo:
$ mysql -u root

Algumas verificações quanto a segurança são necessárias de serem feitas logo que se instala o servidor MySQL. Uma boa explanação sobre isto pode ser conseguida no manual do MySQL na sessão Securing the Initial MySQL Accounts. Explicando um pouco mais: a tabela de concessão mysql.user define as contas dos usuários do MySQL e seus privilégios de acesso:

mysql> SELECT User, Host, Password FROM mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User                | Host                       | Password                                       |
+------------------+-----------------------+-------------------------------------------+
| root                  | localhost               | *FE23015365952A341A576684A19831B890F9DC45 |
| root                  | euve34849           | *FE23015365952A341A576684A19831B890F9DC45 |
| root                  | 127.0.0.1              | *FE23015365952A341A576684A19831B890F9DC45 |
| rita                   | %                            | *3459015365952A341A576684A19831B890F97A5E |
+------------------+-----------------------+-------------------------------------------+
3 rows in set (0.00 sec)

No caso acima temos o usuário root com acesso ao BD a partir da própria máquina em que está o MySQL. Seja utilizando o nome do host como localhost, o endereço IP 127.0.0.1 ou ainda utilizando o nome da máquina local. Ainda se tem a usuária rita que tem o caractere curinga ‘%’ para a parte do host, então ela pode se conectar de qualquer host.

f) Verificação 6: teste com telnet
Este teste tem por objetivo verificar se o servidor MySQL está permitindo conexões remotas ou não. A instalação padrão não permite conexões externas, o que é mais seguro. A configuração do MySQL pode ser alterada através do seu arquivo de configuração /etc/mysql/my.cnf como será detalhado mais adiante.

De uma máquina qualquer da rede, tentar acessar a porta padrão utilizada pelo MySQL (porta 3306):
$ telnet endereço_máquina 3306
Deve-se obter uma resposta do tipo:

Trying ip_maquina…
telnet: Unable to connect to remote host: Connection refused

Caso contrário, onde tenha ocorrido uma conexão ao banco de dados ou o envio de um conjunto de caracteres (sem sentido lógico), a porta está aberta e o servidor MySQL aceita conexões remotas. Se o que se deseja é se permitir apenas conexões locais ao servidor MySQL (situação que é mais segura), deve-se fechar esta possibilidade de conexão através do seu arquivo de configuração.

2. Liberar o servidor MySql para aceitar conexões externas
O MySQL por padrão ao ser instalado está configurado para NÃO permitir acesso remoto, somente local (localhost). Se for necessário ter de habilitar conexões remotas ao servidor MySQL (partindo de outros hosts que não seja o localhost), deve-se:


shell# mcedit /etc/mysql/my.cnf

E substituir o valor do parâmetro “bind-address”, que contém 127.0.0.1, pelo IP da máquina em que está instalado o servidor MySQL.
Reiniciar o MySQL:
shell# /etc/init.d/mysql restart

Agora o servidor MySQL permitirá acessos de outras máquinas da rede.

O seguinte comando ilustra como acessar um servidor MySQL remoto:
shell$ mysql -h ip-maquina -u jose -p
Fornecendo a senha correta do usuário jose e se este estiver cadastrado na tabela mysql.user com permissão de conexão remota, o prompt da linha de comando do MySQL-client será fornecido ao usuário.

OBS: ressaltando, o usuário que fará o acesso remoto deve estar cadastrado na tabela de acesso do MySQL (mysql.user) e ter permissão para conexão a partir de um host externo (coluna “Host”=% referente a este usuário nesta tabela).

2.1 Limitando as conexões externas
É possível limitar as conexões externas a apenas alguns endereços IPs. Para isto deve-se lançar mão de políticas restritivas através de firewalls, como iptables. A seguir exemplificamos restrições que podem ser feitas através do iptables:
-A INPUT -i eth0 -s 197.160.2.13 -p tcp --destination-port 3306 -j ACCEPT
-A INPUT -i eth0 -s 197.160.2.0/24 -p tcp --destination-port 3306 -j ACCEPT

3. Alguns comandos bastante utilizados
Vamos listar alguns comandos do MySQL que consideramos bastante utilizados, agrupando-os em grupos lógicos. Esse agrupamento não é oficial, mas me tem sido útil em diversas situações.
OBS: os comandos dados dentro do prompt do client MySQL NÃO são case sensitive.

3.1 Comandos de caráter Geral (em muitas ocasiões, os mais importantes…)

Comando Comentário

  • shell# /etc/init.d/mysql start
  • shell# /etc/init.d/mysql restart
  • shell# /etc/init.d/mysql stop

Comandos para iniciar, reiniciar e parar o MySQL
shell$ mysql -p
shell$ mysql -u jose -p
Login para linha de comando do MySQL, para o usuário corrente.
Login para linha de comando do MySQL, para o usuário jose.
mysql> STATUS; Informações da atual sessão do cliente MySQL, com versão e status do banco de dados.

  • mysql> SHOW databases;
  • mysql> SHOW tables;

Mostra listas de banco de dados e de tabelas disponíveis, respectivamente.
mysql> USE database Usa um banco de dados específico.
mysql> DESCRIBE table Descreve as colunas de uma tabela
mysql> SOURCE filename Executa comandos de um arquivo como script.
mysql> QUIT Sai do cliente MySQL (linha de comando)

3.2 Comandos de administração de Banco de Dados
Para acompanhar a administração de usuários, em especial, visualizar duas tabelas: mysql.user e mysql.db.

Comando Comentário
mysql> SELECT User, Host, Password FROM mysql.user; Visualizar tabela mysql.user, que armazena identificação dos usuários do MySQL e seus privilégios.
shell$ mysqladmin -u root password nova_senha -p Definir nova senha o usuário root do MySQL.
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd') WHERE User = 'root'; Atualiza de uma única vez todas as senhas referente ao usuário root.
mysql> FLUSH PRIVILEGES; Declaração FLUSH causa no servidor a releitura das tabelas de permissões. Sem ele, a alteração da senha permaneceria despercebida pelo servidor até que este fosse reiniciado.
mysql> SET PASSWORD FOR 'jose'@'localhost' = PASSWORD('senha_para_jose'); Altera senha de usuário já existente jose@localhost

  • mysql> CREATE USER maria@localhost IDENTIFIED BY 'minha_senha';
  • mysql> CREATE USER 'luiza'@'localhost' IDENTIFIED BY 'senha_para_luiza';
  • mysql> CREATE USER jose IDENTIFIED BY 'minha_senha'

Comandos de criar usuários com senha criptografada.
Para todos os exemplos NENHUM PRIVILÉGIO é atribuído aos usuários criados. Nem mesmo o de select. Isto pode ser verificado através da tabela mysql.user
mysql> INSERT INTO mysql.user (Host,User,Password,Select_priv) VALUES('localhost','jose', PASSWORD('minha_senha'), 'Y');
mysql> FLUSH PRIVILEGES;
Cria novo usuário jose@localhost, com senha criptografada, sendo atribuído o privilégio do mesmo de fazer SELECT. O comando FLUSH PRIVILEGES faz com que o servidor faça a releitura das tabelas de permissões.
mysql> GRANT ALL ON banco1.* TO 'jose'@'%' identified by 'secret'; Cria usuario jose, para conexão externa ao MySQL, com a senha que será guardada criptografada “secret”. Este usuário terá todos os privilégios limitado ao banco de dados banco1.
Se usuário já existir, apenas atualizará a sua senha e privilégios. Para verificar os privilégios do usuário jose, usar (como administrador do MySQL) os comandos select * from mysql.user where User='jose';, bem como select * from mysql.db where User='jose';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE on banco2.* to marcos@'%' identified by 'secret'; Cria usuário marcos, para conexão externa ao MySQL. Este usuário terá os privilégios de SELECT, INSERT, UPDATE, DELETE sobre o banco de dados “banco2”. Os demais privilégios serão negados.
mysql> REVOKE ALL ON banco1.* FROM 'jose'@'%'; Remover as permissões de acesso remoto do usuario jose a base de dados base1. Este usuario continuará existindo no MySQL e poderá acessar outras bases de dados a que tenha acesso.

mysql> DROP USER maria@localhost;
mysql> DROP USER joana;
mysql> DROP USER 'clara'@'%';
mysql> DROP USER 'patricia'@'201.132.12.13';
Excluir as usuárias: maria (para acesso localhost), joana e clara (para acessos remotos, quaisquer hosts) e usuária patricia (a partir do host 201.132.12.13), respectivamente.
Em todos os casos, as tabelas mysql.user e mysql.db serão afetadas.

OBS:
Ao tentar se conectar ao MySQL e uma das situações ocorrer:
– errar a senha;
– não fornecer a senha;
– usuario inexistente;
– sem permissão de acesso (por exemplo, tentando fazer uma conexão remota sem permissão para isto),

uma mensagem semelhante a abaixo será mostrada:

ERROR 1045: Access denied for user: ‘user@ip-maquina’ (Using password: NO|YES)

4. Criar base de dados
Vamos criar a base de dados ‘test’. Após fazer a conexão com o MySQL (mysqladmin -u root password xxxx), usa-se o comando:

mysql> create database test;

E obtem-se a seguinte resposta:

Query OK, 1 row affected

Verifique agora se realmente a base dados ‘test’ fora criada:

mysql> show databases;

e o MySQL informará as bases de dados existentes.

5. Exemplos de linhas de comandos MySQL diversos

use bd_discoteca;
describe tb_discos;
SELECT * FROM tb_discos;
SELECT * FROM tb_discos where disco_id >= 0 LIMIT $12;
select * FROM tb_discos where titulo = "Vai chover";
SELECT * FROM tb_musicas where titulo like "%lua%";
SELECT tb_discos.titulo FROM discos,musicas WHERE 
	tb_musicas.interprete = 'luiz gonzaga' AND tb_discos.disco_id := tb_musicas.disco_orig;
SELECT * FROM tb_discos where titulo LIKE 'NELSON%';
SELECT * FROM tb_discos where titulo LIKE '$titulo';

INSERT INTO tb_musicas (numero_disco,faixa,titulo,interprete,autor,ritmo) VALUE (1600,10,"AQUELAS MAOS","NELSON GONCALVES","LOURO,A-RODRIGUE",7);
INSERT INTO tb_musicas (numero_disco,faixa,titulo,interprete,autor,ritmo) VALUE (
           '$num_disco','$num_faixanovo','$titulonovo','$interpretenovo','$autornovo','$ritmonovo');
INSERT INTO tb_usuarios (username,senha) VALUE ("maria","secret");

UPDATE tb_discos SET ritmoprincipal = "ciranda" WHERE id_discos = "3";
UPDATE tb_usuarios SET perfil = 2 WHERE id_usuario = 2;
UPDATE tb_musicas SET titulo = '$titulonovo',interprete='$interpretenovo',
    faixa='$num_faixanovo', autor='$autornovo',ritmo='$ritmonovo'  where
    numero_disco='$num_disco' AND  faixa='$num_faixa';

CREATE INDEX xmusica ON tb_musicas (numero_disco,faixa);
ALTER TABLE tb_musica_temp RENAME musicas;  // renomeando uma tabela.
ALTER TABLE tb_discos drop disco_id;
ALTER TABLE tb_discos CHANGE gravadora gravadora_velha varchar(30); // alterando nome da linha
ALTER TABLE tb_gravadoras ADD (PRIMARY KEY (codigo_gravadora));
ALTER TABLE tb_musicas ADD (PRIMARY KEY (numero_disco,faixa));
ALTER TABLE tb_discos ADD COLUMN disco_id int auto_increment PRIMARY KEY FIRST;
ALTER TABLE tb_discos ADD COLUMN anoproducao smallint AFTER ritmoprincipal;
ALTER TABLE tb_discos ADD COLUMN anoproducao year AFTER ritmoprincipal;
ALTER TABLE tb_discos ADD COLUMN id_discos SMALLINT auto_increment PRIMARY KEY FIRST;
ALTER TABLE tb_discos MODIFY titulo  char (40) NOT NULL;
ALTER TABLE tb_ritmos MODIFY codigo_ritmo smallint unsigned not null PRIMARY KEY;
ALTER TABLE tb_discos ADD index (titulo(10));

DELETE FROM tb_discos where disco_id=0;
DELETE FROM tb_discos;

LOAD DATA INFILE '/home/programando/discoteca/nome_disco.txt' INTO TABLE tb_discos (titulo);
LOAD DATA INFILE '/home/programando/discoteca/nome_discwq.txt' INTO TABLE tb_discos FIELDS TERMINATED BY '\t' (disco_id,titulo, ritmoprincipal, gravadora);

$mysqldump -u root -p --no-data bd_discoteca tb_usuarios > estrutura_usuarios.sql // cópia vazia da estrutura da tabela usuarios do BD discoteca.
$mysqldump -u root -p --no-data bd_discoteca > estrutura_usuarios.sql // cópia vazia da estrutura do BD discoteca.

6. Recuperar senha do administrador do MySQL
Pode acontecer do usuário root perder a senha de administração do MySQL. Esta não pode ser recuperada, mas é possível criar uma nova senha para este usuário.
Vejamos o procedimento.

6.1 Matar os processos mysqld e reiniciar o MySQL em modo seguro (safe mode)
shell# killall mysqld
shell# mysqld_safe --skip-grant-tables &

6.2 Definir a nova senha para o usuário root do MySQL

shell# mysql
mysql> update mysql.user set password = password('nova_senha') where user='root' and host='localhost';
mysql> flush privileges;
mysql> quit;

6.3 Desligar o modo de segurança do MySQL e iniciar o MySQL com a nova senha de root

shell# /etc/init.d/mysql stop
shell# /etc/init.d/mysql start

Conectar-se normalmente ao mysql utilizando a nova senha:
shell$ mysql -u root -p

7. Desinstalar o MySQL
Pode haver necessidade de desinstalar o MySQL (e até mesmo, após isso, fazer sua reinstalação). Seguir os passos abaixo:
a) Parar o MySQL
# killall -9 mysql
# killall -9 mysqld

b) Remover o MySQL
# apt-get remove --purge mysql\*
# apt-get clean /* limpar o cache de pacotes*/

c) Listar todos os pacotes mysql instalados
# dpkg -l | grep -i mysql

ou ainda….
# updatedb
# locate mysql

Veja também:
1- Tutorial MySQL Tizag
2- MySQL on Linux Tutorial
3- Securing the Initial MySQL Accounts
4- Assigning Account Passwords
5- MySQL 5.1 Reference Manual
6- Manual MySQL em português
7- mysqld_safe — MySQL Server Startup Script
8- Instalar servidor LAMP (Linux + Apache + PHP + MySQL) no Debian

comentários
  1. Giovani disse:

    Valeu, ajudou bastante, explicou bastante sobre os códigos e como utilizados, só faltou o código de criar tabela na hora dos comandos MySQL. :V

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s