Skip to content

MySQL 在 Linux 上安装

安装前准备

系统要求

操作系统版本MySQL 5.7 最低配置MySQL 8.0 最低配置推荐配置
CentOS/RHEL 7+2GB RAM, 2CPU, 20GB 磁盘4GB RAM, 2CPU, 30GB 磁盘8GB+ RAM, 4+ CPU, 100GB+ 磁盘
Ubuntu 18.04+2GB RAM, 2CPU, 20GB 磁盘4GB RAM, 2CPU, 30GB 磁盘8GB+ RAM, 4+ CPU, 100GB+ 磁盘
Debian 9+2GB RAM, 2CPU, 20GB 磁盘4GB RAM, 2CPU, 30GB 磁盘8GB+ RAM, 4+ CPU, 100GB+ 磁盘

环境检查与准备

bash
# 检查操作系统版本
cat /etc/os-release

# 检查硬件资源
free -h
lscpu
df -h

# 检查端口占用情况
netstat -tuln | grep 3306 2>/dev/null || ss -tuln | grep 3306

# 安装必要依赖工具
# CentOS/RHEL
yum install -y wget curl vim net-tools

# Ubuntu/Debian
apt update && apt install -y wget curl vim net-tools

# 防火墙配置(生产环境推荐保留防火墙)
# CentOS/RHEL 7+
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

# Ubuntu/Debian
ufw enable
ufw allow 3306/tcp
ufw reload

# SELinux 配置(CentOS/RHEL)
# 选项1:临时关闭(测试环境)
setenforce 0
# 选项2:永久关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 选项3:配置 SELinux 允许 MySQL(生产环境推荐)
semanage port -a -t mysqld_port_t -p tcp 3306 2>/dev/null || true

安装方式选择

包管理器安装(推荐)

CentOS/RHEL 安装

使用 MySQL YUM 仓库

  1. 下载并安装 MySQL YUM 仓库
bash
# MySQL 8.0 YUM 仓库(CentOS 7)
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm

# MySQL 8.0 YUM 仓库(CentOS 8)
wget https://dev.mysql.com/get/mysql80-community-release-el8-5.noarch.rpm

# 安装 YUM 仓库
rpm -ivh mysql80-community-release-el*-*.noarch.rpm

# 验证仓库安装
yum repolist enabled | grep mysql

# 选择 MySQL 版本(如需安装 5.7)
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
  1. 安装 MySQL 服务器
bash
# 安装 MySQL 服务器
yum install -y mysql-community-server

# 启动 MySQL 服务
systemctl start mysqld

# 设置开机自启
systemctl enable mysqld

# 检查服务状态
systemctl status mysqld
  1. 初始化配置
bash
# 获取初始密码(MySQL 5.7+)
INITIAL_PASSWORD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
echo "初始密码: $INITIAL_PASSWORD"

# 登录并设置新密码
mysql -uroot -p"$INITIAL_PASSWORD" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword1!';"

# 运行安全加固脚本(MySQL 5.7+)
mysql_secure_installation

Ubuntu/Debian 安装

使用 MySQL APT 仓库

  1. 下载并安装 MySQL APT 仓库
bash
# 下载 MySQL APT 配置文件
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb

# 非交互式安装 MySQL 8.0
echo "mysql-apt-config mysql-apt-config/select-server select mysql-8.0" | debconf-set-selections
dpkg -i mysql-apt-config_0.8.29-1_all.deb

# 更新 APT 包列表
apt update
  1. 安装 MySQL 服务器
bash
# 安装 MySQL 服务器
apt install -y mysql-server

# 启动服务
systemctl start mysql

# 设置开机自启
systemctl enable mysql

# 检查服务状态
systemctl status mysql
  1. 初始化配置
bash
# MySQL 8.0 自动生成随机密码,查看方式
grep 'password' /var/log/mysql/error.log

# 运行安全加固脚本
mysql_secure_installation

编译安装(高级用户)

适合需要自定义编译选项或特定版本的场景:

