MySQL 的用户和密码是存储在 MySQL 的系统数据库中的,而不是存储在普通的用户数据库中。具体来说,用户和密码存储在名为 mysql 的系统数据库中的 user 表中;系统授权信息存储在db, host, user,columns_priv, tables_priv, procs_priv, proxies_priv
创建用户
要创建 MySQL 用户,可以使用以下语法:
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
其中,username 是要创建的用户名,hostname 是该用户可以从哪些主机登录 MySQL,password 是该用户的密码。如果要允许用户从任何主机登录,可以将 hostname 设置为 %。hostname需要使用引号引用起来。
例如,要创建一个名为 myuser 的用户,并允许该用户从任何主机登录 MySQL,可以使用以下命令:
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
用户重命名
RENAME USER '旧用户名' TO '新用户名';
FLUSH PRIVILEGES; 刷新权限
删除用户名
修改密码
注意:
新版mysql中用户密码可以保存在mysql.user表的authentication_string字段中
如果mysql.user表的authentication_string和password字段都保存密码,authentication_string优先生效
#方法1
SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
#方法2
UPDATE mysql.user SET password=PASSWORD('password') WHERE user=‘’;
方法3
ALTER USER '<username>'@'localhost' IDENTIFIED BY '<new_password>';
#mariadb 10.3
update mysql.user set authentication_string=password('ubuntu') where user='lgw';
#此方法需要执行下面指令才能生效:
FLUSH PRIVILEGES;
注意:方法二种 authentication_string未进行变更,导致密码为生效,需要同时设置authentication_string;
忘记管理员密码处理方式
#停止MySQL服务。在终端或命令提示符下,键入以下命令:
sudo service mysql stop
#停止MySQL服务。在终端或命令提示符下,键入以下命令:或者在/etc/my.cnf配置文件中添加skip-grant-tables skip-networking(停止网络访问)
sudo mysqld_safe --skip-grant-tables &
#连接mysql,进行重置管理员密码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
#退出mysql控制台,正常重启mysql服务
sudo service mysql restart
权限管理
权限类别
数据库级别权限:控制用户对整个数据库的访问权限,例如创建、删除、更改和查看数据库。
表级别权限:控制用户对表的访问权限,例如创建、删除、更改和查看表。
列级别权限:控制用户对表列的访问权限,例如选择、更改或查看表的某些列。
存储例程级别权限:控制用户对存储例程(例如存储过程和函数)的访问权限。
服务器级别权限:控制用户对MySQL服务器的访问权限,例如控制用户会话、管理日志文件、更改全局系统变量等。
连接级别权限:控制用户对连接的访问权限,例如连接到MySQL服务器、断开连接、设置会话变量等。
#服务器级别权限
CREATE USER
SHUTDOWN:关闭MySQL服务器。
SUPER:执行超级用户操作,例如更改全局系统变量和连接到MySQL服务器时跳过密码验证。
PROCESS:查看正在运行的线程和进程的列表,包括其状态、时间等信息。
RELOAD:重新加载MySQL服务器配置文件。
FILE:允许将文件读取到MySQL服务器上的本地文件系统上,或者从MySQL服务器上写入文件。
GRANT OPTION:允许用户授予其他用户访问权限。
CREATE USER:允许用户创建新用户。
REPLICATION CLIENT:允许用户查看MySQL主从复制的状态和进程。
REPLICATION SLAVE:允许用户作为MySQL从服务器,将主服务器上的数据复制到自己的服务器上。
CREATE TABLESPACE:允许用户创建新的表空间。
EVENT:允许用户创建、修改和删除MySQL事件。
SHOW DATABASES:允许用户查看MySQL服务器上的数据库列表。
#存储级别权限
EXECUTE:允许用户执行 MySQL 存储过程和函数。
ALTER ROUTINE:允许用户修改 MySQL 存储过程和函数的定义。
CREATE ROUTINE:允许用户创建新的 MySQL 存储过程和函数。
REFERENCES:允许用户引用 MySQL 存储过程和函数。
#数据库和表级别权限
CREATE:允许用户创建新的 MySQL 数据库和表。
DROP:允许用户删除 MySQL 数据库和表。
ALTER:允许用户修改现有的 MySQL 数据库表结构。
INDEX:允许用户创建和删除索引。
REFERENCES:允许用户引用 MySQL 表中的外键。
SHOW VIEW:允许用户查看视图的定义
授权grant
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host'
[IDENTIFIED BY 'password'] [WITH GRANT OPTION];
priv_type: ALL [PRIVILEGES]
object_type:TABLE | FUNCTION | PROCEDURE
priv_level: *(所有库) |*.* | db_name.* | db_name.tbl_name | tbl_name(当前库的表) | db_name.routine_name(指定库的函数,存储过程,触发器)
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
它用于授予被授权用户向其他用户授予权限的能力,使用WITH GRANT OPTION参数授权的用户可以将自己所拥有的权限授予其他用户,并且被授权用户可以向其他用户授予比自己所拥有的权限更高的权限。但需要注意的是,被授权用户只能向其他用户授予自己所拥有的权限范围内的权限。
在MySQL中,没有直接授予列级别权限的语法,因此您可以在授予表级别权限的同时控制特定列的访问权限。下面是一个示例:
GRANT SELECT (column1, column2) ON database_name.table_name TO 'user'@'localhost';
在上面的示例中,我们使用GRANT语句授予user用户对database_name.table_name表的column1和column2列的选择权限,而不是授予对整个表的访问权限。这样,user用户就只能查询这两个列,而不能访问其他列。
但需要注意的是,这种方法只是在授予表级别权限的同时限制了特定列的访问权限,因此如果用户获得了表级别的权限,他们仍然可以访问整个表,包括被限制的列。因此,这种方法不能像视图一样提供真正的字段级别权限控制。
查看指定用户获得的授权
Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];
刷新权限
取消权限
REVOKE DELETE ON hellodb.* FROM 'lgw'@‘%’;