1. 数据库用户权限管理

show privileges;

Privilege -- 数据库所有权限

Context -- 权限控制的对象

Comment -- 对权限解释说明

Alter | Tables 表 | To alter the table 修改表信息(属性信息-结构 字符集 引擎索引 数据类型)

Create | Databases,Tables,Indexes 库 表 索引 | To create new databases and tables 可以拥有创建新库 新表 - 表中索引创建

Create user | Server Admin 具有服务管理能力 | To create new users 创建新用户

Delete | Tables 表 | To delete existing rows 删除表数据信息利

Drop | Databases,Tables 库 表 | To drop databases, tables, and views删除数据库 删除表 删除视图???

Index | Tables 表 | To create or drop indexes 在表中可以创建或删除索引信息

Insert | Tables 表 | To insert data into tables 插入/添加表数据信息权利

Select | Tables 表 | To retrieve rows from table 查看表中数据权限

Show databases | Server Admin 具有服务管理能力 | To see all databases with SHOW DATABASES 可以查看所有数据库信息

Update | Tables 表 | To update existing rows 修改表数据信息权利

Usage | Server Admin 具有服务管理能力 | No privileges - allow connect only 数据库服务登录权利(默认权限)

Grant option | Databases,Tables,Functions,Procedures 库 表 函数 存储过程| To give to other users those privileges you possess 可以给别人进行授权的权利

对于网站业务管理数据库需要的权利:select insert update delete (增删改查 -- CRUD)

1.1 权限设置语句

grant priv_type(权限信息)  ON 权限管理对象(库 表 -- *.*) to 用户信息(用户名@'白名单信息'); 


grant Create  on *.* to xiaoA@'10.0.0.54';
-- xiaoA用户登录数据库后,可以具有创建任意数据库,任意数据表的权限;
grant Create  on oldboy.* to xiaoB@'10.0.0.54';
-- xiaoB用户登录数据库后,只具有创建oldboy数据权限,但是可以在oldboy数据库中创建任意表
grant Create  on oldboy.t1 to xiaoC@'10.0.0.54';
-- xiaoC用户登录数据库后,只具有创建oldboy数据权限,只能在oldboy数据库中创建t1表

grant Show databases on *.* to xiaoB@'10.0.0.54';

1.2 mysql中三个特殊权限

all privileges -- 设置所有权限
mysql> create user oldboy@'10.0.0.%' identified by '123';
mysql> grant all on *.* to oldboy@'10.0.0.%';

grant option   -- 设置给别的用户设置权限的权限
grant Grant option on *.* to oldboy@'localhost';
grant all on *.* to oldboy@'10.0.0.%' with grant option;

Usage          -- 数据库服务登录权利(默认权限)

1.3查看权限语句

方式一:执行show grants 命令查看权限
show grants for xiaoD@'%';

方式二:获取授权表信息--获取权限(了解)
user           :全局授权信息  授权对象是所有库所有表
db             :局部授权信息  授权对象是指定的数据库
tables_priv    :局部授权信息  授权对象是指定的数据表

1.4 收回权限

revoke 回收的权限 on 回收权限对象(库名.表名)from 用户信息(用户名@'白名单信息');
mysql> revoke select on *.* from test01@'%';
Query OK, 0 rows affected (0.00 sec)

2. 数据库远程连接管理

2.1 本地连接

  • 需要设置好套接字文件信息
mysql -uroot -p123  -S 套接字文件信息(/tmp/mysql.sock)

2.2 远程连接

  • 需要设置好TCP(端口)/IP(地址)信息
mysql -uroot -p123  -h10.0.0.51 -P3308

数据库服务进行本地连接是有局限性--RDS(系统环境)

2.3 三种实现远程登录方式:

2.3.1 基于MySQL程序的客户端命令

mysql -- 用于连接登录数据库

mysqladmin -- 用于远程管理数据库(设置密码 管理服务运行状态)

mysqldump -- 用于远程备份数据库

mysql/mysqladmin/mysqldump -u用户信息 -p密码信息 -h数据库服务地址 -P端口信息

2.3.2 基于第三方的数据库远程工具

dbeaver -- 官方链接:https://dbeaver.io/ 免费

workbench -- 官方链接: https://www.mysql.com 免费

navicat -- 官方链接:https://www.navicat.com 付费--破解版

sqlyog -- 官方链接:https://webyog.com/product/sqlyog/ 付费

利用sqlyog连接报错,连接失败:

原因:因为连接的数据库服务是MySQL 8.0 最新版本数据库

  最新版本数据库密码加密方式变更了

早期版本:密码加密方式-- mysql_native_password -- 密文信息容易被破解(弱口令密码)

最新版本:密码加密方式-- caching_sha2_password

客户端 服务端

连接时--用户名(明文比较) 密码(密文) 用户信息 密码信息(密文)