bash
# 安装依赖
# CentOS/RHEL
yum install -y gcc gcc-c++ cmake make bison ncurses-devel openssl-devel libaio-devel

# Ubuntu/Debian
apt install -y build-essential cmake make bison libncurses5-dev libssl-dev libaio-dev

# 下载 MySQL 源代码
# MySQL 5.7
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.44.tar.gz
# MySQL 8.0
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36.tar.gz

tar -zxvf mysql-*.tar.gz
cd mysql-*

# 创建编译目录
mkdir build
cd build

# 配置编译选项(MySQL 8.0 示例)
cmake .. \
  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  -DMYSQL_DATADIR=/usr/local/mysql/data \
  -DSYSCONFDIR=/etc \
  -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
  -DWITH_BOOST=/usr/local/boost \
  -DWITH_SSL=system \
  -DDEFAULT_CHARSET=utf8mb4 \
  -DDEFAULT_COLLATION=utf8mb4_unicode_ci

# 编译(多线程加速)
make -j$(nproc)

# 安装
make install

# 创建用户和数据目录
useradd -r -s /sbin/nologin mysql
mkdir -p /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql

# 初始化数据库
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

# 启动 MySQL
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
systemctl enable mysqld
systemctl start mysqld

Docker 安装

适合快速部署和隔离环境:

bash
# 拉取 MySQL 镜像
# MySQL 5.7
docker pull mysql:5.7
# MySQL 8.0
docker pull mysql:8.0

# 运行 MySQL 容器
# MySQL 8.0 示例
docker run -d \
  --name mysql-server \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=YourStrongPassword! \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=mypassword \
  -v mysql-data:/var/lib/mysql \
  -v mysql-config:/etc/mysql/conf.d \
  --restart=always \
  mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 检查容器状态
docker ps

# 进入容器内的 MySQL
docker exec -it mysql-server mysql -uroot -p

初始配置

配置文件优化

MySQL 配置文件默认位置:

  • CentOS/RHEL: /etc/my.cnf
  • Ubuntu/Debian: /etc/mysql/mysql.conf.d/mysqld.cnf
  • Docker: 通过挂载卷自定义配置

生产环境优化配置示例

ini
[mysqld]
# 基础设置
server-id = 1
port = 3306
bind-address = 0.0.0.0
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 日志设置
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_bin = /var/lib/mysql/binlog
binlog_format = ROW
binlog_expire_logs_seconds = 604800

# 性能优化
max_connections = 1000
wait_timeout = 60
interactive_timeout = 60
innodb_buffer_pool_size = 2G  # 物理内存的 50-70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_buffer_pool_instances = 4

# 连接优化
back_log = 512
max_connect_errors = 1000000

# 查询优化
table_open_cache = 2000
table_definition_cache = 1500
max_heap_table_size = 64M
tmp_table_size = 64M

# MySQL 8.0 特有配置
default_authentication_plugin = caching_sha2_password
innodb_dedicated_server = 1  # 自动调整 InnoDB 配置(8.0.30+)

重启服务使配置生效

bash
# 系统服务方式
systemctl restart mysqld

# Docker 方式
docker restart mysql-server

远程访问配置

创建远程访问用户

sql
-- 登录 MySQL
mysql -uroot -p

-- 创建专用远程管理用户(不建议直接使用 root)
CREATE USER 'dba'@'%' IDENTIFIED BY 'StrongPassword1!';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

-- 或修改现有 root 用户允许远程访问
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPassword1!';
CREATE USER 'root'@'%' IDENTIFIED BY 'StrongPassword1!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

测试远程连接

从另一台机器测试连接:

bash
# 使用 MySQL 客户端连接
mysql -h <mysql-server-ip> -udba -p

# 使用 telnet 测试端口连通性
telnet <mysql-server-ip> 3306

# 使用 nc 测试端口连通性
nc -zv <mysql-server-ip> 3306

安装验证

检查 MySQL 版本与状态

bash
# 命令行检查版本
mysql --version

