21 fevereiro 2016

Instalação MySQL 5.7 no Ubuntu 15.10


Ubuntu é hoje uma das distribuições Linux mais populares, principalmente pela facilidade de instalação e configuração. O MySQL 5.7 oferece novos recursos interessantes, como o suporte nativo a JSON e melhor performance e segurança. Neste tutorial veremos como instalar o MySQL 5.7 no Ubuntu 15.10.


Nota: usei o Ubuntu em uma Virtual Machine para testar este procedimento. Criei a VM usando o Vagrant e Virtual Box. Depois de instalados, basta executar:
shell> vagrant init boxcutter/ubuntu1510
shell> vagrant up --provider virtualbox


3 opções de instalação

Temos 3 opções para prosseguir com a instalação:
  1. usar o APT como gerenciador de pacotes (recomendado)
  2. usar binários pré-compilados (mais flexível, permite por exemplo mudar o diretório de instalação)
  3. compilar seus próprios binários (avançado)
A seguir estão os passos para opções 1 e 2.
Nota: se você tiver alguma instalação anterior de MySQL, faça backup antes de realizar qualquer procedimento.

Versão mais atualizada do MySQL

A maneira mais fácil de instalar o MySQL no Ubuntu é utilizar o gerenciador de pacotes APT. Porém, o repositório APT padrão do Ubuntu não possui as versões mais atuais do MySQL e é necessário instalar o repositório oficial do MySQL.
Para confirmar a versão do MySQL disponível no seu repositório APT padrão, execute:
shell> sudo apt-get update
shell> sudo apt-get -s install mysql-server
A opção -s do comando acima apenas simula uma instalação e de fato não altera nada.
No momento que escrevo este tutorial, a versão mais atual do MySQL disponível no repositório padrão do Ubuntu é a 5.6, que não é a mais atual. Contudo, é muito simples configurar o Ubuntu para utilizar o repositório oficial MySQL e manter as versões mais atualizadas. Veremos a seguir.


Instalação do repositório oficial MySQL

  1. Baixe o repositório APT para MySQL em http://dev.mysql.com/downloads/repo/apt. É o mesmo pacote tanto para Debian, quanto para Ubuntu. No meu caso, baixei para o diretório /home/vagrant/downloads. Dica: na tela de login, veja o link em “No thanks, just start my download”;
  2. Instale o repositório APT com o comando:
    shell> cd /home/vagrant/downloads
    shell> sudo dpkg -i mysql-apt-config*.deb
    Após executar o comando, você terá a liberdade de escolher qual versão do MySQL vai usar e se vai querer outros componentes, como conectores ou ferramentas. Neste tutorial escolheremos a versão 5.7.
  3. (Opcional) Remova o arquivo do repositório que acabou de baixar:
    shell> rm mysql-apt-config*.deb
  4. (Opcional) Verifique que agora temos o MySQL 5.7 disponível para instalação:
    shell> sudo apt-get update
    shell> sudo apt-get -s install mysql-server


Instalação do MySQL via APT

Uma vez que o repositório oficial MySQL esteja configurado (veja seção anterior), para instalar o MySQL 5.7 basta executar:
  1. shell> sudo apt-get update
    shell> sudo apt-get install mysql-server
    No processo de instalação, será solicitada a criação da senha do usuário root do MySQL. Senhas devem conter pelo menos 1 caractere numérico, uma minúscula e letra maiúscula e 1 caractere especial (não alfanumérico).
  2. (Opcional) Veja se o servidor MySQL foi inicializado com:
    shell> sudo service mysql status
  3. (Opcional) Veja o que foi instalado com:
    dpkg -l | grep mysql | grep ii


Instalação do MySQL “na unha” via binários pré-compilados

