MySQL的权限管理

MySQL的权限管理

命令   所有权限       所有库.所有表(作用对象)        用户名@'主机域'          密码
grant all       on     *.*     to              root@'%' identified by '123';

#这么创建在生产中不太行 权限太大了  走一下人事流程吧

一、如何给开发授权?

#增删改查
grant select,insert,delete,update on 业务库.* to dev@'%' identified by 'xxx';


INSERT,SELECT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN,  PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

#最小权限
grant select on 业务库.表名 to dev@'192.168.1.1' identified by 'xxx';
grant select on 业务库.表名 to dev@'192.168.1.1' identified by 'xxx';

脱敏:脱离敏感信息

单库级别:库.*
单表级别:库.表
单列级别:select(列名字)  update(列名字)

开发人员说请给我开一个用户?

开发:你把root用户给我呗?

你:????? 你咋不让我帮你删个根呢?

#给你开一个小用户
grant select on 业务库.表名 to dev@'192.168.1.1' identified by 'xxx';

1.看哪个库?哪个表?

2.你要干什么?  增删改查?

3.你在哪里操作?(主机域)

4.有没有指定的用户和密码?

5.发邮件,走流程

二、思考问题

mysql> create database wordpress;

mysql> create table t1 (id int);

mysql> create table t2 (id int);

mysql> create database blog;

mysql> create table tb1 (id int);

1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;
#授权给wordpress@'10.0.0.5%'用户针对所有库所有表,查看的权限,密码是123

2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;
#授权给wordpress@'10.0.0.5%'用户针对wordpress库下的所有表,增,删,改权限,密码是123

3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;
#授权给wordpress@'10.0.0.5%'用户针对wordpress库下的t1表,所有权限,密码是123

一个客户端程序使用wordpress用户登陆到10.0.0.51的MySQL后,

  • 1、对t1表的管理能力?
    • all 1+2+3
  • 2、对t2表的管理能力?
    • 1.select insert delete update 1+2
  • 3、对tb1表的管理能力?
    • select 1

总结

1、如果在不同级别都包含某个表的管理能力时,权限是相加关系。

2、但是我们不推荐在多级别定义重复权限。

3、最常用的权限设定方式是单库级别授权,即:wordpress.*

三、MySQL连接管理工具

1).mysql

-u:指定用户

-p:指定密码

-P:指定端口

-h:指定主机域

-S:指定socket文件

-e:指定SQL语句

2)第三方客户端

navicat sqlyog

连接navicat

1.创建一个远程连接用户

[root@db01 ~]# mysql
mysql> grant all on *.* to root@'%' identified by '123';

2.连接navicat

3.没有外网ip时怎么连

直接连接就无法连接上了

但是可以通过企业负载均衡的服务器走外网

# 0.在负载均衡上装一个mysql的客户端
yum install mriadb -y

# 1.远程连接不上 开放一下防火墙
[root@db01 ~]# systemctl start firewalld
[root@db01 ~]# firewall-cmd --list-all  查看防火墙的规则
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh dhcpv6-client   #并没有mysql
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 2.添加mysql
[root@db01 ~]# firewall-cmd --add-service=mysql
success
[root@db01 ~]# firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh dhcpv6-client mysql
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

四、MySQL启动关闭流程

#启动方式
/etc/init.d/mysqld start
service mysqld start
systemctl start mysqld
mysqld_safe &          #没做多实例 所以不用指定文件 默认就去/etc/my.cnf下去找了

#停止方式
/etc/init.d/mysqld stop
service mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown

#千万不要用
kill
kill -9
pkill
killall
会宕机的

五、MySQL实例初始化配置

1.初始化配置文件的作用

场景:我要启动实例

问题:
1)我不知道我的程序在哪?
2)我也不知道我将来启动后去哪找数据库?
3)将来我启动的时候启动信息和错误信息放在哪?
4)我启动的时候sock文件pid文件放在哪?
5)我启动,你们给了我多少内存?
...
N)我还有很多问题需要在我启动之前告诉我?

img

  • 1)预编译:cmake去指定,硬编码到程序当中去
  • 2)在命令行设定启动初始化配置
--skip-grant-tables 
--skip-networking
--datadir=/application/mysql/data
--basedir=/application/mysql
--defaults-file=/etc/my,cnf
--pid-file=/application/mysql/data/db01.pid
--socket=/application/mysql/data/mysql.sock
--user=mysql
--port=3306
--log-error=/application/mysql/data/db01.err

  • 3)初始化配置文件(/etc/my.cnf)

2.这三个的优先级证明

配置文件优先级比cmake高的证明

` 1.修改一下配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
socket=/tmp/mysql.sock

`2.源码安装启动文件在:
[root@db01 /application/mysql/tmp]# ll
total 0
srwxrwxrwx 1 mysql mysql 0 Nov 27 17:03 mysql.sock

