MySQL 数据库项目自从被 Oracle 公司收购之后,从开源软件转变成为了“闭源”软件,这导致 IT 行业中的很多企业以及厂商纷纷选择使用了数据库软件的后起之秀—MariaDB 数据库管理系统。MariaDB 数据库管理系统也因此快速占据了市场。
18.1 数据库管理系统
数据库是指按照某些特定结构来存储数据资料的数据仓库。数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量数据的大型分布式模式。在信息化社会中,能够充分有效地管理和利用各种数据,挖掘其中的价值,是进行科学研究与决策管理的重要前提。同时,数据库技术也是信息管理系统、办公自动化系统、决策支持系统等各类信息系统的核心组成部分,是进行科学研究和决策管理的重要技术手段。
数据库管理系统是一种能够对数据库中存放的数据进行建立、修改、删除、查找、维护等操作的软件程序。它通过把计算机中具体的物理数据转换成适合用户理解的抽象逻辑数据,有效地降低数据库管理的技术门槛,因此即便是从事 Linux 运维工作的工程师也可以对数据库进行基本的管理操作。
MariaDB 是由 MySQL 项目创始人 Michael Widenius 带领着团队开发的。根据 MariaDB官网的介绍,Michael Widenius 有两个可爱的小天使女儿,大女儿叫 My,而二女儿叫 Maria,因此 MariaDB 成为他用亲人名字命名的第二款软件(第一款显然是 MySQL)。
MariaDB 当前由开源社区进行维护,是 MySQL 的分支产品,而且与 MySQL 具有高度的兼容性,与 MySQL API 和命令均保持一致。并且 MariaDB 还自带了一个新的存储引擎 Aria,用于替代 MyISAM。因此,MariaDB 与 MySQL 一样好用。
MariaDB 和 MySQL在性能上基本保持一致,两者的操作命令也十分相似。从务实的角度来讲,在掌握了 MariaDB 数据库的命令和基本操作之后,在今后的工作中即使遇到 MySQL 数据库,也可以快速上手。
18.2 初始化 mariadb 服务
相较于 MySQL,MariaDB 数据库管理系统有了很多新鲜的扩展特性,例如对微秒级别的支持、线程池、子查询优化、进程报告等。
配置妥当软件仓库后,即可安装部署 MariaDB 数据库主程序及服务端程序了,在安装完毕后,需启动服务程序,并将其加入到开机启动项中。
[root@RS ~]# dnf -y install mariadb mariadb-server //安装 mariadb 数据库主程序及服务程序端 [root@RS ~]# systemctl start mariadb //开启数据库服务 [root@RS ~]# systemctl enable mariadb //加入开机启动项 /* Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service. Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service. Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service. */
在确认 mariadb 数据库软件程序安装完毕并成功启动后请不要立即使用。为了确保数据库的安全性和正常运转,需要先对数据库程序进行初始化操作。这个初始化操作涉及下面 5个步骤。
- 设置 root 管理员在数据库中的密码值(注意,该密码并非 root 管理员在系统中的密码,这里的密码值默认应该为空,可直接按回车键)。
- 设置 root 管理员在数据库中的专有密码。
- 删除匿名用户,并使用 root 管理员从远程登录数据库,以确保数据库上运行的业务的安全性。
- 删除默认的测试数据库,取消测试数据库的一系列访问权限。
- 刷新授权列表,让初始化的设定立即生效。
对于上述数据库初始化的操作步骤,已在下面的输出信息旁边进行了简单注释可直观了解要输入的内容:
在很多生产环境中都需要使用站库分离的技术(即网站和数据库不在同一个服务器上),如需让 root 管理员远程访问数据库,可在上面的初始化操作中设置策略,以允许 root 管理员从远程访问。还需设置防火墙,使其放行对数据库服务程序的访问请求。数据库服务程序默认会占用 3306 端口,在防火墙策略中服务名称统一叫作 mysql:
[root@RS ~]# firewall-cmd --permanent --add-service=mysql //设置防火墙允许访问mysql服务 [root@RS ~]# firewall-cmd --reload //重新加载防火墙策略
设置完毕,登录 MariaDB 数据库。管理数据库的命令为 mysql,其中,-u 参数用来指定以 root 管理员的身份登录,而 -p 参数用来验证该用户在数据库中的密码值。
[root@RS ~]# mysql -u root -p //登录数据库 -u 用户名 -p 验证数据库中的密码 /* Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 17 Server version: 10.3.11-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> */ MariaDB [(none)]> help //help命令查看 mariadb 服务能做的操作,语句的用法与 MySQL 一模一样
MariaDB 数据库后执行数据库命令时,都需要在命令后面用分号(;)结尾,这也是与 Linux 命令最显著的区别。需要习惯数据库命令的这种设定。下面执行如下命令查看数据库管理系统中当前都有哪些数据库:
MariaDB [(none)]> show databases; //查看数据库管理系统中当前都有哪些数据库 /* +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.000 sec) */
使用数据库命令将 root 管理员在数据库管理系统中的密码值修改为 zxbke。这样退出后再尝试登录,如果还坚持输入原先的密码,则将提示访问失败。
MariaDB [(none)]> set password = PASSWORD('zxbke');
18.3 管理用户以及授权
为了保障数据库系统的安全性,以及让其他用户协同管理数据库,可以在 MariaDB 数据库管理系统中创建多个专用的数据库管理用户,然后再分配合理的权限,以满足工作需求。
新建用户
为此,可使用 root 管理员登录数据库管理系统,然后按照“CREATE USER 用户名@主机名 IDENTIFIED BY '密码';”的格式创建数据库管理用户。一定不要忘记每条数据库命令后面的分号(;)。
MariaDB [(none)]> CREATE USER zhangxu@localhost IDENTIFIED BY 'zx123456'; //新建用户
Query OK, 0 rows affected (0.000 sec)
创建的用户信息可以使用SELECT命令语句来查询。下面命令查询的是用户 zhangxu 的主机名称、用户名称以及经过加密的密码值信息:
MariaDB [(none)]> use mysql; //指定要使用的数据库
/*
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
*/
MariaDB [mysql]> SELECT HOST,USER,PASSWORD FROM user WHERE USER="zhangxu"; // 查询用户信息
/*
+-----------+---------+-------------------------------------------+
| HOST | USER | PASSWORD |
+-----------+---------+-------------------------------------------+
| localhost | zhangxu | *B9EE89574B047E954DF4F77DA1299A59E752CAAB |
+-----------+---------+-------------------------------------------+
1 row in set (0.000 sec)
*/
zhangxu 仅仅是一位普通用户,没有数据库的任何操作权限。可以切换到 zhangxu 用户来查询数据库管理系统中当前都有哪些数据库。可以发现,该用户甚至没法查看完整的数据库列表(刚才使用root用户时可以查看到3个数据库列表):
MariaDB [mysql]> exit //退出mysql
Bye
[root@RS ~]# mysql -u zhangxu -p //使用新建用户登录
MariaDB [(none)]> show databases; //查看当前数据库
/*
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.000 sec)
*/
数据库管理系统所使用的命令一般都比较复杂。以 GRANT
命令为例进行说明。GRANT命令用于为用户进行授权,其常见格式如下表所示。在使用 GRANT 命令时需要写上要赋予的权限、数据库及表单名称,以及对应的用户及主机信息。其实,只要理解了命令中每个字段的功能含义,也就不觉得命令复杂难懂了。
当然,用户的授权工作肯定是需要数据库管理员来执行的。下面以 root 管理员的身份登录到数据库管理系统中。
[root@RS ~]# mysql -u root -p //以root用户登录mysql
MariaDB [(none)]> use mysql; //指定要使用的数据库
添加用户权限
授权命令(GRANTS),针对 mysql 数据库中的 user 表单向用户 zhangxu 授予查询、更新、删除以及插入等权限。
//针对 mysql 数据库中的 user 表单向用户 zhangxu 授予查询、更新、删除以及插入等权限
MariaDB [mysql]> GRANT SELECT,UPDATE,DELETE,INSERT ON mysql.user TO zhangxu@localhost;
MariaDB [mysql]> SHOW GRANTS FOR zhangxu@localhost; //查看一下用户 zhangxu 的权限:
/*
+----------------------------------------------------------------------------------------------------------------+
| Grants for zhangxu@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'zhangxu'@'localhost' IDENTIFIED BY PASSWORD '*B9EE89574B047E954DF4F77DA1299A59E752CAAB' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mysql`.`user` TO 'zhangxu'@'localhost' |
+----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
*/
上面输出信息中显示用户luke已经拥有了针对mysql数据库中user表单的一系列权限了。这时我们再切换到用户 zhangxu,此时就能够看到mysql数据库了,而且还能看到表单user(其余表单会因无权限而被继续隐藏):
[root@RS ~]# mysql -u zhangxu -p //以 zhangxu 用户登录
MariaDB [(none)]> use mysql; //指定当前使用 mysql 数据库
MariaDB [mysql]> SHOW databases; //查看当前的数据库
/*
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.000 sec)
*/
MariaDB [mysql]> SHOW tables; //查看当前mysql数据库中的表项
/*
+-----------------+
| Tables_in_mysql |
+-----------------+
| user |
+-----------------+
1 row in set (0.000 sec)
*/
删除用户权限
移除授权的命令(REVOKE),移除授权的命令与授权命令 授权方法一致,只需切换删除命令即可。切换回 root 管理员用户。
//以下命令为移除用户权限
MariaDB [mysql]> REVOKE SELECT,UPDATE,DELETE,INSERT ON mysql.user FROM zhangxu@localhost;
MariaDB [mysql]> SHOW GRANTS FOR zhangxu@localhost //查看用户的权限
删除用户
不再需要某个用户时,可以直接用 DROP 命令将其删除:DROP user zhangxu@localhost;
18.4 创建数据库与表单
在MariaDB数据库管理系统中,一个数据库可以存放多个数据表,数据表单是数据库中最重要最核心的内容。我们可以根据自己的需求自定义数据库表结构,然后在其中合理地存放数据,以便后期轻松地维护和修改。下表罗列了后文中将使用到的数据库命令以及对应的作用。
命令用法 | 作用 |
---|---|
CREATE database 数据库名称。 | 创建新的数据库 |
DESCRIBE 表单名称; | 描述表单 |
UPDATE 表单名称 SET attribute=新值 WHERE attribute > 原始值; | 更新表单中的数据 |
USE 数据库名称; | 指定使用的数据库 |
SHOW databases; | 显示当前已有的数据库 |
SHOW tables; | 显示当前数据库中的表单 |
SELECT * FROM 表单名称; | 从表单中选中某个记录值 |
DELETE FROM 表单名 WHERE attribute=值; | 从表单中删除某个记录值 |
新建数据库
建立数据库是管理数据的起点。现在尝试创建一个名为 zxbke 的数据库,然后再查看数据库列表,此时就能看到它了:
[root@RS ~]# mysql -u root -p //登录数据库
MariaDB [(none)]> CREATE DATABASE zxbke; //新建数据库 zxbke
MariaDB [(none)]> SHOW DATABASES; //查看当前已有的数据库
/*
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| zxbke |
+--------------------+
4 rows in set (0.000 sec)
*/
MariaDB与MySQL同属于关系型数据库(Relational Database Management System,RDBMS)。关系型数据库有些类似于表格的概念,一个关系型数据库由一个或多个表格/表单组成,如下图所示。在图中,表头表示每一列的名称;列表示具有相同数据类型的数据集合;行表示用来描述事物的具体信息;值表示行的具体信息,每个值均与该列的其他数据类型相同;键表示用来识别某个特定事物的方法,在当前列中具有唯一性。
新建表单
在新建的 zxbke 数据库中创建表单mybook,然后进行表单的初始化,即定义存储数据内容的结构。分别定义3个字段项,其中,字符型字段 name(长度为15字符)用来存放图书名称,整型字段price和pages分别存储图书的价格和页数。当执行完下述命令之后,就可以看到表单的结构信息了:
MariaDB [zxbke]> use zxbke; //指定当前操作 zxbke 数据库
MariaDB [zxbke]> CREATE TABLE mybook(name char(15),price int,pages int); //新建表单
Query OK, 0 rows affected (0.003 sec)
MariaDB [zxbke]> DESCRIBE mybook; //初始化表单
/*
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(15) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| pages | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.001 sec)
*/
18.5 管理表单及数据
接下来向 mybook 数据表单中插入一条图书信息。为此需要使用 INSERT 命令,并在命令中写清表单名称以及对应的字段项。执行该命令之后即可完成图书写入信息。
插入信息
下面使用该命令插入一条图书信息,其中书名为 linuxbook,价格和页数分别是 60 元和 518 页。在命令执行后也就意味着图书信息已经成功写入到数据表单中,然后就可以查询表单中的内容了。在使用 SELECT 命令查询表单内容时,需要加上想要查询的字段;如果想查看表单中的所有内容,则可以使用星号(*)通配符来显示:
//以下插入信息到 mybook数据库,指定name值为 linuxbook,price值为60,pages值为50
MariaDB [zxbke]> INSERT INTO mybook(name,price,pages) VALUES('linuxbook','60','518');
Query OK, 1 row affected (0.001 sec)
MariaDB [zxbke]> SELECT * from mybook; //查看表单中所有内容,*表示所有 通配符
/*
+-----------+-------+-------+
| name | price | pages |
+-----------+-------+-------+
| linuxbook | 60 | 518 |
+-----------+-------+-------+
1 row in set (0.000 sec)
*/
修改信息
可以使用UPDATE命令将刚才插入的linuxprobe图书信息的价格修改为55元,然后再使用SELECT命令查看该图书的名称和定价信息。注意,因为这里只查看图书的名称和定价,而不涉及页码,所以无须再用星号通配符来显示所有内容。
MariaDB [zxbke]> UPDATE mybook SET price=55; //修改price值为 55
MariaDB [zxbke]> SELECT name,price FROM mybook; //查询 name,price 字段的值
/*
+-----------+-------+
| name | price |
+-----------+-------+
| linuxbook | 55 |
+-----------+-------+
1 row in set (0.000 sec)
*/
想修改指定的某一条记录?没问题的,用 WHERE
命令进行限定即可。先插入两条图书信息:
MariaDB [zxbke]> INSERT INTO mybook(name,price,pages) VALUES('pythonbook','88','800');
MariaDB [zxbke]> INSERT INTO mybook(name,price,pages) VALUES('netbook','99','900');
使用WHERE命令仅将名称为 linuxbook 的图书价格修改为60元,不影响其他图书信息:
//以下修改 'name值为linuxbook的'记录中的price值为66
MariaDB [zxbke]> UPDATE mybook SET price=66 where name='linuxbook';
MariaDB [zxbke]> SELECT * from mybook; //查询修改后的值
/*
+------------+-------+-------+
| name | price | pages |
+------------+-------+-------+
| linuxbook | 66 | 518 |
| pythonbook | 88 | 800 |
| netbook | 99 | 900 |
+------------+-------+-------+
3 rows in set (0.000 sec)
*/
删除信息
还可以使用DELETE命令删除某个数据表单中的内容。下面使用DELETE命令删除数据表单mybook中的所有内容,然后再查看该表单中的内容,可以发现该表单内容为空了:
MariaDB [zxbke]> DELETE from mybook; //删除所有记录信息
Query OK, 3 rows affected (0.001 sec)
MariaDB [zxbke]> SELECT * from mybook; //再次查询,已为空表
Empty set (0.000 sec)
条件查找
一般来讲,数据表单中会存放成千上万条数据信息。比如刚刚创建的用于保存图书信息的 mybook 表单,随着时间的推移,里面的图书信息也会越来越多。在这样的情况下,如果只想查看其价格大于某个数值的图书,又该如何定义查询语句呢?下面先使用 INSERT 插入命令依次插入 8 条图书信息:
MariaDB [zxbke]> SELECT * from mybook; //查询到8条信息
/*
+--------+-------+-------+
| name | price | pages |
+--------+-------+-------+
| ywbook | 10 | 1000 |
| sxbook | 20 | 2000 |
| yybook | 30 | 3000 |
| lsbook | 40 | 4000 |
| dlbook | 50 | 5000 |
| zzbook | 60 | 6000 |
| wlbook | 70 | 7000 |
| hxbook | 80 | 8000 |
+--------+-------+-------+
8 rows in set (0.000 sec)
*/
要想让查询结果更加精准,就需要结合使用SELECT与WHERE命令了。其中,WHERE命令是在数据库中进行匹配查询的条件命令。通过设置查询条件,就可以仅查找出符合该条件的数据。下表列出了WHERE命令中常用的查询参数以及作用。
参数 | 作用 |
---|---|
= | 相等 |
<>或!= | 不相等 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索一个例子 |
IN | 在列中搜索多个值 |
分别在mybook表单中查找出价格大于50元或价格不等于80元的图书,其对应的命令如下所示。在熟悉了这两个查询条件之后,可以自行尝试精确查找图书名为 的图书信息。
MariaDB [zxbke]> SELECT * FROM mybook WHERE price>50; //查询price大于50的记录值
MariaDB [zxbke]> SELECT * FROM mybook WHERE price!=80; //查询price不等于80的记录值
匹配的条件越多,获得的信息就越精准。在 WHERE 命令的后面追加 AND 操作符,可以进行多次匹配。例如,执行下述命令,找到价格为 30 元、页数为 3000 的图书的名称:
MariaDB [zxbke]> SELECT * from mybook WHERE price=30 AND pages=3000; //查询price值为30 pages值为3000的记录值
+--------+-------+-------+
| name | price | pages |
+--------+-------+-------+
| yybook | 30 | 3000 |
+--------+-------+-------+
1 row in set (0.000 sec)
18.6 数据库的备份及恢复
备份数据库
mysqldump 命令用于备份数据库数据,格式为“ mysqldump [参数] [数据库名称] ”。其中参数与 mysql 命令大致相同,-u 参数用于定义登录数据库的用户名称,-p 参数表示密码提示符。下面将 zxbke 数据库中的内容导出为一个文件,并保存到 root 管理员的家目录中:
[root@RS ~]# mysqldump -u root -p zxbke > /root/zxbkeDB.dump
Enter password: //输入管理员密码即可
删除数据库
进入 MariaDB 数据库管理系统,彻底删除 zxbke 数据库,这样 mybook 数据表单也将被彻底删除。然后重新建立 zxbke 数据库:
[root@RS ~]# mysql -u root -p //登录数据库管理系统
MariaDB [(none)]> DROP DATABASE zxbke; //删除名为zxbke的数据库
MariaDB [(none)]> SHOW DATABASES; //再次查看数据库,zxbke数据库已删除;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)
MariaDB [(none)]> CREATE DATABASE zxbke; //新建数据库,用于恢复表项
恢复数据库
使用输入重定向把刚刚备份的数据库文件导入到mysql 命令中,然后执行该命令。接下来登录 MariaDB 数据库,就又能看到 zxbke 数据库以及 mybook 数据表单了。数据库恢复成功!
[root@RS ~]# mysql -u root -p zxbke < /root/zxbkeDB.dump //恢复数据库
[root@RS ~]# mysql -u root -p //登录数据库管理系统
MariaDB [(none)]> use zxbke; //使用zxbke数据库
MariaDB [zxbke]> show tables; //查看数据表
+-----------------+
| Tables_in_zxbke |
+-----------------+
| mybook |
+-----------------+
1 row in set (0.000 sec)
MariaDB [zxbke]> SELECT * from mybook; //查看表中记录信息
+--------+-------+-------+
| name | price | pages |
+--------+-------+-------+
| ywbook | 10 | 1000 |
| sxbook | 20 | 2000 |
| yybook | 30 | 3000 |
| lsbook | 40 | 4000 |
| dlbook | 50 | 5000 |
| zzbook | 60 | 6000 |
| wlbook | 70 | 7000 |
| hxbook | 80 | 8000 |
+--------+-------+-------+
8 rows in set (0.000 sec)