MySQL

MySQL用户和权限管理

元数据数据库:mysql
    系统授权表:
        db, host, user   存放授权的相关指令 
        columns_priv(列的授权), tables_priv(表的授权), procs_priv(存储触发器的授权), proxies_priv

select user,host,password,authenticationn_string from user;
    authenticationn_string 验证的字符串
    不同的版本可能将密码记录在此处

用户账号:
    'USERNAME'@'HOST'
        @'HOST':
        主机名
        IP地址或Network
        通配符: % _
           示例:172.16.%.%

用户管理

创建用户:CREATE USER
    CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
    默认权限:USAGE

用户重命名:RENAME USER
    RENAME USER old_user_name TO new_user_name;

删除用户:
    DROP USER 'USERNAME'@'HOST‘
    示例:删除默认的空用户
    DROP USER ''@'localhost';

修改密码:
    mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
    mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
    此方法需要执行下面指令才能生效:
    mysql> FLUSH PRIVILEGES;
    #mysqladmin -u root -poldpass password ‘newpass’

忘记管理员密码的解决办法:
    启动mysqld进程时,为其使用如下选项:
        --skip-grant-tables   --skip-networking
    使用UPDATE命令修改管理员密码
    关闭mysqld进程,移除上述两个选项,重启mysqld

实验: 用户管理

1> 查看创建用户语法
   > help create user
   
2> create user test@'192.168.38.%' identified by '123456';
   创建用户test允许192.168.37网段访问,密码为123456 
   
3> 删除用户
   > drop user 'test'@'192.168.38.%';
   
4> 修改密码
   password()函数,用于加密口令
   > select password("123456");
    +-------------------------------------------+
    | password("123456")                        |
    +-------------------------------------------+
    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    +-------------------------------------------+

   > set password for root@'localhost'=password('centos');
   
5> 使用update修改密码
   > update user set password=passwprd('centos') where host='centos7.localdomain';
   > flush privilees; 生效
   
6> 修改多个用户密码
   > uodate mysql.user set password=password('centos') where user = 'root';

7> 忘记root密码解决办法
   在配置文件中添加参数
   vim /etc/my.cnf
   --skip-grant-tables   --skip-networking
   systemctl restart mysqld  #重启服务
   
   添加参数后无法使用set password 修改密码
   可以使用update修改密码
   update mysql.user set password=password('mageedu') where host='localhost';
   
   在配置文件中添加 --skip-grant-tables参数后,远程也可以使用直接登录修改密码,非常危险
    --skip-networking 参数可以关闭3306端口,禁止远程用户登录,避免此类风险
    

MySQL权限管理

权限类别:
    管理类
    程序类
    数据库级别
    表级别
    字段级别

MySQL用户和权限管理

管理类:
    CREATE TEMPORARY TABLES
    CREATE USER
    FILE
    SUPER
    SHOW DATABASES
    RELOAD
    SHUTDOWN
    REPLICATION SLAVE
    REPLICATION CLIENT
    LOCK TABLES
    PROCESS

程序类: FUNCTION、PROCEDURE、TRIGGER
    CREATE
    ALTER
    DROP
    EXCUTE

库和表级别:DATABASE、TABLE
    ALTER
    CREATE
    CREATE VIEW
    DROP
    INDEX
    SHOW VIEW
    GRANT OPTION:能将自己获得的权限转赠给其他用户

数据操作
    SELECT
    INSERT
    DELETE
    UPDATE

字段级别
    SELECT(col1,col2,...)
    UPDATE(col1,col2,...)
    INSERT(col1,col2,...)

所有权限
    ALL PRIVILEGES 或 ALL

授权

参考:https://dev.mysql.com/doc/refman/5.7/en/grant.html

GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
    1> priv_type: ALL [PRIVILEGES]
    2> object_type: TABLE | FUNCTION | PROCEDURE
    3> 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‘;


回收授权
    REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
示例:REVOKE DELETE ON testdb.* FROM 'testuser'@‘172.16.0.%’;

查看指定用户获得的授权
    Help SHOW GRANTS
    SHOW GRANTS FOR 'user'@'host';
    SHOW GRANTS FOR CURRENT_USER[()];

注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存
    (1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
    (2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;

实验: 授权

grant 的额外作用: 可以创建用户

1> 授权用户查看teachers表中的stuid和name 字段
   > grant select (tid,name) on hellodb.teacher to test@'192.168.38.%';
     授权给test@'192.168.38.%'用户查询hellodb库teacher表的tid,name字段
     
   test@'192.168.38.%' 用户只能访问(tid,name)两个字段
   > select tid,name from teachers;
   
2> 查看用户被授权的权限
   > show grants for test@'192.168.38.%';
   
3> 给用户所有权限,相当于管理员
   > grant all on *.* to test2@'192.168.38.%';
   
4> 取消授权,刷新权限
   > revoke select on *.* from test2@'192.168.38.%';
   > flush privileges;
   
5> 授权和创建用户同时进行
   > grant all on *.* to test3@'192.168.38.%' identified by '123456';
   

实验: 数据库多实例

环境: 创建对应文件夹  mkdir /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid} -pv
      yum 安装 mariadb 数据库 yum install mariadb-server
      
1> 更改mysql的所属者,所属组
   chown -R mysql.mysql /mysql/
   
2> 生成数据库
   mysql_install_db --datadir=/mysql/3306/data --user=mysql
   mysql_install_db --datadir=/mysql/3307/data --user=mysql
   mysql_install_db --datadir=/mysql/3308/data --user=mysql
   
3> 拷贝配置到对应目录,并做相应修改
   cp /etc/my.cnf /mysql/3306/etc
   修改配置文件
   vim /mysql/3306/etc/my.cnf
   添加端口
      port=3306
   数据库路径
      datadir=/mysql/3306/data
   socket文件路径
      socket=/mysql/3306/socket/mysql.sock
   日志文件路径
      log-error=/mysql/3306/log/mariadb.log
   pid文件路径
      pid-file=/mysql/3306/pid/mariadb.pid
   删除!includedir /etc/my.cnf.d
   
4> 拷贝配置文件到另外两个目录中,并做相应修改
   sed -i 's/3306/3307' /mysql/3307/etc/my.cnf
   sed -i 's/3306/3308' /mysql/3308/etc/my.cnf
   
5> 导入启动脚本mysqld到/mysql/3306/bin,并加以修改
   vim /mysql/3306/bin/mysqld
   prot=3306
   mysql_user="root"
   mysql_pwd=""
   cmd_path="/usr/bin"
   mysql_basedir="/mysql"
   
   拷贝到其他对应目录修改端口号
   
6> 添加执行权限
   chmod +x /mysql/3306/bin/mysqld
   chmod +x /mysql/3307/bin/mysqld
   chmod +x /mysql/3308/bin/mysqld
   
7> 启动服务
   /mysql/3306/bin/mysqld start 
   /mysql/3307/bin/mysqld start 
   /mysql/3308/bin/mysqld start
   
8> 查看端口状态
   ss -ntl 

9> 连接数据库,指定mysql.sock
   mysql -S /mysql/3306/socket/mysql.sock
   
10> 更改数据库口令
   mysqladmin -S  /mysql/3306/socket/mysql.sock password 123456
   
11> 设为开机启动
   vim /etc/rc.local 
   /mysql/3306/bin/mysqld start
   /mysql/3307/bin/mysqld start
   /mysql/3308/bin/mysqld start
   添加执行权限
   chmod +x /etc/rc.d/rc.local