1. 完整的一键安装脚本

#!/bin/bash
# 清理环境
yum remove -y mysql* mariadb*

# 下载并安装 MySQL 仓库
wget -O /tmp/mysql80.rpm https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
yum localinstall -y /tmp/mysql80.rpm

# 导入 GPG 密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

# 安装 MySQL
yum install -y mysql-community-server mysql-community-client

echo "MySQL 8 安装完成!"

安装后的配置

1. 启动 MySQL 服务

# 启动 MySQL 服务
systemctl start mysqld

# 设置开机自启
systemctl enable mysqld

# 检查服务状态
systemctl status mysqld

2. 获取初始密码并修改

# 查看临时 root 密码
grep 'temporary password' /var/log/mysqld.log

# 输出类似:2024-01-01T00:00:00.000000Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Abc123def#

3. 运行安全配置

# 运行安全配置脚本
mysql_secure_installation

按照提示操作:

 - 输入刚才查到的临时密码
 - 重置 root 密码(MySQL 8 要求强密码)
 - 移除匿名用户
 - 禁止 root 远程登录(建议)
 - 移除测试数据库
 - 重新加载权限表
 
 /**
 示例
1. 输入新设置的 root 密码
2. 是否更改密码?(输入 n,因为刚改过)
3. 是否移除匿名用户?(输入 y)
4. 是否禁止 root 远程登录?(输入 y,增强安全)
5. 是否移除 test 数据库?(输入 y)
6. 是否重新加载权限表?(输入 y)
 **/

4. 登录 MySQL

# 使用新密码登录
mysql -u root -p

常见问题解决

如果忘记临时密码:

# 停止 MySQL 服务
systemctl stop mysqld

# 跳过权限检查启动
mysqld_safe --skip-grant-tables &

# 无密码登录并重置密码
mysql -u root

在 MySQL 中执行:

ALTER USER 'root'@'localhost' IDENTIFIED BY '您的新密码';
FLUSH PRIVILEGES;
EXIT;

然后重启 MySQL 服务:

pkill mysqld
systemctl start mysqld

配置远程连接(如果需要):

即使没有执行 mysql_secure_installation,MySQL 的 root 用户默认也是不支持远程连接的。

默认的 root 用户权限

安装 MySQL 后,默认的 root 用户配置是:

-- 查看 root 用户的访问权限
SELECT user, host FROM mysql.user WHERE user = 'root';

你会看到类似这样的结果:

+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
| root | 127.0.0.1 |
| root | ::1       |
+------+-----------+

默认安全设置说明

  • localhost:只能从服务器本机连接

  • 127.0.0.1:IPv4 本地回环地址

  • ::1:IPv6 本地回环地址

所有这些都意味着:root 用户默认只能从 MySQL 服务器本身连接,无法从外部网络连接。

验证当前状态

-- 查看所有用户的连接权限
SELECT user, host FROM mysql.user;

远程连接的必要条件

要让 root 能够远程连接,需要手动创建远程访问权限:

-- 需要手动执行才会开启远程连接
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
-- 或者
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

或者创建一个支持远程连接的新用户:

-- 在 MySQL 中执行
CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%';
FLUSH PRIVILEGES;
% 是 固定写法,不是占位符。它表示"所有主机"的意思。
% 的含义:
% = 允许从任何 IP 地址连接
这是 MySQL 中表示"所有主机"的特殊字符

其他常见的主机配置:

-- 允许从任何主机连接(最宽松)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'App123!@#';

-- 只允许从本地连接(最严格)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'App123!@#';

-- 允许从特定 IP 连接
CREATE USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'App123!@#';

-- 允许从 IP 段连接
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'App123!@#';

-- 允许从域名连接
CREATE USER 'app_user'@'example.com' IDENTIFIED BY 'App123!@#';

修改配置文件允许远程连接:

vi /etc/my.cnf

在 [mysqld] 部分添加:

bind-address = 0.0.0.0

重启服务:

systemctl restart mysqld

验证安装

# 检查 MySQL 版本
mysql --version

# 登录测试
mysql -u root -p -e "SELECT VERSION();"

# 检查服务状态
systemctl status mysqld

总结:

要支持远程连接,需要:

  1. 创建专门的远程用户(推荐)

  2. 配置云服务器安全组开放 3306 端口

  3. 配置防火墙允许 MySQL 端口

重要提示

  1. MySQL 8 默认使用强密码策略,密码需要包含大小写字母、数字和特殊字符

  2. 默认认证插件是 caching_sha2_password,比之前的 mysql_native_password 更安全

  3. 首次安装后一定要运行 mysql_secure_installation

  4. 默认只允许本地连接,需要远程访问时要额外配置

步骤5:基本配置(可选)

-- 查看当前字符集
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

-- 永久配置需要修改 /etc/my.cnf

mysql8默认用强密码,如何调整密码策略(不建议)

(如果你的数据库只是用于学习的话没问题)

查看并调整密码策略

-- 查看当前的密码策略
SHOW VARIABLES LIKE 'validate_password%';

你会看到类似这样的输出:

+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

临时降低密码策略(测试环境使用)

如果只是测试环境,可以临时降低要求:

-- 先查看当前策略
SHOW VARIABLES LIKE 'validate_password%';

-- 降低策略
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;

-- 设置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

-- 刷新权限
FLUSH PRIVILEGES;

更完整的调整:

-- 临时调整多个密码策略参数
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;
SET GLOBAL validate_password.mixed_case_count = 0;
SET GLOBAL validate_password.number_count = 0;
SET GLOBAL validate_password.special_char_count = 0;

-- 现在可以设置简单密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

永久修改密码策略(修改配置文件)

如果需要永久修改,编辑 MySQL 配置文件:

# 编辑 MySQL 配置文件
vi /etc/my.cnf

在 [mysqld] 部分添加:

[mysqld]
validate_password.policy=LOW
validate_password.length=4

然后重启 MySQL:

systemctl restart mysqld

推荐操作步骤

对于生产环境,建议使用方案1(强密码):

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL@2024';

对于测试/学习环境,可以使用上面临时降低密码策略

更多推荐