# MySQL 内部检查版本和状态
mysql -uroot -p -e "SELECT VERSION(), @@version_comment; SHOW GLOBAL STATUS LIKE 'Uptime';"

# 检查服务状态
systemctl status mysqld

# 检查端口监听
netstat -tuln | grep 3306 || ss -tuln | grep 3306

# 检查进程
systemctl status mysqld | grep active || ps aux | grep mysqld

性能基准测试

bash
# 使用 mysqlslap 进行简单基准测试
mysqlslap --user=root --password --host=localhost \
  --concurrency=50 --iterations=10 \
  --create-schema=testdb \
  --query="SELECT * FROM information_schema.tables" \
  --verbose

# 使用 sysbench 进行更全面的测试
sysbench --db-driver=mysql --mysql-user=root --mysql-password=YourPassword --mysql-db=testdb \
  --table-size=1000000 --tables=10 oltp_read_write prepare

sysbench --db-driver=mysql --mysql-user=root --mysql-password=YourPassword --mysql-db=testdb \
  --table-size=1000000 --tables=10 --threads=16 --time=60 oltp_read_write run

自动化安装脚本

CentOS/RHEL 自动化安装脚本

bash
#!/bin/bash

# MySQL 安装配置
MYSQL_VERSION="8.0"  # 可选:5.7 或 8.0
MYSQL_ROOT_PASSWORD="MySQLRootPassword1!"
MYSQL_DATADIR="/var/lib/mysql"

# 安装依赖
echo "正在安装依赖..."
yum install -y wget curl vim net-tools

# 下载并安装 MySQL YUM 仓库
echo "正在配置 MySQL YUM 仓库..."
if [ "$MYSQL_VERSION" = "5.7" ]; then
    wget -q https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
    rpm -ivh mysql57-community-release-el7-11.noarch.rpm
else
    wget -q https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
    rpm -ivh mysql80-community-release-el7-7.noarch.rpm
fi

# 安装 MySQL 服务器
echo "正在安装 MySQL 服务器..."
yum install -y mysql-community-server

# 启动并启用服务
echo "正在启动 MySQL 服务..."
systemctl start mysqld
systemctl enable mysqld

# 等待服务启动
sleep 10

# 获取初始密码
echo "正在获取初始密码..."
if [ "$MYSQL_VERSION" = "5.7" ]; then
    INITIAL_PASSWORD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
else
    INITIAL_PASSWORD=$(grep 'password' /var/log/mysqld.log | grep -v 'temporary' | awk '{print $NF}')
fi

echo "初始密码: $INITIAL_PASSWORD"

# 设置新密码
echo "正在设置新密码..."
mysql -uroot -p"$INITIAL_PASSWORD" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';" 2>/dev/null || 
mysql -uroot -p"$INITIAL_PASSWORD" -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';"

# 配置远程访问
echo "正在配置远程访问..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"

# 运行安全加固脚本
echo "正在运行安全加固脚本..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'; FLUSH PRIVILEGES;"

# 配置防火墙
echo "正在配置防火墙..."
systemctl start firewalld 2>/dev/null || true
systemctl enable firewalld 2>/dev/null || true
firewall-cmd --permanent --add-port=3306/tcp 2>/dev/null || true
firewall-cmd --reload 2>/dev/null || true

# SELinux 配置
echo "正在配置 SELinux..."
setenforce 0 2>/dev/null || true
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 2>/dev/null || true

# 验证安装
echo "正在验证安装..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SELECT VERSION(), @@version_comment;"

# 输出安装结果
echo ""
echo "======================================"
echo "MySQL $MYSQL_VERSION 安装完成!"
echo "======================================"
echo "Root 密码:$MYSQL_ROOT_PASSWORD"
echo "数据目录:$MYSQL_DATADIR"
echo "配置文件:/etc/my.cnf"
echo "访问命令:mysql -uroot -p'$MYSQL_ROOT_PASSWORD'"
echo "远程访问:mysql -h $(hostname -I | awk '{print $1}') -uroot -p'$MYSQL_ROOT_PASSWORD'"
echo "======================================"

