第十七章 使用 MariaDB 数据库管理系统
1. 数据库管理系统
数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代,互联网上每天都会生成海量的数据信息,数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量数据的大型分布式模式。在信息化社会中,能够充分有效地管理和利用各种数据,挖掘其中的价值,是进行科学研究与决策管理的重要前提。同时,数据库技术也是信息管理系统、办公自动化系统、决策支持系统等各类信息系统的核心组成部分,是进行科学研究和决策管理的重要技术手段。
数据库管理系统是一种能够对数据库中存放的数据进行建立、修改、删除、查找、维护等操作的软件程序。它通过把计算机中具体的物理数据转换成适合用户理解的抽象逻辑数据,有效地降低数据库管理的技术门槛,因此即便是从事 Linux 运维工作的工程师也可以对数据库进行基本的管理操作。但是,我们的技术主线依然是 Linux 系统的运维,而数据库管理系统只不过是在此主线上的一个内容不断横向扩展、纵向加深的分支,不能指望在一两天之内就可以精通数据库管理技术。
既然是讲解数据库管理技术,就肯定绕不开 MySQL。MySQL 是一款市场占有率非常高的数据库管理系统,技术成熟,配置步骤相对简单,而且具有良好的可扩展性。但是,由于Oracle 公司在 2009年收购了 MySQL的母公司 Sun,因此 MySQL数据库项目也随之纳入 Oracle麾下,逐步演变为保持着开源软件的身份,但又申请了多项商业专利的软件系统。开源软件是全球黑客、极客、程序员等技术高手在开源社区的大旗下的公共智慧的结晶,自己的劳动成果被其他公司商业化自然也伤了一大批开源工作者的心,因此 MySQL 项目的创始人重新研发了一款名为 MariaDB 的全新数据库管理系统。
2. 初始化 mariadb 服务
相较于 MySQL,MariaDB 数据库管理系统有了很多新鲜的扩展特性,例如对微秒级别的支持、线程池、子查询优化、进程报告等。在配置妥当软件仓库后,即可安装部署 MariaDB数据库主程序及服务端程序了。
[root@linuxprobe~]# dnf install -y mariadb mariadb-server
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use
subscription-manager to register.
Last metadata expiration check: 0:00:19 ago on Tue 27 Apr 2021 05:04:27 PM CST.
Dependencies resolved.
=============================================================================== Package Arch Version Repository Size
===============================================================================
Installing: mariadb x86_64 3:10.3.11-1.module+el8+2765+cfa4f87b AppStream 6.2 M mariadb-server x86_64 3:10.3.11-1.module+el8+cfa4f87b AppStream 16 M
Installing dependencies: mariadb-common x86_64 3:10.3.11-1.module+el8+cfa4f87b AppStream 62 k mariadb-connector-c x86_64 3.0.7-1.el8 AppStream 148 k mariadb-connector-c-config noarch 3.0.7-1.el8 AppStream 13 k mariadb-errmsg x86_64 3:10.3.11-1.module+el8+cfa4f87b AppStream 232 k perl-DBD-MySQL x86_64 4.046-2.module+el8+0650e81c AppStream 156 k
Installing weak dependencies: mariadb-backup x86_64 3:10.3.11-1.module+el8+cfa4f87b AppStream 6.2 M mariadb-gssapi-server x86_64 3:10.3.11-1.module AppStream 49 k mariadb-server-utils x86_64 3:10.3.11-1.module+el8 AppStream 1.6 M
Enabling module streams: mariadb 10.3 perl-DBD-MySQL 4.046 Transaction Summary
===============================================================================
Install 10 Packages
………………省略部分输出信息………………
Installed: mariadb-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-server-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-backup-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-gssapi-server-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-server-utils-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-common-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 mariadb-connector-c-3.0.7-1.el8.x86_64 mariadb-connector-c-config-3.0.7-1.el8.noarch mariadb-errmsg-3:10.3.11-1.module+el8+2765+cfa4f87b.x86_64 perl-DBD-MySQL-4.046-2.module+el8+2515+0650e81c.x86_64 Complete!
在安装完毕后,记得启动服务程序,并将其加入到开机启动项中:
[root@linuxprobe~]# systemctl start mariadb
[root@linuxprobe~]# 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@linuxprobe~]# 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 (设置管理员密码)
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 (禁止管理员从远程登录)... 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] y (删除测试数据库及其权限)- Dropping test database... ... Success! - Removing privileges on test database... ... Success! 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!
在很多生产环境中都需要使用站库分离的技术(即网站和数据库不在同一个服务器上),如果需要让 root 管理员远程访问数据库,可在上面的初始化操作中设置策略,以允许 root 管理员从远程访问。然后还需要设置防火墙,使其放行对数据库服务程序的访问请求。数据库服务程序默认会占用 3306 端口,在防火墙策略中服务名称统一叫作 mysql:
[root@linuxprobe~]# firewall-cmd --permanent --add-service=mysql
success
[root@linuxprobe~]# firewall-cmd --reload
success
一切准备就绪。现在我们将首次登录 MariaDB 数据库。管理数据库的命令为 mysql,其中,-u 参数用来指定以 root 管理员的身份登录,而-p 参数用来验证该用户在数据库中的密码值。
[root@linuxprobe~]# mysql -u root -p
Enter password: (输入刚才设置的管理员密码后敲击回车)
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 16
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.
初次使用数据库管理工具的读者,可以输入 help 命令查看 mariadb 服务能做的操作,语句的用法与 MySQL 一模一样:
MariaDB [(none)]> help
General information about MariaDB can be found at http://mariadb.org List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
? (\?) Synonym for `help'.
clear (\c) Clear the current input statement.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for processing binlog
with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement. For server side help, type 'help contents'
在登录 MariaDB 数据库后执行数据库命令时,都需要在命令后面用分号(;)结尾,这也是与 Linux 命令最显著的区别。大家需要慢慢习惯数据库命令的这种设定。下面执行如下命令查看数据库管理系统中当前都有哪些数据库:
MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec )
小试牛刀过后,接下来使用数据库命令将 root 管理员在数据库管理系统中的密码值修改为 linuxprobe。这样退出后再尝试登录,如果还坚持输入原先的密码,则将提示访问失败。
MariaDB [(none)]> SET password = PASSWORD('linuxprobe');
Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> exit
Bye
[root@linuxprobe~]# mysql -u root -p
Enter password: (此处输入管理员在数据库中的旧密码)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
输入新密码(linuxprobe)后,便可顺利进入数据库管理工具中:
[root@linuxprobe~]# mysql -u root -p
Enter password: (此处输入管理员在数据库中的新密码)
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 20
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.
3. 管理用户以及授权
在生产环境中总不能一直“死啃”root 管理员。为了保障数据库系统的安全性,以及让其他用户协同管理数据库,可以在 MariaDB 数据库管理系统中为他们创建多个专用的数据库管理用户,然后再分配合理的权限,以满足他们的工作需求。为此,可使用 root 管理员登录数据库管理系统,然后按照“CREATE USER 用户名@主机名 IDENTIFIED BY '密码';”的格式创建数据库管理用户。再次提醒大家,一定不要忘记每条数据库命令后面的分号(;)。
MariaDB [(none)]> CREATE USER luke@localhost IDENTIFIED BY 'linuxprobe';
Query OK, 0 rows affected (0.00 sec)
创建的用户信息可以使用 SELECT 命令语句来查询。下面命令查询的是用户 luke 的主机名称、用户名称以及经过加密的密码值信息:
MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> SELECT HOST,USER,PASSWORD FROM user WHERE USER="luke";
+-----------+------+-------------------------------------------+
| HOST | USER | PASSWORD |
+-----------+------+-------------------------------------------+
| localhost | luke | *55D9962586BE75F4B7D421E6655973DB07D6869F |
+-----------+------+-------------------------------------------+
1 row in set (0.001 sec)
不过,用户 luke 仅仅是一位普通用户,没有数据库的任何操作权限。不信的话,可以切换到 luke 用户来查询数据库管理系统中当前都有哪些数据库。可以发现,该用户甚至没法查看完整的数据库列表(刚才使用 root 用户时可以查看到 3 个数据库列表):
MariaDB [mysql]> exit
Bye
[root@linuxprobe~]# mysql -u luke -p
Enter password: (输入luke用户的数据库密码)
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 21
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)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.001 sec)
数据库管理系统所使用的命令一般都比较复杂。我们以 GRANT 命令为例进行说明。GRANT 命令用于为用户进行授权,其常见格式如表所示。在使用 GRANT 命令时需要写上要赋予的权限、数据库及表单名称,以及对应的用户及主机信息。其实,只要理解了命令中每个字段的功能含义,也就不觉得命令复杂难懂了。
当然,用户的授权工作肯定是需要数据库管理员来执行的。下面以 root 管理员的身份登录到数据库管理系统中,针对 mysql 数据库中的 user 表单向用户 luke 授予查询、更新、删除以及插入等权限。
[root@linuxprobe~]# mysql -u root -p
Enter password: (输入管理员的数据库密码)
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]> GRANT SELECT,UPDATE,DELETE,INSERT ON mysql.user TO luke@localhost;
Query OK, 0 rows affected (0.001 sec)
在执行完上述授权操作之后,我们再查看一下用户 luke 的权限:
MariaDB [(none)]> SHOW GRANTS FOR luke@localhost;
+------------------------------------------------------------------+
| Grants for luke@localhost |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'luke'@'localhost' IDENTIFIED BY PASSWORD
'*55D9962586BE75F4B7D421E6655973DB07D6869F' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mysql`.`user` TO 'luke'@'localhost' |
+-----------------------------------------------------------------------------+
2 rows in set (0.000 sec)
上面输出信息中显示用户 luke已经拥有了针对mysql 数据库中 user 表单的一系列权限了。这时我们再切换到用户 luke,此时就能够看到 mysql 数据库了,而且还能看到表单 user(其余表单会因无权限而被继续隐藏):
[root@linuxprobe~]# mysql -u luke -p
Enter password: (输入luke用户的数据库密码) MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.000 sec) MariaDB [(none)]> use mysql;
Database changed MariaDB [mysql]> SHOW tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| user |
+-----------------+
1 row in set (0.001 sec) MariaDB [mysql]> exit
Byes
大家不要心急,我们接下来会慢慢学习数据库内容的修改方法。当前,先切换回 root 管理员用户,移除刚才的授权。
[root@linuxprobe~]# mysql -u root -p
Enter password: (输入管理员的数据库密码)
MariaDB [(none)]> use mysql;
Database changed
MariaDB [(none)]> REVOKE SELECT,UPDATE,DELETE,INSERT ON mysql.user FROM
luke@localhost;
Query OK, 0 rows affected (0.00 sec)
可以看到,除了移除授权的命令(REVOKE)与授权命令(GRANTS)不同之外,其余部分都是一致的。这不仅好记而且也容易理解。执行移除授权命令后,再来查看用户 luke 的信息:
MariaDB [(none)]> SHOW GRANTS FOR luke@localhost;
+-----------------------------------------------------------------+
| Grants for luke@localhost |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'luke'@'localhost' IDENTIFIED BY PASSWORD
'*55D9962586BE75F4B7D421E6655973DB07D6869F' |
+------------------------------------------------------------------+
1 row in set (0.001 sec)
不再需要某个用户时,可以直接用 DROP 命令将其删除:
MariaDB [(none)]> DROP user luke@localhost;
Query OK, 0 rows affected (0.000 sec)
4. 创建数据库与表单
在 MariaDB 数据库管理系统中,一个数据库可以存放多个数据表,数据表单是数据库中最重要最核心的内容。我们可以根据自己的需求自定义数据库表结构,然后在其中合理地存放数据,以便后期轻松地维护和修改。表罗列了后文中将使用到的数据库命令以及对应的作用。
建立数据库是管理数据的起点。现在尝试创建一个名为 linuxprobe 的数据库,然后再查看数据库列表,此时就能看到它了:
MariaDB [(none)]> CREATE DATABASE linuxprobe;
Query OK, 1 row affected (0.001 sec) MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| linuxprobe |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)
MariaDB 与 MySQL 同属于关系型数据库(Relational Database Management System,RDBMS)。关系型数据库有些类似于表格的概念,一个关系型数据库由一个或多个表格/表单组成,如图 18-2 所示。
在图 18-2 中,表头表示每一列的名称;列表示具有相同数据类型的数据集合;行表示用来描述事物的具体信息;值表示行的具体信息,每个值均与该列的其他数据类型相同;键表示用来识别某个特定事物的方法,在当前列中具有唯一性。
比如,在新建的 linuxprobe 数据库中创建表单 mybook,然后进行表单的初始化,即定义存储数据内容的结构。我们分别定义 3 个字段项,其中,字符型字段 name(长度为 15 字符)用来存放图书名称,整型字段 price 和 pages 分别存储图书的价格和页数。当执行完下述命令之后,就可以看到表单的结构信息了:
MariaDB [(none)]> use linuxprobe;
Database changed
MariaDB [linuxprobe]> CREATE TABLE mybook (name char(15),price int,pages int);
Query OK, 0 rows affected (0.009 sec) MariaDB [linuxprobe]> 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.002 sec)
5. 管理表单及数据
接下来向 mybook 数据表单中插入一条图书信息。为此需要使用 INSERT 命令,并在命令中写清表单名称以及对应的字段项。执行该命令之后即可完成图书写入信息。下面使用该命令插入一条图书信息,其中书名为 linuxprobe,价格和页数分别是 60 元和 518 页。在命令执行后也就意味着图书信息已经成功写入到数据表单中,然后就可以查询表单中的内容了。在使用 SELECT 命令查询表单内容时,需要加上想要查询的字段;如果想查看表单中的所有内容,则可以使用星号(*)通配符来显示:
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxprobe','60', '518');
Query OK, 1 row affected (0.001 sec) MariaDB [linuxprobe]> SELECT * from mybook;
+------------+-------+-------+
| name | price | pages |
+------------+-------+-------+
| linuxprobe | 60 | 518 |
+------------+-------+-------+
1 row in set (0.000 sec)
对数据库运维人员来讲,需要做好 4 门功课—增、删、改、查。这意味着创建数据表单并在其中插入内容仅仅是第一步,还需要掌握数据表单内容的修改方法。例如,可以使用UPDATE 命令将刚才插入的 linuxprobe 图书信息的价格修改为 55 元,然后再使用 SELECT 命令查看该图书的名称和定价信息。注意,因为这里只查看图书的名称和定价,而不涉及页码,所以无须再用星号通配符来显示所有内容。
MariaDB [linuxprobe]> UPDATE mybook SET price=55 ;
Query OK, 1 row affected (0.002 sec)
Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [linuxprobe]> SELECT name,price FROM mybook;
+------------+-------+
| name | price |
+------------+-------+
| linuxprobe | 55 |
+------------+-------+
1 row in set (0.000 sec)
想修改指定的某一条记录?没问题的,用 WHERE 命令进行限定即可。我们先插入两条图书信息:
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxcool','85', '300');
Query OK, 1 row affected (0.001 sec)
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxdown','105', '500');
Query OK, 1 row affected (0.001 sec)
然后使用 WHERE 命令仅将名称为 linuxcool 的图书价格修改为 60 元,不影响其他图书信息:
MariaDB [linuxprobe]> UPDATE mybook SET price=60 where name='linuxcool';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [linuxprobe]> select * from mybook;
+------------+-------+-------+
| name | price | pages |
+------------+-------+-------+
| linuxprobe | 55 | 518 |
| linuxcool | 60 | 300 |
| linuxdown | 105 | 500 |
+------------+-------+-------+
3 rows in set (0.001 sec)
还可以使用 DELETE 命令删除某个数据表单中的内容。下面使用 DELETE 命令删除数据表单 mybook 中的所有内容,然后再查看该表单中的内容,可以发现该表单内容为空了:
MariaDB [linuxprobe]> DELETE FROM mybook;
Query OK, 3 row affected (0.001 sec) MariaDB [linuxprobe]> SELECT * FROM mybook;
Empty set (0.000 sec)
一般来讲,数据表单中会存放成千上万条数据信息。比如我们刚刚创建的用于保存图书信息的 mybook 表单,随着时间的推移,里面的图书信息也会越来越多。在这样的情况下,如果只想查看其价格大于某个数值的图书,又该如何定义查询语句呢?
下面先使用 INSERT 插入命令依次插入 4 条图书信息:
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxprob
e1','30','518');
Query OK, 1 row affected (0.05 sec)
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxprob
e2','50','518');
Query OK, 1 row affected (0.05 sec)
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxprob
e3','80','518');
Query OK, 1 row affected (0.01 sec)
MariaDB [linuxprobe]> INSERT INTO mybook(name,price,pages) VALUES('linuxprobe
4','100','518');
Query OK, 1 row affected (0.00 sec)
要想让查询结果更加精准,就需要结合使用 SELECT 与 WHERE 命令了。其中,WHERE命令是在数据库中进行匹配查询的条件命令。通过设置查询条件,就可以仅查找出符合该条件的数据。表 18-3 列出了 WHERE 命令中常用的查询参数以及作用。
现在进入动手环节。分别在 mybook 表单中查找出价格大于 75 元或价格不等于 80 元的图书,其对应的命令如下所示。在熟悉了这两个查询条件之后,大家可以自行尝试精确查找图书名为 linuxprobe2 的图书信息。
MariaDB [linuxprobe]> SELECT * FROM mybook WHERE price>75;
+-------------+-------+-------+
| name | price | pages |
+-------------+-------+-------+
| linuxprobe3 | 80 | 518 |
| linuxprobe4 | 100 | 518 |
+-------------+-------+-------+
2 rows in set (0.001 sec) MariaDB [linuxprobe]> SELECT * FROM mybook WHERE price!=80;
+-------------+-------+-------+
| name | price | pages |
+-------------+-------+-------+
| linuxprobe1 | 30 | 518 |
| linuxprobe2 | 50 | 518 |
| linuxprobe4 | 100 | 518 |
+-------------+-------+-------+
3 rows in set (0.000 sec)
匹配的条件越多,获得的信息就越精准。在 WHERE 命令的后面追加 AND 操作符,可以进行多次匹配。例如,执行下述命令,找到价格为 30 元、页数为 518 的图书的名称:
MariaDB [linuxprobe]> SELECT * from mybook WHERE price=30 AND pages=518 ;
+-------------+-------+-------+
| name | price | pages|
+-------------+-------+-------+
| linuxprobe1 | 30 | 518 |
+-------------+-------+-------+
1 row in set (0.000 sec)
6. 数据库的备份及恢复
前文提到,本书的技术主线是 Linux 系统的运维方向,不会对数据库管理系统的操作进行深入的讲解,因此大家掌握了上面这些基本的数据库操作命令之后就足够了。下面要讲解的是数据库的备份以及恢复,这些知识比较实用,希望大家能够掌握。
mysqldump 命令用于备份数据库数据,格式为“mysqldump [参数] [数据库名称]”。其中参数与 mysql 命令大致相同,-u 参数用于定义登录数据库的用户名称,-p 参数表示密码提示符。下面将 linuxprobe 数据库中的内容导出为一个文件,并保存到 root 管理员的家目录中:
[root@linuxprobe~]# mysqldump -u root -p linuxprobe > /root/linuxprobeDB.dump
Enter password: (输入管理员的数据库密码)
然后进入 MariaDB 数据库管理系统,彻底删除 linuxprobe 数据库,这样 mybook 数据表单也将被彻底删除。然后重新建立 linuxprobe 数据库:
[root@linuxprobe~]# mysql -u root -p
Enter password: (输入管理员的数据库密码) MariaDB [(none)]> DROP DATABASE linuxprobe;
Query OK, 1 row affected (0.04 sec) MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.02 sec) MariaDB [(none)]> CREATE DATABASE linuxprobe;
Query OK, 1 row affected (0.00 sec)
接下来是见证数据恢复效果的时刻!使用输入重定向符把刚刚备份的数据库文件导入到mysql 命令中,然后执行该命令。接下来登录 MariaDB 数据库,就又能看到 linuxprobe 数据库以及 mybook 数据表单了。数据库恢复成功!
[root@linuxprobe~]# mysql -u root -p linuxprobe < /root/linuxprobeDB.dump
Enter password: (输入管理员的数据库密码)
[root@linuxprobe~]# mysql -u root -p
Enter password: (输入管理员的数据库密码)
MariaDB [(none)]> use linuxprobe;
Database changed MariaDB [linuxprobe]> SHOW tables;
+----------------------+
| Tables_in_linuxprobe |
+----------------------+
| mybook |
+----------------------+
1 row in set (0.000 sec) MariaDB [linuxprobe]> 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.002 sec)
相关文章:

