1、用户管理
# 相关数据库和表
元数据数据库:mysql
系统授权表:db, host, user,columns_priv, tables_priv, procs_priv, proxies_priv
# 用户帐号
'USERNAME'@'HOST'
@'HOST': 主机名: user1@'web1.magedu.org'
IP地址或Network
通配符: % _
示例: test@'172.16.%.%'
test1@'192.168.1.%'
test2@'10.0.0.0/255.255.0.0'
# 创建用户
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
# 示例:
create user test@'10.0.0.0/255.255.255.0' identified by '123456';
create user test2@'10.0.0.%' identified by 123456;
# 新建用户的默认权限:USAGE
# 用户重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
# 删除用户
DROP USER 'USERNAME'@'HOST'
# 删除默认的空用户
DROP USER ''@'localhost';
# 修改密码
# 新版mysql中用户密码可以保存在mysql.user表的authentication_string字段中
# 如果mysql.user表的authentication_string和password字段都保存密authentication_string优先生效
# 方法1,用户可以也可通过此方式修改自已的密码
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
# MySQL8.0 版本不支持此方法,因为password函数被取消
set password for root@'localhost'='123456' ;
# MySQL8.0版本支持此方法,此方式直接将密码123456加密后存放在mysql.user表的authentication_string字段
# 方法2
ALTER USER test@'%' IDENTIFIED BY 'centos';
# 通用改密码方法, 用户可以也可通过此方式修改自已的密码,MySQL8 版本修改密码
# 方法3 此方式MySQL8.0不支持,因为password函数被取消
UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
# mariadb 10.3
update mysql.user set authentication_string=password('ubuntu') where
user='mage';
# 此方法需要执行下面指令才能生效:
FLUSH PRIVILEGES;
2、忘记密码解决方法
- 启动mysqld进程时,为其使用如下选项
- –skip-grant-tables
- –skip-networking
- 使用UPDATE命令修改管理员密码
- 关闭mysqld进程,移除上述两个选项,重启mysqld
# Mariadb 和MySQL5.6版之前破解root密码
vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking
systemctl restart mysqld|mariadb
mysql
#方法1
#mariadb 旧版和MySQL5.6版之前
MariaDB [(none)]> update mysql.user set password=password('Root123!') where
user='root';
#mariadb 新版
MariaDB [(none)]> update mysql.user set authentication_string=password('Root123!')
where user='root';
#方法2
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> alter user root@'localhost' identified by 'Root123!';
vim /etc/my.cnf
[mysqld]
#skip-grant-tables
#skip-networking
systemctl restart mysqld|mariadb
mysql -uroot -pRoot123!
# MySQL5.7和8.0 破解root密码
vim /etc/my.cnf
[mysqld]
skip-grant-tables
skip-networking #MySQL8.0不需要
systemctl restart mysqld
mysql
#方法1
mysql> update mysql.user set authentication_string='' where user='root' and
host='localhost';
#方法2
mysql> flush privileges;
#再执行下面任意一个命令
mysql> alter user root@'localhost' identified by 'Root123!';
mysql> set password for root@'localhost'='Root123!';
vim /etc/my.cnf
[mysqld]
#skip-grant-tables
#skip-networking
systemctl restart mysqld
mysql -uroot -pRoot123!
# 此方法适用于包安装方式的MySQL或Mariadb(慎重使用,适合使用在无数据的新库或者数据不重要的测试库)
systemctl stop mysqld
rm -rf /var/lib/mysql/*
systemctl start mysqld
3、权限管理和DCL语句
3.1、权限类别
- 权限类别:
- 管理类
- 程序类
- 数据库级别
- 表级别
- 字段级别
- 管理类:
- CREATE USER
- FILE
- SUPER
- SHOW DATABASES
- RELOAD
- SHUTDOWN
- REPLICATION SLAVE
- REPLICATION CLIENT
- LOCK TABLES
- PROCESS
- CREATE TEMPORARY TABLES
- 程序类:针对 FUNCTION、PROCEDURE、TRIGGER
- CREATE
- ALTER
- DROP
- EXCUTE
- 库和表级别:针对 DATABASE、TABLE
- ALTER
- CREATE
- CREATE VIEW
- DROP INDEX
- SHOW VIEW
- WITH GRANT OPTION:能将自己获得的权限转赠给其他用户
- 数据操作
- SELECT
- INSERT
- DELETE
- UPDATE
- 字段级别
- SELECT(col1,col2,…)
- UPDATE(col1,col2,…)
- INSERT(col1,col2,…)
- 所有权限
- ALL PRIVILEGES 或 ALL
3.2、授权(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
# 范例
GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';
GRANT ALL ON wordpress.* TO wordpress@'10.0.0.%' ;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%' WITH GRANT OPTION;
#创建用户和授权同时执行的方式在MySQL8.0取消了
GRANT ALL ON wordpress.* TO wordpress@'192.168.8.%' IDENTIFIED BY 'magedu';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.8.%' IDENTIFIED BY 'magedu'
WITH GRANT OPTION;
3.3、取消权限(REVOKE)
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON
[object_type] priv_level FROM user [, user] ...
# 范例
REVOKE DELETE ON *.* FROM 'testuser'@'172.16.0.%';
3.4、查看指定用户获得的授权
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];
- MariaDB服务进程启动时会读取mysql库中所有授权表至内存
- GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
- 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表 mysql> FLUSH PRIVILEGES;
4、MySQL的图形化的远程管理工具
在MySQL数据库中创建用户并授权后,可以使用相关图形化工具进行远程的管理。
- 常见的图形化管理工具:
- Navicat
- SQLyog
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END