常用SQL命令(MySQL)

本文列举RDS MySQL中常用的数据库与账号管理SQL命令。

RDS MySQL 100%兼容开源MySQL,如需了解完整的SQL命令、函数、参数说明及使用限制,请参见 MySQL 参考指南(官方)

数据库管理

类别

SQL语法

示例

创建数据库

-- 创建数据库
CREATE DATABASE <database name>;

-- 创建数据库并指定字符集与排序规则
CREATE DATABASE <database_name>
DEFAULT CHARACTER SET <charset>
COLLATE <collation>;
-- 创建数据库app_db
CREATE DATABASE app_db;

-- 创建数据库app_db并指定字符集(建议使用utf8mb4,其支持更多字符)
CREATE DATABASE app_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- 创建数据库并指定中文字符集(适用于特定场景)
CREATE DATABASE cn_db
DEFAULT CHARACTER SET gbk
COLLATE gbk_chinese_ci;

删除数据库

DROP DATABASE <database name>;
重要

删除操作不可逆,请确保数据已备份

DROP DATABASE app_db;

账号管理

类别

SQL语法

示例

创建账号

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
-- 创建允许从任意IP登录的账号(%表示允许任意IP连接)
-- 该方式与RDS控制台账号创建逻辑一致,后续可通过RDS控制台删除账号
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';

-- 创建仅允许从指定网段登录的账号
-- 若创建账号时指定了IP或网段,后续通过RDS控制台删除账号会报错,需通过SQL命令删除
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';

删除账号

DROP USER 'username'@'host';
重要

请勿使用DELETE FROM mysql.user WHERE User = '<username>' AND Host = '<host>';删除账号,此方式可能导致权限残留、元数据不一致等情况。

-- 删除名app_user且只允许从192.168.1.x网段登录的账号
DROP USER 'app_user'@'192.168.1.%';

赋予权限

GRANT SELECT ON db01.* TO 'username'@'host';
GRANT <privilege> ON <level> TO 'username'@'host';
-- <privilege>:如 SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES
-- <level>:权限级别,如 db_name.*(库级)、db_name.table_name(表级)、*.*(全局)
说明

不支持通过GRANT ALL PRIVILEGES ON *.*授予所有数据库的完全控制权限。

-- 授予app_db库所有表的查询权限
GRANT SELECT ON app_db.* TO 'app_user'@'%';

-- 授予app_db库中users表的增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.users TO 'app_user'@'%';

-- (谨慎使用)授予app_db库所有权限,仅允许来自192.168.1.x网段的客户端连接
GRANT ALL PRIVILEGES ON app_db.* TO 'admin_user'@'192.168.1.%';

查询账号权限

-- 所有实例中所有已创建的账号及其允许登录的主机地址
SELECT user, host FROM mysql.user;

-- 查看账号权限
SHOW GRANTS FOR 'username'@'host';
说明

对于早期版本,若查询mysql.user报错,可改为查询mysql.user_view视图。

-- 查看账号app_user192.168.1.%主机登录时拥有的所有数据库权限
SHOW GRANTS FOR 'app_user'@'192.168.1.%';

回收账号权限(账号依然存在)

  • 收回全部权限:撤销该账号在所有数据库上的所有操作权限和授权能力

    REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'username'@'host';
  • 收回指定权限:撤销该账号在所有数据库的所有表上执行UPDATE的权限(权限类型按需变更即可)

    REVOKE UPDATE ON *.* FROM 'username'@'host';
说明

回收权限不会删除账号,如需彻底删除,请配合DROP USER使用。

--撤销账号app_user192.168.1.%登录时在所有数据库上的全部操作权限和授权能力
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'192.168.1.%';

-- 撤销用户app_user10.10.0.%登录时对shop_db库中users表的修改数据权限
REVOKE UPDATE ON shop_db.users FROM 'app_user'@'10.10.0.%';

常见问题

通过RDS控制台删除账号报错?

问题描述

RDS MySQL控制台账号管理页面删除用户时报错删除账户失败,请检查输入的参数或请求。实例中可能存在其他进程正在等待锁,或者该数据库账户的host值未设置为%,即允许任意主机登录。

8b1948f05d98ff2d30dd023ba742091e

解决方案

通过RDS MySQL控制台创建的用户账号默认主机白名单为%,即允许任意主机访问。若账号是通过SQL命令手动创建,且创建时指定了仅允许IP或网段登录(如'username'@'10.10.10.1''username'@'10.%.%.%'),则该账号无法通过RDS控制台删除。

请执行如下SQL先查询待删除账号是否为非%配置,若主机host为非%形式,则不允许通过RDS控制台删除,需要通过DROP user命令行方式删除。

-- 检查待删除账号是否为非%配置(如192.168.1.1、192.168.1.%等)
SELECT user,host FROM mysql.user WHERE user='待删除用户名';

-- 若主机host为非%形式,需通过DROP命令删除账号
DROP user 'user'@'host';DROP USER '待删除用户名'@'目标主机IP或网段';

相关文档