第十七章 使用 MariaDB 数据库管理系统
1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代,互联网上每天都会生成海量的数据信息,数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)
1.插件版本 插件地址:Community Plugins | RabbitMQ rabbitmq插件需要对应的版本,根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是: 所以我选择插件版本是: 下载 .ez文…...

Unity性能优化---动态网格组合(一)
网格组合是将 Unity 中的多个对象组合为一个对象的技术。因此,在多物体的场景中,使用网格组合,会有效的减少小网格的数量,最终将得到一个包含许多小网格的大网格游戏对象,这将提高游戏或模拟器的性能。在Unity 的 “St…...

Appium:安装uiautomator2失败
目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …...

电子信息工程自动化 单片机彩灯控制
摘要 随着社会经济和科学技术的不断进步,人们在保持发展的同时,环境带给人类的影响已经不足以让我们忽视,所以城市的美化问题慢慢的进入了人们的眼帘,PLC的产生给带电子产品带来了巨大变革,彩灯的使用在城市的美化中变…...

word poi-tl 表格功能增强,实现表格功能垂直合并
目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加(插件实现)MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中,word文档需要垂直合并表格&…...

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式:私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型(Matlab&#…...

《鸿蒙开发-答案之书》 怎么设置Json字段的别名
《鸿蒙开发-答案之书》 怎么设置Json字段的别名 Android设置别名用的是SerializedName(“msg”),那鸿蒙用的是啥,有点懵不知道。 鸿蒙得引入第三方库:ohpm install class-transformer 然后用Expose({ name: ‘first-name’ }) 示例代码&…...

ftp服务器搭建-安装、配置及验证
ftp服务器搭建-安装、配置及验证 #安装 sudo apt-get install vsftpd #配置文件 cat > /etc/vsftpd.conf << "EOF" listenNO listen_ipv6YES anonymous_enableNO local_enableYES write_enableYES dirmessage_enableYES use_localtimeYES xferlog_enable…...

鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)
目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序
高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。 最好和平均的复杂度:…...

