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)我还有很多问题需要在我启动之前告诉我?

- 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.配置文件读取顺序

配置文件读取顺序优先级:
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
- /application/mysql/tmp/ mysql.sock
- /tmp/mysql.sock
- /opt/mysql.sock
- /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这一个命令的

浙公网安备 33010602011771号