Esta opção de instalação é mais trabalhosa, pois não utiliza o gerenciador de pacotes APT, porém dá mais flexibilidade. Por exemplo: permite escolher quais diretórios serão utilizados pelo MySQL, executar múltiplas instâncias, etc.
  1. Como pré-requisito, certifique-se que a dependência libaio está presente:
    shell> ldconfig -p | grep libaio
    libaio.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libaio.so.1
    Veja que a libaio está presente. Caso não tenha a libaio, instale com:
    shell> apt-get install libaio1
  2. Baixe os binários em dev.mysql.com, selecione “Linux - Generic” como plataforma. No meu caso, baixei para o diretório /home/vagrant/downloads. Dica: na tela de login, veja o link em “No thanks, just start my download”;
  3. Remova qualquer instalação prévia ou variante de MySQL com:
    shell> sudo dpkg -P mysql
  4. Executar a seguinte sequência de comandos no shell:
    sudo groupadd mysql
    sudo useradd -r -g mysql -s /bin/false mysql
    cd /home/vagrant
    tar zxvf /home/vagrant/downloads/mysql-5.7*.tar.gz
    ln -s mysql-5.7* mysql
    cd mysql
    mkdir mysql-files
    chmod 750 mysql-files
    sudo chown -R mysql .
    sudo chgrp -R mysql .
    sudo bin/mysqld --initialize --user=mysql --log-error=/tmp/mysqld.log --datadir=/home/vagrant/mysql/data
    sudo cat /tmp/mysqld.log
  5. Se tudo correu bem até aqui, o diretório de dados foi criado e uma senha temporária atribuída ao usuário root do MySQL:
    shell> sudo cat /tmp/mysqld.log
    [Note] A temporary password is generated for root@localhost: xxxxxxxxxxxx
  6. Continue com o procedimento de pós-instalação com os seguintes comandos:
    sudo bin/mysql_ssl_rsa_setup --datadir=/home/vagrant/mysql/data
    sudo chown -R root .
    sudo chown -R mysql data mysql-files
  7. Neste ponto o MySQL já está pronto para rodar. Para iniciar o processo mysqld (server):
    shell> sudo bin/mysqld_safe --user=mysql &
    (pressione Enter 2 vezes)
  8. Conecte-se com o MySQL com:
    shell> bin/mysql -uroot -p'xxxxxxxxxxxx'
  9. Na versão 5.7, é obrigatório trocar a senha na primeira conexão. Veja o exemplo para a nova senha “Root123!”:
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root123!';
    mysql> quit
  10. (Opcional) Depois que tudo estiver funcionando, remova o arquivo de instalação:
    rm /usr/local/downloads/mysql-5.7*.tar.gz


Observações:
  • É usual manter um arquivo /etc/my.cnf para alterar as configurações padrão do MySQL. Você pode copiá-lo do template:
    sudo cp support-files/my-default.cnf /etc/my.cnf
    sudo chown root:sys /etc/my.cnf
    sudo chmod 644 /etc/my.cnf
  • Neste tipo de instalação manual, o MySQL não é inicializado no boot. Para inicializar manualmente:
    shell> sudo /home/vagrant/mysql/bin/mysqld_safe --user=mysql &
  • Para finalizar o processo mysqld, ao invés de forçar um kill, prefira usar:
    shell> /home/vagrant/mysql/bin/mysqladmin -uroot -p shutdown
  • Adicione os executaveis do MySQL no PATH do seu usuário:
    echo 'PATH="$HOME/mysql/bin:$PATH"' >> ~/.profile
    source ~/.profile


Para saber mais detalhes como remover o MySQL ou mudar a versão major, consulte os links nas referências abaixo. Deixe seu comentário caso algo não funcione ou se tiver alguma sugestão.

Referências


14 comentários:

Andre F. Machado disse...

Para verificar-se a disponibilidade de algum pacote, não é necessário utilizar o apt-get. Existe outra ferramenta própria para isso: o apt-cache search .

Anônimo disse...

O comando abaixo não funciona..

sudo bin/mysqld --initialize --user=mysql --log-error=/tmp/mysqld.log --datadir=/home/vagrant/mysql/data

erro: bin/mysqld: 1: bin/mysqld: Syntax error: "(" unexpected

Airton Lastori disse...

A mensagem bin/mysqld: 1: bin/mysqld: Syntax error: "(" unexpected indica que foi passado um parênteses como parâmetro para o programa mysqld. Tente digitar o comando ao invés de copiar e colar:
sudo bin/mysqld --initialize --user=mysql --log-error=/tmp/mysqld.log --datadir=/home/vagrant/mysql/data

José disse...

O erro do bin/mysqld: 1: bin/mysqld: Syntax error: "(" unexpected foi por eu estar usando mysql versão 64 bits em 32 bits.

José disse...

É possível criar novas instancias do MySQL server 5.7 (instalado com apt-get) utilizando o MySQL Utilities com o comando mysqlserverclone? Já tentei algumas vezes no Ubuntu 15.10 e 14.04 e não consigo..

Airton Lastori disse...

Sim, é possível usar o mysqlserverclone. Tente verificar qual o erro adicionando o parâmetro -vvv ao comando.

José disse...

wagner@computer:~/Downloads$ sudo mysqlserverclone --server=root:root@localhost --new-data=/tmp/db1
--new-port=3310 --new-id=100 --root-password=root --delete -vvv