人工智能学习路线详细规划
一、引言 在当今科技飞速发展的时代,人工智能已成为引领未来的关键技术之一。无论是为了追求职业发展的新机遇,还是出于对这一前沿领域的浓厚兴趣,深入学习人工智能都是一个极具价值的选择。本文将为大家精心规划一条人工智能学习路线&#…...

深度学习之视觉处理
CNN 视觉处理三大任务:分类、目标检测、图像分割上游:提取特征,CNN下游:分类、目标、分割等,具体的任务 概述 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域, 往往我们输入的图像都很大&am…...

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。
遇到的问题: 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 !!! 2、查询服务器中MySQL中hive的数据库,发现创建的位置没有在hdfs上,而是在本地。 这个错误产生的原因是&…...

Spring Boot与Spring Security集成:前后分离认证流程的优化实践
在当前的Web开发领域,前后分离架构已经成为一种流行趋势。这种架构将前端和后端进行解耦,前端负责用户界面和交互逻辑,后端则负责数据处理和业务逻辑。在前后分离的项目中,如何安全、高效地实现用户认证是一个关键问题。本文将深入…...

设计模式——Chain(责任链)设计模式
摘要 责任链设计模式是一种行为设计模式,通过链式调用将请求逐一传递给一系列处理器,直到某个处理器处理了请求或所有处理器都未能处理。它解耦了请求的发送者和接收者,允许动态地将请求处理职责分配给多个对象,支持请求的灵活传…...