`3.重启一下mysql
[root@db01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL... SUCCESS! 
Starting MySQL........... SUCCESS! 

`4.连接mysql
[root@db01 ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/application/mysql-5.6.40/tmp/mysql.sock' (2)

[root@db01 ~]# ll /tmp  启动文件从/application/mysql/tmp下跑到/tmp下了
srwxrwxrwx 1 mysql mysql 0 Nov 28 19:51 mysql.sock

[root@db01 ~]# mysql -S /tmp/mysql.sock    指定路径登录成功
mysql> 

命令行优先级比配置文件高的证明

`0.修改一下配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
socket=/tmp/mysql.sock

`1.停mysql服务
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 


`2.用mysql_safe & 登录
[root@db01 ~]# ll /tmp
srwxrwxrwx 1 mysql mysql 0 Nov 28 19:51 mysql.sock
#启动文件从/application/mysql/tmp下跑到/tmp下了 因为mysql_safe &默认读/etc/my.cnf下的配置文件
[root@db01 ~]# mysqladmin -S /tmp/mysql.sock shutdown


`3.用mysql_safe 指定路径登录
[root@db01 ~]# mysqld_safe --socket=/opt/mysql.sock &
#服务死了
#但是死的漂亮
[root@db01 ~]# chown mysql.mysql /opt/
[root@db01 ~]# mysqld_safe --socket=/opt/mysql.sock &
#给个权限就起来了
[root@db01 ~]# ll /opt/
srwxrwxrwx 1 mysql mysql 0 Nov 28 20:05 mysql.sock
#文件跑/opt/下面来了

3.配置文件读取顺序

img

配置文件读取顺序优先级:

1.--defaults-file

2.~/.my.cnf

3.defaults-extra-file (类似nginx里的include)

4.$basedir/my.cnf

5./etc/mysql/my.cnf

6./etc/my.cnf

对优先级的证明

`1.环境准备下这几个配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
socket=/tmp/mysql.sock
server_id=1

[root@db01 ~]# mkdir /etc/mysql
[root@db01 ~]# vim /etc/mysql/my.cnf
[mysqld]
server_id=2

[root@db01 ~]# vim /application/mysql/my.cnf
[mysqld]
server_id=3

[root@db01 ~]# vim ~/.my.cnf
[mysqld]
server_id=4


`2.启动mysql 查看server_id
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL............... SUCCESS! 
[root@db01 ~]# mysql -S /tmp/mysql.sock 
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 4     |
+---------------+-------+
1 row in set (0.03 sec)
# server_id是4  没错你没看错 是4
#虽然是指定/tmp/mysql.sock在/etc/my.cnf的配置中  但是读取文件一层一层之后数据会被覆盖


`3.删掉个配置文件试试
[root@db01 ~]# rm -f ~/.my.cnf 
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL... SUCCESS! 
[root@db01 ~]# mysql -S /tmp/mysql.sock 
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+
1 row in set (0.00 sec)

`1.要不再删除个试试?
[root@db01 ~]# rm -f /application/mysql/my.cnf 
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@db01 ~]# systemctl start mysqld
[root@db01 ~]# mysql -S /tmp/mysql.sock 
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.00 sec)
# 变成1了 你没看错 变成1了!!!!!

`2.要不重新试试?
[root@db01 ~]# pkill mysqld
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@db01 ~]# mysql -S /tmp/mysql.sock 
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.00 sec)
# 变成2了! 他又变成了2!!!!

其实是启动方式的问题

/etc/init.d/mysqld start  #是按照上面的顺序来的

[root@db01 ~]# mysqld_safe --defaults-file=/etc/my.cnf &
[root@db01 ~]# mysql -S /tmp/mysql.sock 
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)


#在安装过程中 我们写了一个脚本-----使用systemd管理MySQL
[root@db01 ~]# vim /usr/lib/systemd/system/mysqld.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf  #这里指定了配置文件
LimitNOFILE = 5000
#所以用systemd管理时 他只读配置文件 后面的一律不读 

4.思考问题

#cmake:
socket=/application/mysql/tmp/mysql.sock
#命令行:
--socket=/tmp/mysql.sock
#配置文件:
/etc/my.cnf中[mysqld]标签下:socket=/opt/mysql.sock
#default参数:
--defaults-file=/tmp/a.txt配置文件中[mysqld]标签下:socket=/tmp/test.sock

  1. /application/mysql/tmp/ mysql.sock
  2. /tmp/mysql.sock
  3. /opt/mysql.sock
  4. /tmp/test.sock

最终是在:/tmp/mysql.sock

优先级总结:

1.命令行

2.--defaults-file

3.配置文件(~/.my.cnf ---- defaults-extra-file ---- basedir/my.cnf ---- /etc/mysql/my.cnf ---- /etc/my.cnf)

4.cmake

5.MySQL的配置文件的作用

1.影响服务端的启动

这个上面已经介绍过了

2.影响客户端的连接

vim /etc/my.cnf
[mysqld]
user=root
password=123
socket=/opt/mysql.sock

#本来需要这样登录:mysql -uroot -p123 -S /opt/mysql.sock
#配置完后登录:mysql
#不需要重启(客户端不需要重启 服务端需要重启)

#但是导出导入数据库的时候:mysqldump -A >/tmp/a.txt  失败
#mysqldump -S /opt/mysql.sock -A >/tmp/a.txt 失败
#mysqldump -uroot -p123 -S /opt/mysql.sock -A >/tmp/a.txt 成功

配置文件写法

vim /etc/my.cnf
[server]
skip_name_resolve
server_id=1
socket=/opt/mysql.sock

[client]
user=root
password=123
socket=/opt/mysql.sock

#这么写配置就没问题了  

[server]和[mysqld]不一样

[client]\和[mysql][mysqldump][mysqladmin]不一样

client包含所有命令 而mysql什么的只针对mysql这一个命令的

posted @ 2019-11-29 08:15  干瘪的柠檬  阅读(265)  评论(0)    收藏  举报