Instalação do MySQL 5.7 via Binário no Ubuntu com Automação Shell

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
  1. 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
  1. 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
  1. 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
  1. 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 MyISAM
  • log-error: Caminho do log de erros, fundamental para diagnóstico
  • character-set-server = utf8mb4: Habilita armazenamento de caracteres Unicode estendidos, incluindo emojis
  • sql_mode: Modo estrito para rejeitar inserções com dados inválidos
  1. 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

  1. 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
  1. 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
  1. 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.

  1. 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
  1. 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%';
  1. 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

Tags: MySQL Ubuntu systemd Shell Script Binary Installation

Publicado em 7-13 16:07