Mysql用户的基本操作
在Linux中用户的作用
- 登录系统
- 管理系统文件
管理用户
- 1、创建用户: useradd adduser
- 2、删除用户: userdel
- 3、修改用户: usermod
Mysql用户的作用
- 登录Mysql数据库
- 管理数据库对象
Mysql用户的管理
- 创建用户: create user
- 删除用户:delete user;drop user
- 修改用户:update
Mysql用户的组成
在Mysql中的用户不是只看用户名决定的
- 用户名
- 主机域
#主机域的书写
172.16.1.%
172.16.%.%
172.%.%.%
%
172.16.1.0/255.255.255.0
172.16.1.5% //此种写法的作用如下:
172.16.1.50-59 172.16.1.5
#查询用户
select user,host from mysql.user;
#删除用户
mysql> drop user ''@'localhost';
Query OK, 0 rows affected (0.00 sec)
Mysql用户密码的管理
在5.6和5.7的版本中密码管理的方式有所区别
5.6版本
#方法一:
mysqladmin -uroot -p password '789'
#方法二: //此方式是修改当前登录的用户
set password=PASSWORD('123');
# update修改密码(配合刷新授权表)
update mysql.user set password=PASSWORD('123') where user='root' and host='localhost';
flush privileges; //(只有在修改密码时,才需要用到)
# 方法三:
grant all on *.* to root@'localhost' identified by '123';
5.7版本
#方法一:
alter user root@'localhost' identified by '123';
#方法二:
set password=PASSWORD('123');
# update修改密码(配合刷新授权表)
update mysql.user set password=PASSWORD('123') where user='root' and host='localhost';
flush privileges; //(只有在修改密码时,才需要用到)
# 方法三:
grant all on *.* to root@'localhost' identified by '123';
Mysql权限管理
#命令解读
grant all on *.* to user@'%' identified by '123';
所有权限 库.表 用户@主机域 密码
#作用对象分解
*.* [当前MySQL实例中所有库下的所有表]
wordpress.* [当前MySQL实例中wordpress库中所有表(单库级别)]
wordpress.user [当前MySQL实例中wordpress库中的user表(单表级别)]
Mysql连接配置管理
客户端连接方式
-u:指定用户
-p:指定密码
-h:指定主机域
-S:指定Socket
-P:指定端口
-e:免交互执行SQL语句
----
--protocol=name:指定连接方式
在外网被关闭的情况下怎么连接数据库呢?
不管是图形化数据库连接还是虚拟机连接,都需要先连接到被关闭外网
的数据库同网段的服务器上,如何在使用内网Ip连接数据库
Mysql的启动关闭流程
[root@db02 ~]# /etc/init.d/mysqld start
[root@db02 ~]# /app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql
# mysqld_safe --skip-grant-tables --skip-networking
#编写systemd启动脚本
[root@db02 system]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
[Service]
#Type=notify
ExecStart=/app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
启动方式:
- /etc/init.d/mysqld start
- systemctl start mysqld
- /app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql
停止方式; - /etc/init.d/mysqld stop
- systemctl stop mysqld
- mysqladmin -u[用户名] -p-[密码] shutdown
kill: - kill -9 pid
- pikill mysqld
- pikill -9 pid
- killall mysqld
Mysql配置管理
能让mysql配置文件生效的有几种方式?
- 预编译
- 配置文件(读取顺序)
- /etc/my.cnf server_id=10
- /etc/mysql/my.cnf server_id=20
- $basedir/my.cnf server_id=30
- default-extra-file
- ~/.my.cnf server_id=40
--defaults-file=/etc/my.cnf
- 命令行
问题:
以下几种方式,谁的优先级读取高
#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
配置文件优先级
- 命令行
- 配置文件
- ~/.my.cnf
- default-extra-file
- /app/mysql/my.cnf
- /etc/mysql/my.cnf
- /etc/my.cnf
- --defaults-files=/etc/my.cnf
- 预编译
配置文件中标签的作用
[mysqld] // 影响服务端的启动
[mysql] // 影响客户端的连接(mysql)
[server] // 影响服务端的启动
[client] // 影响客户端的连接(mysql、mysqladmin、mysqldump)
Mysql多实例
实例:一个进程+多个线程+一个预分配的内存结构
多实例:多个进程+多个线程+多个预分配内存结构
如何实现多实例启动?
条件一:共享一个安装目录
条件二: 数据目录不同
- 多个配置文件
- Socket
- Port
- log
- pid文件
mysql 5.6.50多实例启动示例
环境准备
#创建多实例目录
[root@db02 ~]# mkdir -p /data/330{7,8,9}/data
[root@db02 ~]# tree /data
/data
├── 3307
│ └── data
├── 3308
│ └── data
└── 3309
└── data
#准备配置文件
3307:
[root@db02 ~]# vim /data/3307/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
pid_file=/data/3307/mysql.pid
3308
[root@db02 ~]# vim /data/3308/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
pid_file=/data/3308/mysql.pid
3309
[root@db02 ~]# vim /data/3309/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
pid_file=/data/3309/mysql.pid
# 目录结构
[root@db02 ~]# tree /data/
/data/
├── 3307
│ ├── data
│ └── my.cnf
├── 3308
│ ├── data
│ └── my.cnf
└── 3309
├── data
└── my.cnf
# 多实例初始化
[root@db02 ~]# cd /app/mysql/scripts/
[root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/app/mysql --datadir=/data/3307/data
[root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --basedir=/app/mysql --datadir=/data/3308/data
[root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --basedir=/app/mysql --datadir=/data/3309/data
## 查看目录结构
[root@db02 scripts]# tree /data/ -L 2
/data/
├── 3307
│ ├── data
│ ├── my.cnf
│ └── mysql.log
├── 3308
│ ├── data
│ ├── my.cnf
│ └── mysql.log
└── 3309
├── data
├── my.cnf
└── mysql.log
## 授权
[root@db02 scripts]# chown -R mysql.mysql /data
## 多实例启动
/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
#编写启动脚本
[root@db02 system]# vim /usr/lib/systemd/system/mysql3307.service
[Unit]
Description=mysqld
[Service]
#Type=notify
ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
[root@db02 system]# systemctl daemon-reload
[root@db02 system]# systemctl start mysql3307
## 多实例创建密码
[root@db02 system]# mysqladmin -uroot -p -S /data/3307/mysql.sock password '123'
## 连接多实例
[root@db02 system]# mysql -uroot -p123 -S /data/3307/mysql.sock
#创建命令
[root@db02 system]# vim /usr/local/bin/mysql3307
mysql -uroot -p123 -S /data/3307/mysql.sock
[root@db02 system]# chmod +x /usr/local/bin/*
mysql 5.7.42多实例启动示例
环境准备
#创建多实例目录
[root@db03 ~]# mkdir -p /data/330{7,8,9}/data
[root@db03 ~]# tree /data
/data
├── 3307
│ └── data
├── 3308
│ └── data
└── 3309
└── data
#准备配置文件
3307:
[root@db03 ~]# vim /data/3307/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
pid_file=/data/3307/mysql.pid
3308
[root@db03 ~]# vim /data/3308/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log_error=/data/3308/mysql.log
pid_file=/data/3308/mysql.pid
3309
[root@db03 ~]# vim /data/3309/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log_error=/data/3309/mysql.log
pid_file=/data/3309/mysql.pid
# 目录结构
[root@db03 ~]# tree /data/
/data/
├── 3307
│ ├── data
│ └── my.cnf
├── 3308
│ ├── data
│ └── my.cnf
└── 3309
├── data
└── my.cnf
# 多实例初始化
[root@db03 ~]# cd /app/mysql/bin/
[root@db03 bin]# ./mysqld --defaults-file=/data/3307/my.cnf --basedir=/app/mysql --datadir=/data/3307/data --initialize-insecure
[root@db03 bin]# ./mysqld --defaults-file=/data/3308/my.cnf --basedir=/app/mysql --datadir=/data/3308/data --initialize-insecure
[root@db03 bin]# ./mysqld --defaults-file=/data/3309/my.cnf --basedir=/app/mysql --datadir=/data/3309/data --initialize-insecure
## 查看目录结构
[root@db03 bin]# tree /data/ -L 2
/data/
├── 3307
│ ├── data
│ ├── my.cnf
│ └── mysql.log
├── 3308
│ ├── data
│ ├── my.cnf
│ └── mysql.log
└── 3309
├── data
├── my.cnf
└── mysql.log
## 授权
[root@db03 bin]# chown -R mysql.mysql /data
## 多实例启动
/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
#编写启动脚本
[root@db03 system]# vim /usr/lib/systemd/system/mysql3307.service
[Unit]
Description=mysqld
[Service]
#Type=notify
ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
[root@db03 system]# systemctl daemon-reload
[root@db03 system]# systemctl start mysql3307
## 多实例创建密码
[root@db03 system]# mysqladmin -uroot -p -S /data/3307/mysql.sock password '123'
## 连接多实例
[root@db03 system]# mysql -uroot -p123 -S /data/3307/mysql.sock
#创建命令
[root@db03 system]# vim /usr/local/bin/mysql3307
mysql -uroot -p123 -S /data/3307/mysql.sock
[root@db03 system]# chmod +x /usr/local/bin/*
企业案例
#如果开发让你开一个用户,这时候你该怎么做?
1、先说明:
- 需要对哪些数据库、表进行操作
- 从什么网段连接过来
- 对用户名和密码有没有什么要求
2、走OA流程或者发邮件告知
3、敏感用户需要开发领导和运维领导审核批准,如root类似
在给开发或者其他人员授予数据库用户的时候,对于一些敏感数据我们可以
做脱敏操作,即不开放敏感数据权限
#授予用户 dev1 在本地主机上访问 mysql.user 表的 SELECT、UPDATE 和 INSERT 权限,并设置其登录密码为 '123'。
grant select(user,host),update,insert on mysql.user to dev1@'localhost' identified by '123';
#权限对照表
INSERT: 允许用户向表中插入新的行数据。
SELECT: 允许用户从表中检索数据,即执行查询操作。
UPDATE: 允许用户修改表中现有的数据。
DELETE: 允许用户从表中删除行数据。
CREATE: 允许用户创建新的数据库或表。
DROP: 允许用户删除数据库或表。
RELOAD: 允许用户重新加载服务器配置或刷新缓存。
SHUTDOWN: 允许用户关闭 MySQL 服务器。
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: 允许用户创建和管理表空间。
练习
一、
#创建wordpress数据库
create database wordpress;
#使用wordpress库
use wordpress;
#创建t1、t2表
create table t1 (id int);
create table t2 (id int);
#创建blog库
create database blog;
#使用blog库
use blog;
#创建t1表
create table tb1 (id int);
#授权
1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;
2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;
3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;
#问
一个客户端程序使用wordpress用户登陆到10.0.0.51的MySQL后,
- 1、对t1表的管理能力?
- 2、对t2表的管理能力?
- 3、对tb1表的管理能力?
解:
- 1、同时满足1,2,3,最终权限是1+2+3
- 2、同时满足了1和2两个授权,最终权限是1+2
- 3、只满足1授权,所以只能select
结论:
- 1、如果在不同级别都包含某个表的管理能力时,权限是相加关系。
- 2、但是我们不推荐在多级别定义重复权限。
- 3、最常用的权限设定方式是单库级别授权,即:wordpress.*