web服务环境搭建之三: linux环境安装mysql
- mysql安装(多版本支持)
- **1. 准备工作**
- 登录到阿里云服务器
- 更新系统软件包
- **2. 安装第一个版本的 MySQL(如 MySQL 5.7)**
- **CentOS 系统**
- **Ubuntu 系统**
- **3. 安装第二个版本的 MySQL(如 MySQL 8.0)**
- 下载二进制包
- **4. 使用 `root` 用户通过 `sock` 文件连接**
- 连接 MySQL 5.7
- 连接 MySQL 8.0
- **5. 常见问题排查**
- 修改root密码
- MySQL 修改 root 密码完整指南
- **方法一:已知原密码时修改(推荐)**
- **方法二:忘记密码时重置(安全模式)**
- **方法三:使用 mysql_secure_installation(交互式)**
- **方法四:配置文件初始化(MySQL 8.0+)**
- **方法五:数据库初始化后获取默认密码**
- **不同版本注意事项**
- **常见问题解决**
- **安全建议**
- 创建用户并授权
- **一、创建用户**
- 1. **基础命令**
- 2. **示例**
- **二、授予权限**
- 1. **基础语法**
- 2. **常用授权示例**
- 3. **立即生效**
- **三、查看和验证权限**
- 1. **查看用户权限**
- 2. **查看所有用户**
- **四、撤销权限**
- 1. **撤销指定权限**
- 2. **撤销所有权限**
- **五、删除用户**
- **七、常见问题解决**
- **问题 1:用户无法远程连接**
- **问题 2:权限未生效**
- **问题 3:MySQL 8.0 认证失败**
- **八、权限对照表**
mysql安装(多版本支持)
在阿里云服务器上安装并启动多个版本的 MySQL,并通过 root
用户使用 sock
文件的方式连接数据库,可以通过以下步骤实现。我们将采用不同的数据目录、配置文件和 sock
文件来避免冲突。
1. 准备工作
登录到阿里云服务器
通过 SSH 登录到你的阿里云服务器:
ssh root@<你的服务器公网IP>
更新系统软件包
确保系统软件包是最新的:
- 对于 CentOS:
yum update -y
- 对于 Ubuntu:
apt update && apt upgrade -y
2. 安装第一个版本的 MySQL(如 MySQL 5.7)
CentOS 系统
-
添加 MySQL Yum 仓库:
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
-
安装 MySQL 5.7:
yum install mysql-community-server -y
-
配置 MySQL 5.7 的
my.cnf
文件:
编辑/etc/my.cnf
或/etc/my57.cnf
:[mysqld] port=3306 datadir=/var/lib/mysql57 socket=/var/lib/mysql57/mysql.sock pid-file=/var/lib/mysql57/mysql.pid user=mysql
-
初始化 MySQL 数据目录:
mkdir -p /var/lib/mysql57 chown -R mysql:mysql /var/lib/mysql57 mysqld --defaults-file=/etc/my57.cnf --initialize --user=mysql
-
启动 MySQL 服务:
mysqld_safe --defaults-file=/etc/my57.cnf &
-
查看初始密码:
grep 'temporary password' /var/log/mysqld.log
Ubuntu 系统
-
添加 MySQL APT 仓库:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb dpkg -i mysql-apt-config_0.8.22-1_all.deb
在弹出的界面中选择 MySQL 5.7。
-
安装 MySQL 5.7:
apt update apt install mysql-server -y
-
配置 MySQL 5.7 的
my.cnf
文件:
编辑/etc/mysql/mysql.conf.d/mysqld.cnf
或/etc/my57.cnf
:[mysqld] port=3306 datadir=/var/lib/mysql57 socket=/var/lib/mysql57/mysql.sock pid-file=/var/lib/mysql57/mysql.pid user=mysql
-
初始化 MySQL 数据目录:
mkdir -p /var/lib/mysql57 chown -R mysql:mysql /var/lib/mysql57 mysqld --defaults-file=/etc/my57.cnf --initialize --user=mysql
-
启动 MySQL 服务:
mysqld_safe --defaults-file=/etc/my57.cnf &
-
查看初始密码:
grep 'temporary password' /var/log/mysql/error.log
3. 安装第二个版本的 MySQL(如 MySQL 8.0)
下载二进制包
-
下载 MySQL 8.0 二进制包:
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz tar -xvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql8
-
创建数据目录和配置文件:
mkdir -p /data/mysql8 chown -R mysql:mysql /data/mysql8
-
配置
my.cnf
文件:
创建/etc/my8.cnf
,内容如下:[mysqld] port=3307 datadir=/data/mysql8 socket=/data/mysql8/mysql.sock pid-file=/data/mysql8/mysql.pid user=mysql
-
初始化 MySQL 数据库:
/usr/local/mysql8/bin/mysqld --defaults-file=/etc/my8.cnf --initialize --user=mysql
-
启动 MySQL 服务:
/usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my8.cnf &
4. 使用 root
用户通过 sock
文件连接
连接 MySQL 5.7
-
使用
sock
文件连接:mysql -u root -p --socket=/var/lib/mysql57/mysql.sock
-
如果需要设置默认连接方式,可以编辑
~/.my.cnf
文件:[client] user=root socket=/var/lib/mysql57/mysql.sock
连接 MySQL 8.0
-
使用
sock
文件连接:mysql -u root -p --socket=/data/mysql8/mysql.sock
-
如果需要设置默认连接方式,可以编辑
~/.my.cnf
文件:[client] user=root socket=/data/mysql8/mysql.sock
5. 常见问题排查
-
端口冲突:
- 确保每个 MySQL 实例使用不同的端口。
- 检查防火墙规则是否允许访问。
-
文件路径冲突:
- 不同版本的 MySQL 必须使用不同的数据目录和
sock
文件。
- 不同版本的 MySQL 必须使用不同的数据目录和
-
权限问题:
- 确保 MySQL 数据目录和
sock
文件的所有者为mysql
用户:chown -R mysql:mysql /path/to/datadir
- 确保 MySQL 数据目录和
-
日志问题:
- 检查日志文件以定位启动或连接失败的原因:
- MySQL 5.7:
/var/log/mysqld.log
- MySQL 8.0:
/data/mysql8/error.log
- MySQL 5.7:
- 检查日志文件以定位启动或连接失败的原因:
完成以上步骤后,你就可以在阿里云服务器上运行多个版本的 MySQL,并通过 root
用户使用 sock
文件连接了!
修改root密码
MySQL 修改 root 密码完整指南
以下是修改 MySQL root 密码的多种方法,适用于不同场景:
方法一:已知原密码时修改(推荐)
# 1. 登录MySQL
mysql -u root -p
# 输入当前密码# 2. 执行修改命令(MySQL 5.7+通用)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;# 或使用旧语法(兼容老版本)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');
方法二:忘记密码时重置(安全模式)
# 1. 停止MySQL服务
sudo systemctl stop mysql # 或 mysqld# 2. 启动无权限验证模式
sudo mysqld_safe --skip-grant-tables --skip-networking &# 3. 新终端窗口登录MySQL(无需密码)
mysql -u root# 4. 清除root密码(MySQL 5.7+)
UPDATE mysql.user SET authentication_string='' WHERE User='root';
FLUSH PRIVILEGES;
EXIT;# 5. 重启MySQL正常模式
sudo systemctl restart mysql# 6. 用空密码登录后设置新密码
mysql -u root -p # 密码留空
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
方法三:使用 mysql_secure_installation(交互式)
sudo mysql_secure_installation
# 按提示操作,包含密码修改选项
方法四:配置文件初始化(MySQL 8.0+)
# 1. 创建临时配置文件
echo "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';" > /tmp/reset.sql# 2. 使用--init-file参数启动
sudo systemctl stop mysql
sudo mysqld --init-file=/tmp/reset.sql &# 3. 重启服务
sudo systemctl restart mysql
方法五:数据库初始化后获取默认密码
# 查询初始密码
grep 'temporary password' /var/log/mysql/error.log
不同版本注意事项
版本 | 密码字段 | 修改命令 |
---|---|---|
MySQL 5.6 | password | SET PASSWORD=... |
MySQL 5.7 | authentication_string | ALTER USER... |
MySQL 8.0 | authentication_string | 必须用ALTER USER 语法 |
常见问题解决
-
权限错误 1045
检查用户是否存在:SELECT User, Host FROM mysql.user;
可能需要指定主机名:
ALTER USER 'root'@'%' IDENTIFIED BY '新密码';
-
插件认证错误
修改认证方式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
-
修改远程root密码
ALTER USER 'root'@'%' IDENTIFIED BY '远程密码';
安全建议
- 密码复杂度:至少12位,含大小写字母、数字和特殊符号
- 定期更换:建议每90天修改一次
- 限制root远程访问:
DELETE FROM mysql.user WHERE User='root' AND Host='%'; FLUSH PRIVILEGES;
通过以上方法,您可以灵活应对各种密码修改场景。建议优先使用ALTER USER
语法(MySQL 5.7+),这是最标准和安全的方式。
创建用户并授权
在 MySQL 中创建用户并授权是数据库安全管理的基础操作。以下是 详细步骤及常用命令,涵盖主流版本(MySQL 5.7+ 和 8.0+):
一、创建用户
1. 基础命令
CREATE USER '用户名'@'允许访问的主机' IDENTIFIED BY '密码';
• 关键参数:
• 用户名
:登录名(如 webuser
)。
• 允许访问的主机
:
◦ localhost
:仅允许本地连接。
◦ %
:允许所有远程 IP。
◦ 192.168.1.%
:允许特定 IP 段。
• 密码
:建议使用强密码(如 P@ssw0rd!
)。
2. 示例
-- 允许从任意 IP 连接的用户
CREATE USER 'admin'@'%' IDENTIFIED BY 'Secure123!';-- 仅允许本地连接的用户(无密码)
CREATE USER 'backup'@'localhost' IDENTIFIED BY '';
二、授予权限
1. 基础语法
GRANT 权限类型 ON 数据库.表 TO '用户名'@'主机';
• 权限类型:
• 全局权限:ALL PRIVILEGES
(所有权限)、CREATE USER
。
• 数据库权限:SELECT
、INSERT
、UPDATE
、DELETE
、DROP
等。
• 表/列权限:GRANT SELECT (列1, 列2) ON 数据库.表 TO 用户
。
2. 常用授权示例
-- 授予所有数据库的全部权限(慎用!)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';-- 授予特定数据库的读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON shopdb.* TO 'webuser'@'192.168.1.%';-- 授予存储过程执行权限
GRANT EXECUTE ON PROCEDURE mydb.myprocedure TO 'user'@'localhost';
3. 立即生效
FLUSH PRIVILEGES; -- 刷新权限
三、查看和验证权限
1. 查看用户权限
SHOW GRANTS FOR '用户名'@'主机';
-- 示例
SHOW GRANTS FOR 'webuser'@'192.168.1.%';
2. 查看所有用户
SELECT user, host FROM mysql.user;
四、撤销权限
1. 撤销指定权限
REVOKE 权限类型 ON 数据库.表 FROM '用户名'@'主机';
-- 示例
REVOKE DELETE ON shopdb.* FROM 'webuser'@'192.168.1.%';
2. 撤销所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM '用户名'@'主机';
五、删除用户
DROP USER '用户名'@'主机';
-- 示例
DROP USER 'olduser'@'%';
``
### **六、安全最佳实践**
1. **最小权限原则**:按需授予权限,避免使用 `ALL PRIVILEGES`。
2. **限制访问源**:禁止滥用 `%`,按业务需求限制 IP 范围。
3. **定期审计权限**:```sql-- 检查具有超级权限的用户SELECT user, host FROM mysql.user WHERE Super_priv = 'Y';
- 密码策略(MySQL 8.0+):
-- 设置密码强度策略 SET GLOBAL validate_password.policy = STRONG;
七、常见问题解决
问题 1:用户无法远程连接
• 检查项:
• 用户授权的主机是否为 %
。
• MySQL 配置文件中 bind-address
是否为 0.0.0.0
。
• 防火墙是否开放 3306
端口。
问题 2:权限未生效
• 强制刷新:
FLUSH PRIVILEGES;
问题 3:MySQL 8.0 认证失败
• 兼容旧客户端:
ALTER USER '用户'@'主机' IDENTIFIED WITH mysql_native_password BY '新密码';
八、权限对照表
权限类型 | 作用范围 | 说明 |
---|---|---|
SELECT | 表/列 | 读取数据 |
INSERT | 表/列 | 插入数据 |
UPDATE | 表/列 | 修改数据 |
DELETE | 表 | 删除数据 |
CREATE | 数据库/表 | 创建新数据库或表 |
DROP | 数据库/表 | 删除数据库或表 |
GRANT OPTION | 全局 | 允许用户授予自己的权限给他人 |
SUPER | 全局 | 高级管理权限(慎用) |
通过以上步骤,您可以精确控制 MySQL 用户的访问权限,确保数据库安全。建议配合定期备份和日志审计,构建完整的安全体系。