详细介绍在Ubuntu 22.04 ECS实例上安装MySQL并进行安全配置的完整步骤,包括设置密码、移除匿名用户和开启root远程登录。
1. 安装 MySQL
首先更新软件包列表并安装MySQL服务器:
bash
sudo apt update
sudo apt install mysql-server -y
安装完成后,检查MySQL服务状态:
bash
sudo systemctl status mysql
如果服务没有自动启动,使用以下命令启动并设置开机自启:
bash
sudo systemctl start mysql
sudo systemctl enable mysql
2. 初始化安全设置
方法一:使用 mysql_secure_installation(推荐)
MySQL提供了一个安全配置脚本,可以交互式地进行安全设置:
bash
sudo mysql_secure_installation
执行后会有一系列提示,按以下方式回答:
- 验证密码组件 :输入
n
(跳过密码验证策略) - 更改root密码 :输入
y
,然后设置密码为123456
- 移除匿名用户 :输入
y
- 禁止root远程登录 :这里要特别注意,输入
n
(因为我们想要开启root远程登录) - 移除test数据库 :输入
y
- 重新加载权限表 :输入
y
方法二:手动配置(如果上述方法不适用)
如果上述脚本不工作,可以手动进行安全配置:
bash
# 登录MySQL(初始安装时可能无需密码)
sudo mysql
# 在MySQL提示符下执行以下命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
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;
EXIT;
3. 开启root远程登录
现在我们需要配置root用户的远程访问权限:
bash
# 登录MySQL
sudo mysql -u root -p
# 输入密码:123456
在MySQL提示符下执行以下命令:
sql
-- 创建root用户并允许从任何主机连接(生产环境建议限制IP)
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 或者如果root@%已存在,只需更新认证方式和密码
-- ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 重新加载权限
FLUSH PRIVILEGES;
-- 查看用户权限配置
SELECT user, host, authentication_string FROM mysql.user;
退出MySQL:
sql
EXIT;
4. 配置MySQL允许远程连接
编辑MySQL配置文件,修改绑定地址:
bash
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到 bind-address
这一行,将其修改为:
bind-address = 0.0.0.0
或者注释掉这一行:
# bind-address = 127.0.0.1
按 Ctrl + O(按住Control键,再按O键)
底部会显示 File Name to Write: ...
直接按 Enter 键确认保存
保存并退出编辑器。
5. 配置防火墙
如果系统启用了UFW防火墙,需要开放MySQL端口:
bash
sudo ufw allow 3306/tcp
sudo ufw reload
6. 重启MySQL服务
应用所有配置更改:
bash
sudo systemctl restart mysql
sudo systemctl status mysql # 检查服务状态
7. 测试连接
本地测试:
bash
mysql -u root -p -h 127.0.0.1
远程测试(从另一台机器):
bash
mysql -u root -p -h 你的ECS服务器IP地址
8. 云服务器安全组配置
重要:在云服务商的控制台中,配置安全组规则,在入方向开放3306端口:
- 端口范围:
3306/3306
- 授权对象:
0.0.0.0/0
(任何IP)或您的特定IP段
安全建议
⚠️ 重要安全提醒:
- 使用简单密码如"123456"在生产环境中极不安全,建议使用强密码
- 允许root用户远程登录存在安全风险,建议创建专用用户进行远程连接
- 考虑使用SSH隧道进行更安全的远程连接
故障排除
如果连接失败,检查以下内容:
-
检查MySQL服务状态:
bashsudo systemctl status mysql
-
检查监听端口:
bashsudo netstat -tlnp | grep 3306
-
检查MySQL错误日志:
bashsudo tail -f /var/log/mysql/error.log
-
验证用户权限:
bashsudo mysql -u root -p -e "SELECT user, host FROM mysql.user;"
配置云服务器安全组
这是最常见的问题!请登录到您的云服务商控制台:
对于华为云:
- 进入 弹性云服务器 ECS 控制台
- 找到您的实例 8.138.211.30
- 点击实例名称进入详情
- 找到 安全组 标签页
- 点击安全组名称进入规则配置
- 在 入方向规则 中添加:
- 协议端口:3306/3306
- 源地址:0.0.0.0/0 或您的特定IP
- 描述:MySQL远程访问
对于阿里云:
- 进入 ECS控制台
- 找到您的实例
- 在 安全组 中配置入方向规则
完成以上步骤后,您应该能够成功从远程连接到MySQL数据库了。
↑↑↑
↓↓↓
详细介绍如何创建 yeyuge
数据库并确保 root 用户可以访问。
1. 创建 yeyuge 数据库
首先登录 MySQL:
bash
mysql -u root -p123456
在 MySQL 命令行中执行:
sql
-- 创建数据库
CREATE DATABASE yeyuge;
-- 查看所有数据库确认
SHOW DATABASES;
2. 配置 root 用户访问权限
root 用户默认已经有所有权限,但我们可以确认一下:
sql
-- 查看root用户的权限
SHOW GRANTS FOR 'root'@'%';
-- 如果root@%用户不存在,创建它(针对远程访问)
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 确保本地root用户也有权限
GRANT ALL PRIVILEGES ON yeyuge.* TO 'root'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
3. 专门为 yeyuge 数据库创建专用用户(推荐)
为了安全考虑,建议为 yeyuge
数据库创建专用用户:
sql
-- 创建专用用户
CREATE USER 'yeyuge_user'@'%' IDENTIFIED WITH mysql_native_password BY 'yeyuge_password_123';
-- 授予对yeyuge数据库的所有权限
GRANT ALL PRIVILEGES ON yeyuge.* TO 'yeyuge_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'yeyuge_user'@'%';
4. 测试数据库访问
测试 root 用户访问:
sql
-- 在MySQL命令行中测试
USE yeyuge;
SELECT DATABASE(); -- 应该显示yeyuge
-- 创建测试表验证权限
CREATE TABLE test_table (id INT, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'test');
SELECT * FROM test_table;
DROP TABLE test_table;
从命令行测试:
bash
# 使用root用户连接并指定yeyuge数据库
mysql -u root -p123456 -D yeyuge -e "SELECT '成功连接到yeyuge数据库' as message;"
# 或者连接后使用USE语句
mysql -u root -p123456 -e "USE yeyuge; SELECT DATABASE();"
5. 完整的配置脚本
创建一个完整的配置脚本:
bash
#!/bin/bash
# 保存为 setup_yeyuge_db.sh
echo "=== 设置yeyuge数据库 ==="
# 使用MySQL命令行执行配置
mysql -u root -p123456 << EOF
-- 创建数据库
CREATE DATABASE IF NOT EXISTS yeyuge;
-- 确保root用户有权限
GRANT ALL PRIVILEGES ON yeyuge.* TO 'root'@'localhost';
GRANT ALL PRIVILEGES ON yeyuge.* TO 'root'@'%';
-- 创建专用用户(可选)
CREATE USER IF NOT EXISTS 'yeyuge_user'@'%' IDENTIFIED WITH mysql_native_password BY 'yeyuge_password_123';
GRANT ALL PRIVILEGES ON yeyuge.* TO 'yeyuge_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 显示结果
SHOW DATABASES LIKE 'yeyuge';
SHOW GRANTS FOR 'root'@'%';
EOF
echo "=== 配置完成 ==="
给脚本执行权限并运行:
bash
chmod +x setup_yeyuge_db.sh
./setup_yeyuge_db.sh
6. 验证配置
验证方法1:权限检查
sql
-- 查看数据库权限
SELECT * FROM mysql.db WHERE Db = 'yeyuge';
-- 查看用户权限
SHOW GRANTS FOR 'root'@'%';
SHOW GRANTS FOR 'root'@'localhost';
验证方法2:实际连接测试
bash
# 从本地测试
mysql -u root -p123456 -D yeyuge -e "CREATE TABLE IF NOT EXISTS connection_test (test_id INT); DROP TABLE connection_test; SELECT 'yeyuge数据库访问正常' as result;"
# 从远程测试(在另一台机器上)
mysql -u root -p123456 -h 8.138.211.30 -D yeyuge -e "SELECT '远程访问yeyuge成功' as result;"
验证方法3:完整功能测试
bash
# 测试脚本:test_yeyuge_access.sh
mysql -u root -p123456 << EOF
USE yeyuge;
-- 测试创建表
CREATE TABLE IF NOT EXISTS test_permissions (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 测试插入数据
INSERT INTO test_permissions (data) VALUES ('测试数据1'), ('测试数据2');
-- 测试查询数据
SELECT * FROM test_permissions;
-- 测试删除表
DROP TABLE test_permissions;
SELECT '所有权限测试通过' as result;
EOF
7. 如果遇到权限问题
如果 root 用户仍然无法访问,执行以下修复命令:
sql
-- 确保root用户有全局权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
-- 或者重新设置root密码和权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新权限
FLUSH PRIVILEGES;
8. 常用管理命令
sql
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 查看数据库权限
SELECT * FROM mysql.db WHERE Db = 'yeyuge';
-- 查看表权限
SELECT * FROM mysql.tables_priv WHERE Db = 'yeyuge';
-- 删除数据库(如果需要重新创建)
-- DROP DATABASE yeyuge;
完成以上步骤后,root 用户就应该能够完全访问 yeyuge
数据库了。您可以通过测试脚本来验证所有功能是否正常。