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的启动关闭流程

Img

[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配置管理

Img
能让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多实例

实例:一个进程+多个线程+一个预分配的内存结构
多实例:多个进程+多个线程+多个预分配内存结构
Img
如何实现多实例启动?
条件一:共享一个安装目录
条件二: 数据目录不同

  • 多个配置文件
    • 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.*