在平常的生活中,大家有没有这种感觉,当我们的文档或者数据越来多时,是不是感觉管理起来特别特别的麻烦?我是遇到过这样的问题,不过有前人的开拓,帮我们解决了这个问题,那就是数据库。给你举个例子你就马上懂了。你有没有看过阿里巴巴的天猫超时,他们就是将每一个货物分类,恒行中列,然后集中管理,这样就大大提高了工作效率。在linux中比较流行的mysql、mariadb、oracle等数据库。那么久进入我们的主体吧。

一、数据库

1、数据库的概念

数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库;它以一定的组织形式存于存储介质上。

2、数据库管理系统(Database Management System)

一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。 <摘自:百度>

3、数据库管理系统与文件管理系统对比

编写应用程序不方便编写应用程序方便,好管理
数据冗余不可避免较少的数据冗余
应用程序依赖性程序与数据相互独立
不支持对文件并发访问数据可以被并发访问;并保证一致性
数据之间联系弱相互关联的数据集合
难以按用户要求使用视图表示可以按用户的需求使用视图表示
无安全控制功能可以保证数据的安全性、可靠性

4、数据库的种类

(1)非关系型数据库
(2)关系型数据库(RDBM)

创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。标准数据查询语言SQL就是一种基于关系数据库的语言。这种语言执行对关系数据中数据的检索和操作。关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。

  • 数据结构 包括两类:一类是与数据类型、内容和性质有关的对象,比如关系型中的域、属性和关系等;另一类是与数据之间有关的对象,它从数据组织层表达数据记录于字段的结构。

  • 数据的操作集合 数据提取,在数据集合中提取感兴趣的内容。(SELECT);数据更新,更改数据库中的数据(INSERT、DELETE和UPDATE)。

  • 数据完整性约束 是一组完整性规则的集合。如实体完整性(Entity Integrity)、域完整性(Doamin Integrity)和参考完整性(Referential Integrity)。

(a)关系实体模型(Entity-Relationship Model,E-R Model)

ER_Diagram_MMORPG.png

注:

  • 矩形代表实体

  • 椭圆代表关系

  • 菱形代表关系

实体表示一个离散对象。客观存在并可以相互区分的客观事物或抽象时间被称为实体(Entity);每个实体必须有一个唯一表示的最小化集合。这个集合叫实体的主键。

关系 描述了两个或多个实体之间是如何关联。如有关两个实体 Erd-entity-relationship-example1.png

(b)构建数据库步骤

①收集数据,得到字段

②字段分类,归入表并建立表的关联

③规范化数据库

(c)关系型数据库正规化

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为范式。各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF) a.jpg

  • 1NF:无重复的列,每一列都是不可分割的基本数据项;同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。除去同类型的字段,简言之:无重复的列。

  • 2NF:要求实体的属性完全依赖于关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在这个属性和主关键字的这一部分应该分离出来形成一个新的实体。新实体与原来实体之间是一对多关系。为实现区分通常需要为表加上一个列,以存储各个实体的唯一标识(primary key)。简言之,非主属性分非部分依赖于主关键字。

  • 3NF:属性不依赖于其他非主属性。简言之,要求一个数据库不包含已在其他表中已包含的非主关键字信息。非PK(primary key)的字段不能有从属关系。

注意:不过这个不是必要遵守的,有时候在生产中,为了提升效能,刻意而为之。

二、SQL

1、概念

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。 结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

2、RDBMS术语

  • 数据库:数据库是一些关联表的集合。

  • 数据表:表示数据的矩阵。在一个数据库中的表开起来像一个简单的电子表格。

  • 列(column):一列包含了相同的数据,又称为属性,字段。

  • 行(row):是一组相关的数据,又称为一条记录record。

  • 域(domain):属性的取值范围。

  • 主键(Primary Key):一个或多个字段的组合,填入的数据必须能在本表中唯一表示本行;必须提供数据,即NOT NULL。一个表中有且只有一个主键

  • 唯一键:一个或多个字段的组合,填入的数据必须能在本表中唯一表示本行;允许为NULL。一个表中可以存在多个。

  • 外键(foreign key):一个表中的某字段可填入的数据取决于另一个表中的主键或唯一键已有的数据。即用于关联两个表。

  • 检查(check):字段在一定范围内。

  • 索引:将表中的一个或多个字段中的数据复制一份另存,并且这些需要按特定次序排序存储。相当于我们一个书前面的目录作用。

  • 复合件:两个或多个字段组成,相当于主键的作用。 Relational_model_concepts.png

SQL处理过程 2017-09-24_210233.png

3数据表类型

数值型

类型大小(字节)范围(有符号)范围(UNSIGNED)用途
TINYINT1-128,1270,255小整数值
SMALLINT2-32768,32767大整数值
MEDINUMINT3-8388608,83886070,16777215大整数值
INT或INTEGER4-2^4,2^4-10,2^4*2大整数值
BIGINT8-2^8,2^8-10,2^8*2极大整数值
FLOAT(m,d)4

