适用系统:CentOS 7/8、Rocky Linux、AlmaLinux、Ubuntu 20.04+ | MySQL 版本:8.0.x
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -r
# 查看是否已安装 MySQL
rpm -qa | grep -i mysql
rpm -qa | grep -i mariadb
# 如有残留,先卸载
rpm -e --nodeps mariadb-libs-xxx
# CentOS / Rocky Linux / AlmaLinux
yum install -y libaio numactl-libs ncurses-compat-libs wget tar
# Ubuntu / Debian
apt-get update
apt-get install -y libaio1 libnuma1 libncurses5 wget tar
libaio 库,必须提前安装。若缺少 ncurses-compat-libs,启动时会出现 error while loading shared libraries: libncurses.so.5 错误。
# 创建 mysql 用户(禁止登录)
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 验证用户创建
id mysql
# 创建下载目录
mkdir -p /opt/software && cd /opt/software
# 下载 MySQL 8.0.36(以 Linux - Generic, glibc 2.28 为例)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
# 国内镜像加速(可选)
# wget https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
| 系统 glibc 版本 | 适用的 MySQL 包 | 查看命令 |
|---|---|---|
| glibc 2.28+ | mysql-8.0.xx-linux-glibc2.28-x86_64.tar.xz | ldd --version |
| glibc 2.17 | mysql-8.0.xx-linux-glibc2.17-x86_64.tar.xz |
# 解压到 /usr/local
cd /opt/software
tar -Jxvf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
# 创建软链接(便于版本管理和后续升级)
cd /usr/local
ln -s mysql-8.0.36-linux-glibc2.28-x86_64 mysql
# 修改目录权限
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql-8.0.36-linux-glibc2.28-x86_64
# 编辑 /etc/profile
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
# 验证
mysql --version
# 输出:mysql Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)
# 创建数据目录和日志目录
mkdir -p /data/mysql/{data,logs,tmp,conf}
chown -R mysql:mysql /data/mysql
cat > /data/mysql/conf/my.cnf << 'EOF'
[mysqld]
# 基础配置
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/data
tmpdir = /data/mysql/tmp
socket = /data/mysql/mysql.sock
pid-file = /data/mysql/mysql.pid
port = 3306
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# InnoDB 配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
# 日志配置
log_error = /data/mysql/logs/error.log
slow_query_log = 1
slow_query_log_file = /data/mysql/logs/slow.log
long_query_time = 2
# 安全设置
local_infile = 0
skip-symbolic-links
# 性能调优(根据实际情况调整)
max_connections = 500
max_allowed_packet = 64M
thread_cache_size = 64
table_open_cache = 2000
[mysql]
default-character-set = utf8mb4
socket = /data/mysql/mysql.sock
[client]
default-character-set = utf8mb4
socket = /data/mysql/mysql.sock
EOF
chown mysql:mysql /data/mysql/conf/my.cnf
chmod 640 /data/mysql/conf/my.cnf
innodb_buffer_pool_size 建议设置为物理内存的 50% ~ 70%。上例中设置为 1G,生产环境请根据服务器配置调整。
# 初始化数据目录(--initialize 会生成临时密码)
cd /usr/local/mysql
bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize --user=mysql
# 查看临时密码(最后一行)
grep 'temporary password' /data/mysql/logs/error.log
# 示例输出:A temporary password is generated for root@localhost: Abc9#klm!xyz
# 前台启动(测试用)
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/conf/my.cnf &
# 检查进程
ps -ef | grep mysqld
# 检查端口
ss -tlnp | grep 3306
netstat -tlnp | grep 3306
cat > /etc/systemd/system/mysqld.service << 'EOF'
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin -S /data/mysql/mysql.sock shutdown
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
LimitNOFILE = 65535
EOF
# 重载 systemd
systemctl daemon-reload
# 启动 MySQL
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
# 查看状态
systemctl status mysqld
# 使用临时密码登录
mysql -uroot -p -S /data/mysql/mysql.sock
# 在 MySQL 命令行中修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YourStrongPassword@123';
FLUSH PRIVILEGES;
EXIT;
/usr/local/mysql/bin/mysql_secure_installation -S /data/mysql/mysql.sock
按提示操作:设置密码强度策略、删除匿名用户、禁止 root 远程登录、删除 test 数据库、重新加载权限表。
mysql -uroot -p -S /data/mysql/mysql.sock
-- 创建数据库
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建应用用户(仅允许本机访问)
CREATE USER 'myapp'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'MyAppPass@456';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
-- 创建远程管理用户(按需,建议限制 IP)
CREATE USER 'admin'@'192.168.1.%' IDENTIFIED WITH caching_sha2_password BY 'AdminPass@789';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'admin'@'192.168.1.%';
FLUSH PRIVILEGES;
EXIT;
# 登录
mysql -uroot -p -S /data/mysql/mysql.sock
# 查看状态
mysqladmin -uroot -p -S /data/mysql/mysql.sock status
# 启停服务
systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld
# 查看错误日志
tail -f /data/mysql/logs/error.log
# 备份数据库
mysqldump -uroot -p myapp > /backup/myapp_$(date +%Y%m%d).sql
# 恢复数据库
mysql -uroot -p myapp < /backup/myapp_20240101.sql
# CentOS / Rocky
yum install -y ncurses-compat-libs
# Ubuntu / Debian
apt-get install -y libncurses5
# 检查 socket 路径是否一致
mysql -uroot -p -S /data/mysql/mysql.sock
# 或在 my.cnf 的 [client] 段添加 socket 配置
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 临时降低策略(仅测试环境)
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;
systemctl stop mysqld
rm -rf /data/mysql/data/*
cd /usr/local/mysql
bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize --user=mysql
systemctl start mysqld
| 路径 | 用途 |
|---|---|
/usr/local/mysql | MySQL 安装目录(软链接) |
/data/mysql/data | 数据文件(ibdata、表空间、日志) |
/data/mysql/logs | 错误日志、慢查询日志 |
/data/mysql/conf/my.cnf | 主配置文件 |
/data/mysql/mysql.sock | Unix Socket 文件 |