用户账户
root,初始化mysql后,有一个默认的root用户,会打印出初始化的root密码,第一次登陆时,强制要求修改root密码
启动时添加skip-grant-tables选项,然后修改root密码
或将skip-grant-tables加到/etc/my.cnf中,启动后修改root密码,然后在将这一条去掉
create user 'finley'@'localhost' identified by 'password';
create user 'finley'@'%.example.com' identified by 'password';
create user 'dummy'@'localhost';
create user gcb identified by 'gcb123'; -- 不跟主机名,允许在任何主机上登录
create user 'gcb'@'192.168.165.%' identified by 'gcb123'; --不带通配符的地址可以不加引号,但最后都加上,'a@ip'会被识别为一个用户名,注意
insert into mysql.user (host,user,password, ssl_cipher, x509_issuer, x509_subject) values('%','jifei',PASSWORD('jifei'), '', '', '');
没有密码的用户只能在本机登录
要在本机登录,用户必须有一个'user'@'locahost'的账户,用'user'@'%'在本机登录将被视为匿名用户
update user set password=password('root123') where user='root'; 只用于mariadb
alter user 'root'@'localhost' IDENTIFIED BY 'root123'; 默认使用caching_sha2_password加密方式
alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root123'; 使用老版的本地密码,有些程序连接要用
alter user user() identified by 'password'; user()函数获取当前登录的用户
alter user 'old_app_dev'@'localhost' identified by 'new_password';
flush privileges; 更新过权限后要刷新特权
mysqladmin -u user_name -h host_name password "password"
drop user 'finley'@'localhost';
show create user 'root'@'locahost';
授权
grant all on *.* to 'finley'@'localhost' with grant option;
show grants for 'admin'@'localhost';
revoke all on *.* from 'finley'@'%.example.com';
revoke create,drop on expenses.* from 'custom'@'host47.example.com';
角色
create role 'app_developer', 'app_read', 'app_write';
grant insert, update, delete on app_db.* to 'app_write';
grant 'app_developer' to 'dev1'@'localhost';
[mysqld]
mandatory_roles='role1,role2@localhost,r3@%.example.com' 强制授予所有用户指定的角色
set persist mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; 运行时强制授予所有用户指定角色
show grants for 'rw_user1'@'localhost' using 'app_read', 'app_write'; 显示用户从指定角色中获取的授权
select current_role(); 当前登录用户的角色
set default role all to 'dev1'@'localhost', 'read_user1'@'localhost', 'read_user2'@'localhost'; 设置默认角色,后面所有启动的会话有效
set role all except 'app_write'; 设置启用的角色,本次会话有效
revoke role from user;
密码期限
支持内部和外部认证
[mysqld]
default_password_lifetime=180 ,对所有账户生效,密码时长,0表示永不过期
password_history=6,重设密码时禁止使用最近6个已用过的密码
password_reuse_interval=365,禁止使用365以内用过的密码
create user 'jeffrey'@'localhost' password expire interval 90 day; 90天过期
never,永不过期,default,使用系统默认值
create user 'jeffrey'@'localhost' password history 5 password reuse interval 365 day;
set persist default_password_lifetime = 180; 运行时设置
alter user 'jeffrey'@'localhost' password expire interval 90 day; 更新密码设置
密码健壮性
validate_password.check_user_name on,不允许密码中出现用户名
validate_password.dictionary_file,字典路径
validate_password.length,密码最短长度
validate_password.mixed_case_count,最小大小写字符的个数
validate_password.number_count,密码中数字的最小个数
validate_password.policy,密码策略级别,0,1,2
validate_password.special_char_count,特殊字符的个数
set global validate.password.policy = 0, -- 密码强度,1是中级,5.7中间的 . 改为 _
set global validate.password.length = 1;
密码认证插件
--default-auth=mysql_native_password,8.0之前使用native_password,8.0之后默认使用caching_sha2_password认证插件
default_authentication_plugin
修改密码的策略
[mysqld]
password_require_current=on,为off,用户修改密码时不需要输入原来的密码,为on时需要输入
create user 'jeffrey'@'localhost' password require current [optional]; 修改用户密码时可以但不必输入原密码
default,遵循全局配置
alter user 'jeffrey'@'localhost' identified by 'new_pwd' replace 'old_pwd'; 修改旧密码时填入新密码
登录失败锁定
create user 'u1'@'localhost' identified by 'password' failed_login_attempts 3 password_lock_time [3];
unbounded,无限时长
账户资源限制
max_user_connections,同一账户的最大连接数,为0不限制
create user 'francis'@'localhost' identified by 'frank'
with max_queries_per_hour 20 每小时最大20次查询
max_updates_per_hour 10 每小时最大20次更新
max_connections_per_hour 5 每小时5次连接
max_user_connections 2;