Ubuntu/Debian 自动化安装脚本

bash
#!/bin/bash

# MySQL 安装配置
MYSQL_VERSION="8.0"  # 可选:5.7 或 8.0
MYSQL_ROOT_PASSWORD="MySQLRootPassword1!"

# 更新系统包
echo "正在更新系统包..."
apt update && apt upgrade -y

# 安装依赖
echo "正在安装依赖..."
apt install -y wget curl vim net-tools

# 下载并安装 MySQL APT 仓库
echo "正在配置 MySQL APT 仓库..."
wget -q https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb

# 非交互式安装 APT 配置
echo "mysql-apt-config mysql-apt-config/select-server select mysql-$MYSQL_VERSION" | debconf-set-selections
dpkg -i mysql-apt-config_0.8.29-1_all.deb

# 更新 APT 包列表
apt update

# 安装 MySQL 服务器
echo "正在安装 MySQL 服务器..."
DEBIAN_FRONTEND=noninteractive apt install -y mysql-server

# 启动并启用服务
echo "正在启动 MySQL 服务..."
systemctl start mysql
systemctl enable mysql

# 等待服务启动
sleep 10

# 设置 root 密码
echo "正在设置 root 密码..."
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '$MYSQL_ROOT_PASSWORD';"

# 配置远程访问
echo "正在配置远程访问..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '$MYSQL_ROOT_PASSWORD'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"

# 运行安全加固脚本
echo "正在运行安全加固脚本..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'; FLUSH PRIVILEGES;"

# 配置防火墙
echo "正在配置防火墙..."
ufw enable 2>/dev/null || true
ufw allow 3306/tcp 2>/dev/null || true
ufw reload 2>/dev/null || true

# 验证安装
echo "正在验证安装..."
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "SELECT VERSION(), @@version_comment;"

# 输出安装结果
echo ""
echo "======================================"
echo "MySQL $MYSQL_VERSION 安装完成!"
echo "======================================"
echo "Root 密码:$MYSQL_ROOT_PASSWORD"
echo "配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf"
echo "访问命令:mysql -uroot -p'$MYSQL_ROOT_PASSWORD'"
echo "远程访问:mysql -h $(hostname -I | awk '{print $1}') -uroot -p'$MYSQL_ROOT_PASSWORD'"
echo "======================================"

常见问题解决

初始密码问题

  • 忘记初始密码
    bash
    # 停止 MySQL 服务
    systemctl stop mysqld
    
    # 以跳过授权表模式启动
    mysqld_safe --skip-grant-tables --skip-networking &
    sleep 5
    
    # 无密码登录并修改密码
    mysql -uroot -e "FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword1!';"
    
    # 重启服务
    pkill -f "mysqld_safe"
    systemctl start mysqld

端口占用问题

  • 修改默认端口:在配置文件中修改 port 参数,然后重启服务
  • 查找并终止占用端口的进程
    bash
    lsof -i :3306 2>/dev/null || fuser -n tcp 3306
    kill -9 <pid> 2>/dev/null || true

权限与所有权问题

  • 数据目录权限修复
    bash
    chown -R mysql:mysql /var/lib/mysql
    chmod -R 755 /var/lib/mysql
    systemctl restart mysqld

启动失败问题

  • 查看错误日志

    bash
    tail -n 100 /var/log/mysqld.log  # CentOS/RHEL
    tail -n 100 /var/log/mysql/error.log  # Ubuntu/Debian
  • 常见启动失败原因

    • 数据目录权限不正确
    • 配置文件语法错误
    • 端口被占用
    • SELinux 或防火墙限制
    • 内存不足

卸载 MySQL

包管理器安装的卸载

bash
# CentOS/RHEL
systemctl stop mysqld
systemctl disable mysqld
yum remove -y mysql-community-server mysql-community-client mysql-community-common mysql-community-libs
rm -rf /var/lib/mysql /etc/my.cnf /var/log/mysqld.log

