外观
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 仓库:
- 下载并安装 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- 安装 MySQL 服务器
bash
# 安装 MySQL 服务器
yum install -y mysql-community-server
# 启动 MySQL 服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
# 检查服务状态
systemctl status mysqld- 初始化配置
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_installationUbuntu/Debian 安装
使用 MySQL APT 仓库:
- 下载并安装 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- 安装 MySQL 服务器
bash
# 安装 MySQL 服务器
apt install -y mysql-server
# 启动服务
systemctl start mysql
# 设置开机自启
systemctl enable mysql
# 检查服务状态
systemctl status mysql- 初始化配置
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 mysqldDocker 安装
适合快速部署和隔离环境:
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
启动失败问题
查看错误日志:
bashtail -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/mysqlDocker 安装的卸载
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.7 | MySQL 8.0 |
|---|---|---|
| 默认认证插件 | mysql_native_password | caching_sha2_password |
| 字符集 | latin1 | utf8mb4 |
| 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)
备份数据:
bash# 全量备份 mysqldump -uroot -p --all-databases --routines --triggers --events > all_databases_backup.sql # 备份配置文件 cp /etc/my.cnf /etc/my.cnf.bak升级前检查:
bash# MySQL 5.7 运行升级检查工具 mysqlcheck --all-databases --check-upgrade --auto-repair # 使用 MySQL Shell 进行升级前检查 mysqlsh -- util checkForServerUpgrade root@localhost:3306执行升级:
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最佳实践
- 使用官方仓库:始终从 MySQL 官方仓库安装,避免使用系统默认仓库的旧版本
- 设置强密码:使用包含大小写字母、数字和特殊字符的强密码,建议长度不少于 12 位
- 安全加固:运行
mysql_secure_installation脚本,删除匿名用户,限制远程访问 - 合理配置:根据服务器资源和业务需求调整配置文件参数
- 启用日志:配置二进制日志、慢查询日志和错误日志,便于故障排查和性能优化
- 定期备份:配置自动备份策略,包括全量备份和增量备份
- 监控告警:部署监控工具(如 Prometheus + Grafana、Zabbix)监控 MySQL 性能和状态
- 定期更新:定期更新 MySQL 到最新稳定版本,修复安全漏洞和性能问题
- 隔离环境:生产环境、测试环境和开发环境分离,避免相互影响
- 文档化:记录安装配置过程、版本信息和重要参数,便于后续维护
总结
MySQL 在 Linux 上的安装方式多样,包管理器安装是最推荐的方式,适合大多数生产环境。编译安装适合需要自定义配置的高级用户,而 Docker 安装则适合快速部署和隔离环境。
在安装过程中,需要根据业务需求选择合适的 MySQL 版本,配置合理的系统参数和安全设置,并进行充分的测试和验证。自动化脚本可以提高安装效率,减少人为错误,适合批量部署场景。
无论选择哪种安装方式,都应遵循最佳实践,包括设置强密码、配置安全加固、合理调整参数、定期更新和备份数据,确保 MySQL 服务能够稳定、安全地运行。