WARNING: Using a password on the command line interface can be insecure.
# Cloning the MySQL server running on localhost.
# Creating new data directory...
# Configuring new instance...
# Locating mysql tools...
# Location of files:
# mysqld: /usr/sbin/mysqld
# mysqladmin: /usr/bin/mysqladmin
# Setting up empty database and mysql tables...
2016-03-16T10:48:54.886279Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use
--explicit_defaults_for_timestamp server option (see documentation for more details).
2016-03-16T10:48:58.785807Z 0 [Warning] InnoDB: New log files created, LSN=45790
2016-03-16T10:48:59.623810Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2016-03-16T10:48:59.955824Z 0 [Warning] No existing UUID has been found, so we assume that this is the first
time that this server has been started. Generating a new UUID: b0c3f77b-eb64-11e5-b3dc-08002723c3d8.
2016-03-16T10:48:59.994711Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot
be opened.
2016-03-16T10:48:59.996641Z 1 [Warning] root@localhost is created with an empty password ! Please consider
switching off the --initialize-insecure option.
# Starting new instance of the server...
# Startup command for new server:
/usr/sbin/mysqld --no-defaults --basedir=/usr --datadir=/tmp/db1 --pid-file=/tmp/db1/clone.pid --port=3310
--server-id=100 --socket=/tmp/db1/mysql.sock --tmpdir=/tmp/db1
# Testing connection to new instance...
# trying again...
2016-03-16T10:49:24.527281Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use
--explicit_defaults_for_timestamp server option (see documentation for more details).
2016-03-16T10:49:24.534685Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.11) starting as process 5365 ...
2016-03-16T10:49:24.542680Z 0 [ERROR] Fatal error: Please read "Security" section of the manual to find out how
to run mysqld as root!
2016-03-16T10:49:24.546511Z 0 [ERROR] Aborting
2016-03-16T10:49:24.548100Z 0 [Note] Binlog end
2016-03-16T10:49:24.549496Z 0 [Note] /usr/sbin/mysqld: Shutdown complete
# trying again...
# trying again...
# trying again...
# trying again...
# trying again...
# trying again...
# trying again...
# trying again...
# trying again…
ERROR: Unable to communicate with new instance. Process id = 5365.

Airton Lastori disse...

O Erro [ERROR] Fatal error: Please read "Security" section of the manual to find out how
to run mysqld as root!
ocorre quando você tenta executar o mysqld como root. Tente executar o comando sem sudo.

José disse...

Me parece que a versão 5.7 do MySQL não é compatível com as últimas versões do mysql-connector-python e mysql-utilities. Vou testar com a versão 5.6 ou criar novas instancias utilizando o Mysql Sand Box.

Airton Lastori disse...

As versões mais recentes do MySQL Utilities e do connector Python são compatíveis com o MySQL 5.7. Mas falando da sua necessidade específica, pode ser uma boa idéia usar o MySQL Sandbox. Se quiser fazer múltiplas instâncias "na unha" também não é difícil. Neste post eu mostro como criar 2 instâncias para testar a replicação na mesma máquina http://www.alastori.com.br/2015/02/tutorial-replicacao-mysql-em-5-minutos.html

Wagner disse...

Bom tutorial, mas tenho 2 observacoes que tive erro ao correr e comento o que fiz:

No passo 1:
shell> ldconfig -p | grep libjpeg
Nao seria? shell> ldconfig -p | grep libaio1

No passo 6, antes de correr sudo bin/mysql_ssl_rsa_setup,
criei antes as pastas em negrito /usr/local/mysql/data, pois dava o erro: 2016-03-28 16:40:09 [ERROR] Failed to access directory pointed by --datadir. Please make sure that directory exists and is accessible by mysql_ssl_rsa_setup. Supplied value : /usr/local/mysql/data

Airton Lastori disse...

Olá Wagner,

Obrigado pelo feedback.

Tem razão, o correto era grep libaio no passo 1.

No passo 6, não deveria ser necessário criar o datadir, uma vez que é criado no passo 4 com o comando sudo bin/mysqld --initialize --user=mysql --log-error=/tmp/mysqld.log --datadir=/home/vagrant/mysql/data. Talvez seja melhor explicitar a opção datadir no comando mysql_ssl_rsa_setup.

Atualizei o post com base nos seus comentários. Mais uma vez, obrigado.

Andrey Pinheiro disse...

Olá Sr. Airton, boa noite. Não conheço muito de MySQL, estou subindo uma aplicação web num ambiente mínimo apenas como piloto (OTRS). Ao instalar o mysql e starta-lo, verifiquei que há 21 processos com a mesma descrição:

/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysql

Isso é normal? Pois preciso otimizar o servidor com o menor consumo de recursos possíveis.

Desde já agradeço.

Airton Lastori disse...

Olá Andrey,

Não é normal. O mysqld é um único processo com múltiplas threads. Qual o comando que você está executando para verificar os processos? Normalmente uso ps -ef|grep mysqld junto com netstat -ap | grep mysqld

Se os processos apontam para a mesma porta, não deveriam nem rodar.

Veja o este teste aqui:
https://gist.github.com/alastori/c956060e4d60ece79e4f0bb4c656ec4b