HarmonyOS(63) ArkUI 自定义占位组件NodeContainer
NodeContainer 1、前言2、NodeContainer和NodeController3、示例代码3.1、创建@Builder3.2、 创建NodeController3.3、 使用NodeCtroller4、NodeContainer的作用5、FrameNode简介6、BuilderNode简介7、参考资料1、前言 在HarmonyOS(62) ArkUI @Reusable组件复用原理讲了组件复…...

Python深度强化学习对冲策略:衍生品投资组合套期保值Black-Scholes、Heston模型分析...
全文链接:https://tecdat.cn/?p38463 本文提出了一个在存在交易成本、市场冲击、流动性约束或风险限制等市场摩擦的情况下,使用现代深度强化学习方法对衍生品投资组合进行套期保值的框架。我们讨论了标准强化学习方法如何应用于非线性奖励结构ÿ…...

【opencv入门教程】2. Point()类用法
文章选自: void Samples::PointFunc() {//输入二维点Point2f point2f(6, 2);cout << "【2维点】p " << point2f << ";\n" << endl;// 输入三维点Point3f point3f(8, 2, 0);cout << "【3维点】p3f "…...

前端导出excel实战(xlsx库和exceljs库)
一. 概览 前端导出excel是比较常见的需求,比如下载excel模板和批量导出excel。目前比较常用的库有xlsx和excel,接下来就着两种方式进行梳理。 二. 下载模板 xlsx库实现: 示例核心代码如下: const excelColumn {details: {ma…...

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo
项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo,完全适配HarmonyOS NEXT系统,实现了发送消息,添加好友等基础功能。代码开源,功能简洁,如果您有类似开发需求可以参考。 源码地址:https://github.c…...

Python库常用函数-数据分析
Python库常用函数 1.pandas库 (1)数据读取与写入 读取 CSV 文件: data pd.read_csv(file.csv)读取 Excel 文件: data pd.read_excel(file.xlsx, sheet_nameSheet1)写入 CSV 文件: data.to_csv(new_file.csv, ind…...

汽车EEA架构:架构的简介
1.架构的定义 汽车领域谈论的架构一词,来源于英文单词Architecture。在《系统架构:复杂系统的产品设计与开发》一书中对架构的定义如下:系统架构是一种概念的具象化,是物理或信息功能到形式元素的分配,是系统之内的元素之间的关系与周边环境…...

渗透测试--数据库攻击
这篇文章瘾小生其实想了很久,到底是放在何处,最终还是想着单拎出来总结,因为数据库攻击对我们而言非常重要,而且内容众多。本篇文章将讲述在各位获取数据库权限的情况下,各个数据库会被如何滥用,以及能够滥…...

反向路径转发(RPF)
本文介绍了反向路径转发(RPF)是如何在FortiGate上实现的。 它还解释了特定于VDOM的CLI设置“config system settings -> set strict-src-check”如何修改RPF行为。 测试场景中使用了以下设置 反向路径过滤器(又名RPF)是一种安…...

Python 正则表达式常用特殊字符及其含义
以下是 Python 正则表达式常用特殊字符及其含义 的全面整理,涵盖了常见和重要的正则符号,以及它们的示例,适合用来写博客或学习使用: Python 正则表达式常用特殊字符及其含义 1. . (点号) 含义:匹配除换行符 \n 以外…...

Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)
Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码) 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…...

SQL DML 语句
CREATE TABLE classes (ClassID varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 班级ID,ClassName varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 班级名称,TeacherID varchar(20) CHARACTER SET utf8mb4…...

饲料颗粒机全套设备有哪些机器组成
颗粒饲料机主要用于将各种饲料原料(如玉米、豆粕、麦麸、鱼粉等)进行混合、压制,制成颗粒状的饲料。这种饲料不仅方便储存和运输,还能提高动物的采食效率和饲料利用率。同时,颗粒饲料在加工过程中能灭部分微生物和寄生…...

MySQL事务与锁
定义一个事务向d_eams数据库的student表中插入3条记录,并检验若插入相同的学号,则回滚事务,既插入无效,否则成功提交 delimiter $$ create procedure tr_proc() begindeclare continue handler for sqlstate 23000beginrollback;…...