Em ambientes de produção, a instalação do MySQL via pacote binário oferece controle granular sobre versão, diretórios e parâmetros de configuração. Este guia demonstra o processo completo de implantação do MySQL 5.7.32 no Ubuntu 20.04 e 22.04, incluindo um script automatizado para implantação em lote.
Fundamentos do MySQL
O MySQL é um sistema de gerenciamento de banco de dados relacional (RDBMS) de código aberto, amplamente adotado em aplicações web, sistemas corporativos e soluções de análise de dados. Sua arquitetura cliente/servider multithread suporta transações ACID, múltiplos motores de armazenamento e replicação assíncrona.
Características principais:
- Licença dupla GPL/comercial, permitindo uso flexível em diferentes contextos
- Otimização de consultas com índices B-tree e hash adaptativo
- Motores de armazenamento intercambiáveis: InnoDB (transacional), MyISAM (leitura otimizada), Memory, entre outros
- Compatibilidade cross-platform: Linux, Windows, macOS, Solaris
- Suporte a replicação master-slave, cluster NDB e sharding aplicacional
- Preparação de Dependências
Antes de iniciar, instale as bibliotecas necessárias:
sudo apt-get update
sudo apt-get install -y libaio1 libnuma1 libtinfo5 wget tar net-tools
- Obtenção e Extração do Pacote Binário
Faça o download da versão 5.7.32 diretamente dos repositórios oficiais:
cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.32-el7-x86_64.tar.gz
tar -xzf mysql-5.7.32-el7-x86_64.tar.gz
Mova os binários para o diretório de instalação e crie um link simbólico:
sudo mv mysql-5.7.32-el7-x86_64 /opt/mysql-5.7.32
sudo ln -sfn /opt/mysql-5.7.32 /opt/mysql
- Criação de Usuário e Estrutura de Diretórios
Crie um usuário de sistema dedicado para o serviço MySQL:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin mysqlsvc
Estabeleça a hierarquia de diretórios para dados, logs e arquivos temporários:
sudo mkdir -p /srv/mysqldata
sudo mkdir -p /opt/mysql/{logdir,sockdir}
sudo chown -R mysqlsvc:mysqlsvc /opt/mysql /srv/mysqldata
- Configuração do Arquivo my.cnf
Gere o arquivo de configuração principal em /etc/my.cnf:
sudo tee /etc/my.cnf > /dev/null << 'CONFIGEOF'
[client]
socket = /opt/mysql/sockdir/mysqld.sock
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysqlsvc
pid-file = /opt/mysql/sockdir/mysqld.pid
socket = /opt/mysql/sockdir/mysqld.sock
basedir = /opt/mysql
datadir = /srv/mysqldata
log-error = /opt/mysql/logdir/error.log
bind-address = 0.0.0.0
port = 3306
log-bin = binlog-master
server-id = 1
binlog_format = MIXED
symbolic-links = 0
max_connections = 500
connect_timeout = 10
wait_timeout = 600
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = ON
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
CONFIGEOF
Notas sobre parâmetros críticos:
datadir: Localização física dos arquivos de dados InnoDB e MyISAMlog-error: Caminho do log de erros, fundamental para diagnósticocharacter-set-server = utf8mb4: Habilita armazenamento de caracteres Unicode estendidos, incluindo emojissql_mode: Modo estrito para rejeitar inserções com dados inválidos
- Inicialização do Banco de Dados
Execute a inicialização do diretório de dados:
sudo /opt/mysql/bin/mysqld \
--defaults-file=/etc/my.cnf \
--initialize \
--user=mysqlsvc
Após a inicialização, uma senha temporária será gerada. Recupere-a com:
sudo grep 'temporary password' /opt/mysql/logdir/error.log
Exemplo de saída: A temporary password is generated for root@localhost: xK9wRt#mP2$vL
- Configuração do Serviço Systemd
Copie o script de inicialização padrão e registre o serviço:
sudo cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
sudo systemctl daemon-reload
sudo systemctl enable mysqld
sudo systemctl start mysqld
Verifique o status do serviço:
sudo systemctl status mysqld
- Variáveis de Ambiente
Adicione os binários do MySQL ao PATH do sistema:
echo 'export PATH=/opt/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql_path.sh
source /etc/profile
- Acesso Inicial e Redefinição de Senha
Conecte-se ao servidor utilizando a senha temporária obtida anteriormente:
mysql -u root -p
Atualize a credencial do administrador:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Str0ngP@ssw0rd!';
FLUSH PRIVILEGES;
EXIT;
Recomenda-se utilizar senhas com no mínimo 12 caracteres, combinando maiúsculas, minúsculas, dígitos e símbolos.
- Script de Automação para Implantação
O script abaixo consolida todas as etapas em uma única execução:
#!/bin/bash
# Automação de instalação do MySQL 5.7.32 via binário no Ubuntu
set -euo pipefail
MYSQL_VER="5.7.32"
MYSQL_ARCHIVE="mysql-${MYSQL_VER}-el7-x86_64.tar.gz"
MYSQL_URL="https://dev.mysql.com/get/Downloads/MySQL-5.7/${MYSQL_ARCHIVE}"
INSTALL_ROOT="/opt/mysql"
DATA_ROOT="/srv/mysqldata"
SERVICE_USER="mysqlsvc"
# Cores para output
readonly C_RED='\033[0;31m'
readonly C_GREEN='\033[0;32m'
readonly C_YEL='\033[0;33m'
readonly C_RESET='\033[0m'
log_info() { echo -e "${C_GREEN}[INFO]${C_RESET} $1"; }
log_warn() { echo -e "${C_YEL}[WARN]${C_RESET} $1"; }
log_error() { echo -e "${C_RED}[ERROR]${C_RESET} $1"; }
# Validação de privilégios
if [[ "$(id -u)" -ne 0 ]]; then
log_error "Execute como root ou via sudo"
exit 1
fi
log_info "Iniciando implantação do MySQL ${MYSQL_VER}"
# Etapa 1: Dependências
log_info "Instalando pacotes de dependência"
apt-get update -qq
apt-get install -y -qq libaio1 libnuma1 libtinfo5 wget tar net-tools > /dev/null
# Etapa 2: Download e extração
log_info "Obtendo binários do MySQL"
cd /tmp
if [[ ! -f "${MYSQL_ARCHIVE}" ]]; then
wget -q --show-progress "${MYSQL_URL}"
fi
tar -xf "${MYSQL_ARCHIVE}"
mv "mysql-${MYSQL_VER}-el7-x86_64" "/opt/mysql-${MYSQL_VER}"
ln -sfn "/opt/mysql-${MYSQL_VER}" "${INSTALL_ROOT}"
# Etapa 3: Usuário e diretórios
log_info "Criando usuário de serviço e estrutura de diretórios"
id -u "${SERVICE_USER}" &>/dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin "${SERVICE_USER}"
mkdir -p "${DATA_ROOT}" "${INSTALL_ROOT}/logdir" "${INSTALL_ROOT}/sockdir"
chown -R "${SERVICE_USER}:${SERVICE_USER}" "/opt/mysql-${MYSQL_VER}" "${DATA_ROOT}"
# Etapa 4: Configuração
log_info "Gerando arquivo /etc/my.cnf"
cat > /etc/my.cnf << CNFEND
[client]
socket = ${INSTALL_ROOT}/sockdir/mysqld.sock
port = 3306
default-character-set = utf8mb4
[mysqld]
user = ${SERVICE_USER}
pid-file = ${INSTALL_ROOT}/sockdir/mysqld.pid
socket = ${INSTALL_ROOT}/sockdir/mysqld.sock
basedir = ${INSTALL_ROOT}
datadir = ${DATA_ROOT}
log-error = ${INSTALL_ROOT}/logdir/error.log
bind-address = 0.0.0.0
port = 3306
log-bin = binlog-master
server-id = 1
binlog_format = MIXED
symbolic-links = 0
max_connections = 500
connect_timeout = 10
wait_timeout = 600
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = ON
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
CNFEND
# Etapa 5: Inicialização
log_info "Inicializando diretório de dados do MySQL"
sudo -u "${SERVICE_USER}" "${INSTALL_ROOT}/bin/mysqld" \
--defaults-file=/etc/my.cnf \
--initialize
# Etapa 6: Serviço systemd
log_info "Configurando serviço systemd"
cp "${INSTALL_ROOT}/support-files/mysql.server" /etc/init.d/mysqld
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
# Etapa 7: PATH
echo "export PATH=${INSTALL_ROOT}/bin:\$PATH" > /etc/profile.d/mysql_path.sh
chmod 644 /etc/profile.d/mysql_path.sh
source /etc/profile.d/mysql_path.sh
# Recuperação da senha temporária
TMP_PW=$(grep 'temporary password' "${INSTALL_ROOT}/logdir/error.log" | awk '{print $NF}')
log_info "Implantação concluída com sucesso"
echo -e "${C_YEL}Senha temporária de root: ${TMP_PW}${C_RESET}"
log_info "Acesse com: mysql -u root -p"
log_info "Após o login, execute: ALTER USER 'root'@'localhost' IDENTIFIED BY 'sua_nova_senha';"
exit 0
- Comandos de Administração Frequentes
-- Listar bases de dados existentes
SHOW DATABASES;
-- Selecionar uma base específica
USE mysql;
-- Listar usuários cadastrados
SELECT User, Host FROM mysql.user;
-- Criar um novo usuário de aplicação
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppP@ss2024!';
-- Conceder privilégios globais
GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'%';
-- Aplicar alterações de privilégios
FLUSH PRIVILEGES;
-- Verificar porta de escuta
SHOW GLOBAL VARIABLES LIKE 'port';
-- Inspecionar configurações de charset
SHOW VARIABLES LIKE 'character_set%';
- Resolução de Problemas Comuns
| Sintoma | Solução |
|---|---|
error while loading shared libraries: libaio.so.1 |
Instalar o pacote libaio1 via apt |
Falha durante --initialize |
Garantir que /srv/mysqldata está vazio e com permissões corretas do usuário mysqlsvc |
| Conexões remotas recusadas | Confirmar bind-address = 0.0.0.0 e liberar porta 3306 no firewall (ufw allow 3306/tcp) |
| Serviço não inicia | Consultar /opt/mysql/logdir/error.log para detalhes do erro |
Can't connect to local MySQL server through socket |
Verificar existência do arquivo de socket em /opt/mysql/sockdir/mysqld.sock |