加密方式--mysql_native_password caching_sha2_password

加密方式--caching_sha2_password mysql_native_password

修改加密方式:

select user,host,authentication_string,plugin from mysql.user\G                 --- 查看用户信息和用户密码,以及加密方式
alter user root@'10.0.0.%' identified with mysql_native_password by '123456';   --- 修改密码加密方式

2.3.3利用连接驱动程序配合程序语言代码 (偏开发-了解--数据库编程)

| 01 | python | 连接数据库驱动-pymysql |
| 02 | golang | 连接数据库驱动-gomysql |
| 03 | java | 连接数据库驱动-jar |
| 04 | php | 连接数据库驱动-phpmysql |

2.4 数据库服务无法进行远程连接,需要进行排查错误

步骤一:确认网络连通性

ping 数据库服务器地址 / telnet/nc/nmap 数据库服务器端口

PS:确认网络硬件设备配置 路由器 交换机 防火墙

步骤二:确认服务端配置

是否创建了用户信息和密码信息 白名单信息是否正确

select user,host from mysql.user; xiaoQ

步骤三:确认客户端配置

用户信息 密码信息(密码的加密方式)-h服务端地址 -P服务端端口

3. 数据库服务配置管理

3.1 数据库配置文件加载方式

3.1.1加载配置文件路径信息

/etc/my.cnf -> /etc/mysql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf

3.1.2手工指定加载配置信息

mysqld_safe --defaults-file=/data/xiaoQ.cnf &
mysqld --defaults-file=/data/xiaoQ.cnf  &
mysql  --defaults-file=/data/xiaoQ.cnf 

3.2 数据库配置文件编写方法

3.2.1 客户端标签

[mysql] [mysqladmin] [mysqldump]    [client]--全局标签
标签下面会配置客户端的配置信息,可以简化客户端命令参数操作,可以和服务端建立连接

[mysql]
socket=/tmp/mysql.sock

mysql --help      -- 显示所有的客户端标签配置项
mysqladmin --help -- 显示所有的客户端标签配置项
mysqldump  --help -- 显示所有的客户端标签配置项

3.2.2 服务端标签

[mysqld] [mysqld_safe]              [server]--全局标签
标签下面会配置客户端的配置信息,可以永久激活服务端某些功能

[mysqld]
user=mysql                 --- 指定数据库服务进程用户
basedir=/usr/local/mysql   --- 加载的程序目录信息  (和升级数据库服务有关)      
datadir=/data/3306/data    --- 加载数据库数据目录  (重新加载备份信息)
socket=/tmp/mysql.sock     --- 实现数据库本地连接
port=3307                  --- 修改数据库服务默认端口
super_read_only=on         --- 设置管理员管理数据库只读操作    mysqld_safe --user=mysql --basedir=
read_only=on

mysqld --help --verbose

3.3 socket信息

客户端和服务端建立本地连接,需要配合正确socket信息

方式一:客户端连接指定-S信息
mysql -uroot -pxiaoQ123 -S /tmp/mysql01.sock

[mysql]
socket=/tmp/mysql01.sock

4. 数据库服务实例应用

4.1 什么是数据库实例

功能应用方面:在一个系统环境中,运行启动多个数据库服务的进程

资源利用方面:一个程序运行之后,程序运行的后的进程以及程序加载数据信息独占内存资源

MySQL实例 = mysqld + master thread监控管理 + 具体干活的thread + 预分配的内存结构

构建多实例功能:

1)可以节省硬件成本

2)可以保证服务稳定

3)可以便于监控管理

4.2 如何搭建数据库多实例

4.2.1 下载数据库服务程序

mysql 8.0  mysql-8.0.32-linux-glibc2.12-x86_64.tar.gz
mysql 5.7  mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
mysql 5.6  mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz

4.2.2 安装数据库服务程序

mysql 8.0 省略
mysql 5.7 
tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz 
ln -s mysql-5.7.30-linux-glibc2.12-x86_64 mysql57

mysql 5.6
tar xf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz
ln -s mysql-5.6.48-linux-glibc2.12-x86_64 mysql56

4.2.3 构建多实例环境(4不同-数据目录 配置文件 端口 socket)创建不同的存储目录

mkdir -p /data/3306/data && chown mysql.mysql /data/3306/data
mkdir -p /data/3357/data && chown mysql.mysql /data/3357/data
mkdir -p /data/3356/data && chown mysql.mysql /data/3356/data
或者
mkdir /data/3380/data /data/3357/data /data/3356/data -p
chown -R mysql.mysql /data



创建不同的配置文件,配置文件中端口不同 socket信息不同
cat >>/data/3380/my.cnf<<EOF
[client]
socket=/tmp/mysql.sock
[mysqld]
port=3380
user=mysql
basedir=/usr/local/mysql
datadir=/data/3380/data
socket=/tmp/mysql.sock
EOF