单精度,浮点数值
DOUBLE(m,d)8

多精度浮点数值
DECIMAL


小数值

DECIMAL的解释:Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。

日期和时间类型

类型大小(字节)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59/838:59:59HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份
DATETIME8
YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2037年某时YYYYMMDDHHMMSS时间戳

若一个字段定义为timestamp,这个字段的时间数据随其他字段修改的时候自动更新,这个数据的字段可以存放这条记录最后被修改的时间。

字符串类型

类型大小(字节)用途
CHAR0-255定长字符串
VARCHAR0-65535变长字符串
TINYBLOB0-255不超过255个字符的二进制字符串
TINYTEXT0-255短文本字符串,可变长度
BLOB(binary large object0-65535二进制形式的长文本数据,可变长度
TEXT0-65535场文本数据可变长度
MEDIUMBLOB0,2^24-1二进制中等长度文本数据,可变长度
BINARY(M)0,M固定长度,可存二进制或字符,
VARBINARY(M)0,M可变长度,可存二进制或字符

char和varchar区别

  • char(n)若存入字符数小于n,则以空格补充其后,查询之时再将空格去掉。所以char类型存储的字符末尾不能有空格。

  • char(n)固定长度,不管存入几个字符,都将占用n个字节;varchar(n)是存入的实际字符数+1个字节。真正存入的数据位实际字节-1。会使用1-2个字节来存储值长度。 -char类型的字符串检索速度比varchar速度快

varchar和text区别

  • varchar可指定n,text不能指定n;内部存储varchar是存入的实际字节数+1个字节,text是实际字节数+2的字节。

  • text类型不能有默认值

  • varchar可直接创建索引;text创建索引要指定前多少个字符。varchar查询速度比text快。

BOLB与TEXT区别

  • TEXT以文本方式存储,英文存储区分大小写;而BLOB是以二进制方式存储,不分大小写。

  • BLOB存储的数据只能整体读出。

  • TEXT可以指定字符集;BLOB不用指定字符集。

如何正确的数据类型?

①尽量使用可正确存储数据的最小数据类型

②简单数据类型的操作通常需要更少的CPU周期

③尽量避免NULL,包含NULL的列对MySQL更难优化

修饰符类型

类型解释
NULL
NOT NULL确保不能有NULL值
DEFAULT提供未指定时为列的默认值
PRIMARY KEY唯一表示数据库表中的每一行
FOREIGN KEY唯一表示热河其他数据库表中的行
UNIQUE KEY确保在一列中所有的值是唯一的
CHARACTER SET name指定一个字符集
ATUO_INCREMENT自动递增,适用于整数类型
UNSIGNED无符号
CHECK确保列中的所有值满足一定的条件

删除约束的方法 ALTER TABLE column_name DROP CONSTRAINT PK;

4 SQL通配符

通配符描述
%替代一个或多个字符
_仅替代一个字符
[]中括号中任意单一字符
[^]或[!]除中括号中任意单一字符

注意:SQL通配符必须跟LIKE运算符一起使用

5、 SQL算数运算符

运算符描述
+加法
-减法
*乘法
/除法
%取模,相当于取余数

6、SQL比较运算符

=、!=、 <>、 >、 <、 >=、 <=、 !<、 !>

7、SQL逻辑运算符

操作符描述
ALL用来在另一个值设定比较值的所有值
AND运行多个条件在SQL语句中,存在WHERE子句中
ANY用于根据条件在列表中的值进行标胶的任何应用值
BETWEEN...AND用于搜索是在一组的那个值,给定最小值和最大值
EXISTS用于搜索中指定的表,以满足某些标准的存在
IN用于一个值进行比较,以已被指定的文字值的列表
LIKE用来标胶使用通配符运算符相似的值
NOT取反
OR用来多个条件子句结合起来的SQL语句
IS NULL用来比较一个NULL的值
UNIQUE搜索指定表的每一行的唯一性

8、SQL Alias

格式:SELECT column_names FROM table_name AS alias_name

9、SQL表达式

  • SQL 布尔表达式

语法:SELECT column_name1 column_name2 column_name3 FROM table_name WHERER SINGLE VALUE MATCHTING EXPRESSION;

  • SQL 数字表达式

语法:SELECT numerical_expression as OPERATION_NAME [FROM table_name WHERE CONDITION];

  • SQL 日期表达式

SELECT CURRENT_TIMESTAMP; #显示当前系统的时间值

SELECT GETDATE(); #显示时间

10、SQL 索引

索引是数据库的搜索引擎使用,以加快数据检索特定的查找表,是一个指向表中的数据。相当于一本书的目录,便于快速查找,对数据没有影响。缺点:如果UPDATE和INSERT会减慢数据的输入。

注意:索引是唯一的,索引防止在列或者有一个索引重复条目。

语法:CREATE INDEX index_name ON table_name;

  • 单列索引:是一个基于只有创建表列。

语法:CREATE INDEX index_name ON table_name (colum_name);

  • 唯一索引:不仅用于性能,而且要求数据的完整性。

语法:CREATE UNIQUE INDEX index_name ON table_name (column_name);

  • 组合索引:两个或多个索引

语法:CREATE INDEX index_name ON table_name (column_name1,column_name2..);

11、SQL视图

SQL视图(View)是SQL语句结果集的可视化表。视图中的字段是来自一个或多个数据库中真实表中的字段。

注意:数据库的设计不会受到视图中的函数、where或join语句的影响。

语法:CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE [CONDITION];

WHIT CHECK OPTION 是CREATE VIEW 语句选项。目的是为了确保所有更新和插入满足视图定义的条件。

示例:CREATE VIEW testView AS SELECT name,age FROM testtable WHERE age IS NOT NULL WITH CHECK OPTION; #WITH CHECK OPTION 拒绝任何age为NULL值的行。

那么是不是这样我们就可以随便更新视图了呢?那可不一定哦,更新视图是有一定条件的:

  • SELECT子句不包含关键字DISTINCT.

  • SELECT子句不包含汇总函数。

  • SELECT子句不包含集合函数。

  • SELECT子句不能包含集合运算符

  • SELECT子句不能包含一个ORDER BY 子句。

  • FROM子句中不能包含多个表。

  • WHERE子句中不能包含子查询。

  • 查询不包含GROUP BY 或HAVING.

  • 计算列无法更新

  • 从基表中的所有NOT NULL 列必须包含在视图。

看看是不是不是随便能更新视图能。好忧伤。。。

示例:UPDATE testView SET age = 20 WHERE name 'xiaomian' ;

12、SQL排序

语法:SELECT column-list FROM table_name [WHERE CONDITION] [ORDER BY column1,column2..][ASC|DESC];

13SQL约束

事物就是对数据库执行的工作单元。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

事物的特性 事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

  • 事务的原子性:确保工作单元中的所有操作都成功完成。否则,该事物被终止的故障点,操作回滚到操作之前的状态。

  • 一致性:确保数据库正确后成功提交事物更改状态。

  • 隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

  • 可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候把事务保存到日志里。

控制事物使用的命令: - COMMIT :保存修改 - ROLLBACK:回滚更改 - SAVEPOINT:回滚事物组创建点 - SET TRANSACTION:用来设置事物的隔离级别

14、 SQL命令分类

DDL(Data Define Language)

命令描述
CREATE创建一个表、数据库、表的视图
ALTER修改现有数据库对象
DROP删除整个表、数据库中的表或其他对象或视图

DML(Data Manager Language)

命令描述
INSERT插入记录
UPDATE修改记录
DELETE删除记录

DCL(Date Control Language)

命令描述
GRANT授予用户权限
REVOKE撤销授予用户的权限

DQL(Date Query Language)

命令描述
SELECT从一张表或多张表中检索特定的记录

、15、SQL语言规范

  • 在数据库系统中,SQL语句不区分大小写(建议使用大写),但在字符串中常量区分大小写。

  • SQL语句中可以单行书写,并以“;”结尾。

  • 在SQL中关键词不能跨多行或简写。

  • 子句通常独立运行,便于管理,提高可读性。

  • SQL注释标准:/需要注释的内容/ 或 --需要注释的内容

三、mysql

1、概念

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

2、mariadb

0dd7912397dda1447af0caafb0b7d0a20cf48636MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。

3、如何使用二进制安装mariadb呢?

之前我们讲过使用源码编译安装DNS,其实编译安装的过程都是大同小异的,但是源码编译安装会耗费我们很多的时间,是不是如果有人把源码编译好我们直接使用该如何呢?但是这种方式有一个缺点不能自己定制自己的需求,如果你想只针对自己的需求安装那就只能使用源码编译安装了。下面我们就来看看二进制如何安装mariadb

先从官网下载二进制包

https://downloads.mariadb.org/mariadb/10.2.8/ 2017-09-25_142801.png

创建mysql用户[root@localhost mysql]# useradd -r -m -d /app/testdata -s /sbin/nologin mysql

解压指定目录并创建软连接

[root@localhost ~]# tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local[root@localhost local]# ln -sv mariadb-10.2.8-linux-x86_64/ mysql#创建软连接

准备配置文件 [root@localhost mysql]# mkdir /etc/mysql #创建目录[root@localhost mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf#复制模板文件 [root@localhost mysql]# cd /etc/mysql/[root@localhost mysql]# vim my.cnf #修改配置文件

[mysqld]
datadir         = /app/testdata
innodb_file_per_table = on
skip-name_resolve = on
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M

2017-09-25_144839.png

现在我们已经把主配置文件创建好了,但是如果现在启动的话,会出现下面情况

[root@localhost~]#service mysqld start

Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: Unit not found.

我们还没有创建启动脚本呢!!!

[root@localhost mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld#将启动脚本复制到启动脚本目录下[root@localhost mysql]# chkconfig --add mysqld #添加服务

创建数据库文件

[root@localhost/usr/local/mysql]#./scripts/mysql_install_db --datadir=/app/testdata --user=mysql#初始化数据库,但是这里需要注意的是这个执行文件必须在文件父目录上执行。

这是我们尝试去启动mysqld,看看是否可以启动

[root@localhost/usr/local/mysql]#service mysqld start

出错啦,出错啦,是什么原因呢?使我们的日志文件没有创建导致,现在我们去解决这个问题。

[root@localhost/usr/local/mysql]#journalctl -xe #查看日志

Sep 25 15:07:28 localhost.localdomain mysqld[3756]: Starting MySQL.170925 15:07:28 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.

如何解决这个问题呢?

[root@localhost/usr/local/mysql]#mkdir /var/log/mariadb 
[root@localhost/usr/local/mysql]#touch /var/log/mariadb/mariadb.log#创建日志文件[root@localhost/usr/local/mysql]#setfacl -R -m u:mysql:rwx /var/log/mariadb/#设置权限

现在我们来再尝试启动,看看能不能成功呢?

[root@localhost/usr/local/mysql]#service mysqld start

Starting mysqld (via systemctl):                           [  OK  ]

高兴,终于启动了,那让我们来尽情的享用吧?

初始化数据库

[root@localhost/usr/local/mysql]#/usr/local/mysql/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):   #输入现在的密码,新创建的密码为空,直接回车
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y  #询问是否为root创建密码
New password:   #输入密码
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y     #是否移除匿名用户
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y   #是否远程root 登录
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] N  #是否移除test数据库
 ... skipping.

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y    #是否立即生效
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

2017-09-25_151756.png

咦,有出错了,先哭会,再解决;这个原因是我们没有设置mysql路径,那么我们来设置下喽。

[root@localhost/usr/local/mysql]#vim /etc/profile.d/mysql.sh #写路径

export PATH=/usr/local/mysql/bin:$PATH

[root@localhost/usr/local/mysql]#source /etc/profile.d/mysql.sh#使其生效。

2017-09-25_152238.png

如果您出现上图所示内容,说明你已经成功,来给自己鼓个掌。


安装过程中有没有注意到,为什么我们要创建/etc/mysql/目录来创建配置文件呢?

在mysql中配置文件查找次序:后面的会覆盖前面的配置文件

/etc/my.cnf-->/etc/mysql/my.cnf-->--default-extra-file=/PATH/TO/CONF_FILE-->/.my.cnf


四、示例

创建两张表一个学生基本信息如ID、姓名、性别、年龄。另一张表为学生的成绩ID、姓名、成绩

MariaDB [student]> CREATE TABLE information(ID TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL,age TINYINT UNSIGNED)2017-09-25_155147.png

MariaDB [student]> CREATE TABLE score (ID TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL , scores INT NOT NULL);

2017-09-25_155325.png

五、授权用户

MariaDB [mysql]> SELECT user,host,password FROM user;

2017-09-25_155817.png

如何给创建用户并添加密码呢?

MariaDB [(none)]> CREATE USER 'li'@'192.168.4.%' IDENTIFIED BY '123456';MariaDB [(none)]> CREATE USER 'wang'@'localhost' IDENTIFIED BY '123456';

如何更改口令呢?

MariaDB [(none)]> UPDATE mysql.user SET PASSWORD = PASSWORD('123456') WHERE USER = 'li';

MariaDB [(none)]> SET PASSWORD FOR 'li'@'192.168.4.%' = PASSWORD('123456');

2017-09-25_160947.png

在一台主机上远程登录,可以登了,但是看不到数据库 2017-09-25_161506.png

那么如何才可以使其使用呢?那必须授权此用户操作。

MariaDB [(none)]> GRANT SELECT,DELETE ON student.* TO 'li'@'192.168.4.%';2017-09-25_164953.png

授权成功。当当当!

MariaDB [(none)]> REVOKE ALL ON student.* FROM 'li'@'192.168.4.%';#当有一天这个人离职了,需要收回特权。

**注意:mariadb服务进程启动时会读取mysql库中的所有授权表至内存中。

(1)GRANT或REVOKE等执行权限操作会保存于系统表汇总,mariadb的服务进程通常自动重读授权表,使其生效。 (2)对于不能够或不能及时重读授权表的命令,可手动让mariadb的服务进行重复授权表。FLUSH PRIVILEGES