MySQL 设置远程 IP 连接方式(含自动检测授权脚本)
《MySQL 设置远程 IP 连接方式(含自动检测授权脚本)》
🧩 MySQL 设置远程 IP 连接方式
1️⃣ 查看 MySQL 版本
SELECT VERSION();
2️⃣ 查看 root
用户的授权情况
密码我设置的是 123456
SELECT host, user, plugin, authentication_string
FROM mysql.user
WHERE user = 'root';
📘 下面是 MySQL 5.x 和 MySQL 8.x 两个版本中,
创建 root
用户远程访问权限的正确写法对比 👇
3️⃣ MySQL 5.x 版本(如 5.6 / 5.7)
✅ 特点:
GRANT
命令中可以直接使用IDENTIFIED BY
设置密码。
-- 1️⃣ 给 root 用户赋予所有库的全部权限,并允许远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;-- 2️⃣ 刷新权限
FLUSH PRIVILEGES;
📘 说明:
-
'root'@'%'
表示允许任意主机访问。 -
IDENTIFIED BY '123456'
设置密码。 -
WITH GRANT OPTION
允许该用户再授权给其他用户。 -
如果只想允许指定 IP(如
192.168.1.%
),可改为:GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY '123456' WITH GRANT OPTION;
4️⃣ MySQL 8.x 版本(如 8.0+)
⚠️ MySQL 8.x 不再支持在
GRANT
命令里设置密码,
必须分两步执行:先创建用户,再授权。
-- 1️⃣ 创建 root 用户(如果不存在)
CREATE USER 'root'@'%' IDENTIFIED BY '123456';-- 2️⃣ 赋予权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;-- 3️⃣ 刷新权限
FLUSH PRIVILEGES;
📘 说明:
-
如果
root@'%'
已存在,可用以下方式改密码:ALTER USER 'root'@'%' IDENTIFIED BY '123456';
-
MySQL 8 默认使用
caching_sha2_password
插件认证。
如果使用旧版客户端(如 Navicat、旧驱动)连接失败,可切换为:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
5️⃣ 检查 root 用户远程访问是否生效
SELECT host, user, plugin, authentication_string
FROM mysql.user WHERE user='root';
✅ 如果 root
对应的 host
是 %
,说明远程访问已启用。
⚙️ 6️⃣ 自动判断版本并使用变量授权(通用版)
🧩 功能说明
- ✅ 自动检测 MySQL 版本(5.x / 8.x)
- ✅ 检查用户是否存在
- ✅ 自动创建或更新密码
- ✅ 自动授权远程访问
- ✅ 使用变量设置用户、主机、密码
📜 通用授权脚本
-- ==========================================
-- 🧩 MySQL 自动检测版本并执行正确授权(通用版)
-- ==========================================-- 把整个块一次性复制到你的 MySQL 客户端并执行DROP PROCEDURE IF EXISTS grant_remote_user;
DELIMITER $$
CREATE PROCEDURE grant_remote_user(IN in_user VARCHAR(64),IN in_host VARCHAR(255),IN in_pwd VARCHAR(255)
)
BEGINDECLARE ver VARCHAR(64);DECLARE is8 INT DEFAULT 0;DECLARE user_exists INT DEFAULT 0;-- 版本检测SET ver = VERSION();SELECT CONCAT('当前 MySQL 版本:', ver) AS Version_Info;SET is8 = IF(LEFT(ver,1) = '8', 1, 0);-- 检查用户是否存在SELECT COUNT(*) INTO user_existsFROM mysql.userWHERE user = in_user AND host = in_host;SELECT CONCAT('检测结果:用户是否存在 -> ', user_exists) AS User_Exist_Status;IF is8 = 1 THEN-- MySQL 8.x 流程IF user_exists = 0 THENSET @sql_create = CONCAT('CREATE USER \'', in_user, '\'@\'', in_host, '\' IDENTIFIED BY \'', in_pwd, '\';');PREPARE ps FROM @sql_create; EXECUTE ps; DEALLOCATE PREPARE ps;SELECT '🆕 用户不存在 → 已创建用户' AS Action;ELSESET @sql_alter = CONCAT('ALTER USER \'', in_user, '\'@\'', in_host, '\' IDENTIFIED WITH mysql_native_password BY \'', in_pwd, '\';');PREPARE ps FROM @sql_alter; EXECUTE ps; DEALLOCATE PREPARE ps;SELECT '🔁 用户已存在 → 已更新密码' AS Action;END IF;SET @sql_grant = CONCAT('GRANT ALL PRIVILEGES ON *.* TO \'', in_user, '\'@\'', in_host, '\' WITH GRANT OPTION;');PREPARE ps FROM @sql_grant; EXECUTE ps; DEALLOCATE PREPARE ps;FLUSH PRIVILEGES;SELECT '✅ MySQL 8.x 授权完成。' AS Result;ELSE-- MySQL 5.x 流程IF user_exists = 0 THENSET @sql_grant = CONCAT('GRANT ALL PRIVILEGES ON *.* TO \'', in_user, '\'@\'', in_host, '\' IDENTIFIED BY \'', in_pwd, '\' WITH GRANT OPTION;');PREPARE ps FROM @sql_grant; EXECUTE ps; DEALLOCATE PREPARE ps;SELECT '🆕 用户不存在 → 已创建并授权' AS Action;ELSESET @sql_update_pwd = CONCAT('SET PASSWORD FOR \'', in_user, '\'@\'', in_host, '\' = PASSWORD(\'', in_pwd, '\');');PREPARE ps FROM @sql_update_pwd; EXECUTE ps; DEALLOCATE PREPARE ps;SELECT '🔁 用户已存在 → 已更新密码' AS Action;SET @sql_grant = CONCAT('GRANT ALL PRIVILEGES ON *.* TO \'', in_user, '\'@\'', in_host, '\' WITH GRANT OPTION;');PREPARE ps FROM @sql_grant; EXECUTE ps; DEALLOCATE PREPARE ps;END IF;FLUSH PRIVILEGES;SELECT '✅ MySQL 5.x 授权完成。' AS Result;END IF;
END$$
DELIMITER ;-- 调用示例(把密码改为你要的)
CALL grant_remote_user('root', '%', '123456');
🪄 使用方法
步骤 | 操作说明 |
---|---|
① | 登录 MySQL 控制台(mysql -u root -p ) |
② | 复制上方整个脚本 |
③ | 修改变量:SET @pwd := '你的密码'; |
④ | 执行后输出结果:版本号 → 用户是否存在 → 创建/更新状态 → 授权结果 ✅ |
🧩 输出示例
▶️ MySQL 8.x:
当前 MySQL 版本:8.0.39
检测结果:用户是否存在 -> 0
🆕 用户不存在 → 已创建用户
✅ MySQL 8.x 授权完成。
▶️ MySQL 5.x:
当前 MySQL 版本:5.7.44
检测结果:用户是否存在 -> 1
🔁 用户已存在 → 已更新密码
✅ MySQL 5.x 授权完成。