cat >>/data/3357/my.cnf<<EOF
[mysqld]
port=3357
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3357/data
socket=/tmp/mysql57.sock
EOF

cat >>/data/3356/my.cnf<<EOF
[mysqld]
port=3356
user=mysql
basedir=/usr/local/mysql56
datadir=/data/3356/data
socket=/tmp/mysql56.sock
EOF

4.2.4 进行数据库服务初始化过程

mv /etc/my.cnf /tmp/
mysqld --initialize-insecure --user=mysql --datadir=/data/3380/data --basedir=/usr/local/mysql 
/usr/local/mysql57/bin/mysqld  --initialize-insecure --user=mysql --datadir=/data/3357/data --basedir=/usr/local/mysql57 
/usr/local/mysql56/scripts/mysql_install_db --user=mysql --datadir=/data/3356/data --basedir=/usr/local/mysql56

4.2.5 启动多实例环境数据库服务

命令方式启动:mysqld mysqld_safe systemctl 
mysqld --defaults-file=/data/3380/my.cnf &
/usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf &
/usr/local/mysql56/bin/mysqld --defaults-file=/data/3356/my.cnf &
systemctl  start  mysql80  
systemctl  start  mysql57 
systemctl  start  mysql56


cat >>/etc/systemd/system/mysql80.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3380/my.cnf
LimitNOFILE=5000
EOF

cat >>/etc/systemd/system/mysql57.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf
LimitNOFILE=5000
EOF

cat >>/etc/systemd/system/mysql56.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql56/bin/mysqld --defaults-file=/data/3356/my.cnf
LimitNOFILE=5000
EOF

[root@db-01 local]# systemctl daemon-reload
[root@db-01 local]# systemctl start mysql80
[root@db-01 local]# systemctl start mysql57
[root@db-01 local]# systemctl start mysql56
[root@db-01 local]# netstat -lntup|grep mysql

4.2.6 多实例本地连接登录

mysql -uroot -S /tmp/mysql.sock
mysql -uroot -S /tmp/mysql57.sock
mysql -uroot -S /tmp/mysql56.sock

远程连接登录
mysql -uroot -p -h10.0.0.51 -P3306
mysql -uroot -p -h10.0.0.51 -P3357
mysql -uroot -p -h10.0.0.51 -P3356

5. 数据库服务语句分类

SQL语句 - 英文全称为Structured Query Language,中文意思是结构化查询语言(属于编程语言);

在使用SQL语句时,也会用到几种常用的标准:SQL 89 SQL 92(命令语法过于繁琐,不便于阅读) SQL 99 (命令语法简洁 便于阅读)

5.1 DDL Data Definition Language 数据定义语言

慎用-损坏数据 影响业务

5.1.1 概念

负责管理数据库的基础数据(不会对表的内容修改),比如增删库、增删表、增删索引、增删用户等;

###5.1.2 涉及语句

CREATE(创建)、ALTER(修改)、DROP(删除)`等;

5.2 DCL Data Control Language 数据控制语言

5.2.1 概念

主要用来定义访问权限和安全级别

5.2.2 涉及语句

`GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚)

5.3 DML Data Manipulation Language 数据操作语言

慎用-数据损坏-备份信息做恢复

5.3.1概念

主要针对数据库里的表里的数据进行操作,用来定义数据库记录(数据);

5.3.2 涉及语句

`SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改)`

5.4 DQL Data Query Language 数据查询语言

5.4.1 概念

主要用来查询记录(数据)

5.4.2 涉及语句

SELECT(查)数据库变量查询  数据库函数信息  数据库表信息查看(单表信息查看  连表信息查看  子查询/嵌套查看) 数据库服务元数据信息查看
基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块

#6. 数据库服务字符设置(了解)

6.1 设置字符集作用

避免表中中文数据出现乱码(5.6 5.7)

6.2 设置修改字符集

永久修改:
vim /etc/my.cnf 
[mysqld]
character-set-server=utf8mb4    -- 修改旧版本数据库服务(5.7 5.6 5.5 8.0)
[mysql]
default-character-set=utf8mb4   -- 修改新版本数据库服务(8.0)

临时修改:
set global character_set_server='utf8mb3'  -- 临时修改

6.3 已经出现乱码信息,如何处理

6.3.1 步骤一:需要进行数据库备份(逻辑备份)

mysqldump

6.3.2 步骤二:将数据库字符集进行修改

永久修改/临时修改

6.3.3 步骤三:需要删除库或者表信息

6.3.4 步骤四:创建数据库或者数据表

6.3.5 步骤五:恢复迁移数据

utf8mb3:最多存储3字节长度字符 张-3字节 name -- 老 -- 3字节 24bit 000000000000000000000010 男

utf8mb4:最多存储4字节长度字符(表情字符emoji) 张-4字节 老 4字节 32bit