# Ubuntu/Debian
systemctl stop mysql
systemctl disable mysql
apt remove -y mysql-server mysql-client mysql-common
apt autoremove -y
rm -rf /var/lib/mysql /etc/mysql /var/log/mysql

Docker 安装的卸载

bash
# 停止并删除容器
docker stop mysql-server
docker rm mysql-server

# 删除数据卷
docker volume rm mysql-data mysql-config

# 删除镜像
docker rmi mysql:8.0

版本差异与升级

MySQL 5.7 与 8.0 主要差异

特性MySQL 5.7MySQL 8.0
默认认证插件mysql_native_passwordcaching_sha2_password
字符集latin1utf8mb4
JSON 支持基础支持增强支持(JSON_TABLE、JSON_PATH 等)
窗口函数不支持支持
通用表表达式 (CTE)不支持支持
隐式分组支持不支持(需显式 GROUP BY)
资源管理基础支持增强支持(资源组)
性能模式部分支持全面支持
数据字典文件系统内置数据字典

同版本小升级

bash
# CentOS/RHEL
yum update -y mysql-community-server

# Ubuntu/Debian
apt update && apt upgrade -y mysql-server

# 重启服务
systemctl restart mysqld

跨版本大升级(5.7 → 8.0)

  1. 备份数据

    bash
    # 全量备份
    mysqldump -uroot -p --all-databases --routines --triggers --events > all_databases_backup.sql
    
    # 备份配置文件
    cp /etc/my.cnf /etc/my.cnf.bak
  2. 升级前检查

    bash
    # MySQL 5.7 运行升级检查工具
    mysqlcheck --all-databases --check-upgrade --auto-repair
    
    # 使用 MySQL Shell 进行升级前检查
    mysqlsh -- util checkForServerUpgrade root@localhost:3306
  3. 执行升级

    bash
    # CentOS/RHEL

yum-config-manager --disable mysql57-community yum-config-manager --enable mysql80-community yum update -y mysql-community-server

Ubuntu/Debian

echo "mysql-apt-config mysql-apt-config/select-server select mysql-8.0" | debconf-set-selections dpkg -i mysql-apt-config_0.8.29-1_all.deb apt update apt upgrade -y mysql-server


4. **升级后验证**:
```bash
# 运行升级验证工具
mysql_upgrade -uroot -p

# 检查服务状态和版本
systemctl status mysqld
mysql -uroot -p -e "SELECT VERSION();"

# 验证数据完整性
mysqlcheck --all-databases

最佳实践

  1. 使用官方仓库:始终从 MySQL 官方仓库安装,避免使用系统默认仓库的旧版本
  2. 设置强密码:使用包含大小写字母、数字和特殊字符的强密码,建议长度不少于 12 位
  3. 安全加固:运行 mysql_secure_installation 脚本,删除匿名用户,限制远程访问
  4. 合理配置:根据服务器资源和业务需求调整配置文件参数
  5. 启用日志:配置二进制日志、慢查询日志和错误日志,便于故障排查和性能优化
  6. 定期备份:配置自动备份策略,包括全量备份和增量备份
  7. 监控告警:部署监控工具(如 Prometheus + Grafana、Zabbix)监控 MySQL 性能和状态
  8. 定期更新:定期更新 MySQL 到最新稳定版本,修复安全漏洞和性能问题
  9. 隔离环境:生产环境、测试环境和开发环境分离,避免相互影响
  10. 文档化:记录安装配置过程、版本信息和重要参数,便于后续维护

总结

MySQL 在 Linux 上的安装方式多样,包管理器安装是最推荐的方式,适合大多数生产环境。编译安装适合需要自定义配置的高级用户,而 Docker 安装则适合快速部署和隔离环境。

在安装过程中,需要根据业务需求选择合适的 MySQL 版本,配置合理的系统参数和安全设置,并进行充分的测试和验证。自动化脚本可以提高安装效率,减少人为错误,适合批量部署场景。

无论选择哪种安装方式,都应遵循最佳实践,包括设置强密码、配置安全加固、合理调整参数、定期更新和备份数据,确保 MySQL 服务能够稳定、安全地运行。