当前位置: 首页 > news >正文

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

sql多表联查图文

内连接&#xff08;INNER JOIN&#xff09; 语法&#xff1a; SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 表2.列名;示例&#xff1a; SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 表2.列名;左外连接&#xff08;LEFT JOIN&#xff09; 语法 SELECT 列名 FROM…...

网络安全——防火墙

基本概念 防火墙是一个系统&#xff0c;通过过滤传输数据达到防止未经授权的网络传输侵入私有网络&#xff0c;阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障&#xff0c;因为网上总有黑客和恶意攻击入侵私有网络来破坏&#xff0c;防火…...

单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能

感谢您提供的详细日志信息。根据您的反馈&#xff0c;问题可能出在 pyautogui 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题&#xff1a; 1. **确保 pyautogui 正确执行点击操作**&#xff1a; - 我们将添加更多的调…...

图片底部空白缝隙解决法方案(CSS)

当我想实现一个垂直轮播图时&#xff0c;图片底部会出现一个空白缝隙导致切换轮播图片显示不完整。 这里可以用两个方法解决 一、给图片添加(垂直对齐)vertical-align:baseline|middle|top; vertical-align属性的值可以是 &#xff08;1&#xff09;关键字值:baseline|midd…...

URI 未注册(设置 语言和框架 架构和 DTD)

一、问题描述&#xff1a;在springboot项目中的resources中新建mybatis-config.xml文件时&#xff0c;从mybatis文档中复制的代码报错&#xff1a;URI 未注册(设置 | 语言和框架 | 架构和 DTD) 二、解决&#xff1a;在Springboot项目的设置->架构和DTD中添加 红色的网址&…...

STL-string类

目录 string类的意义 C语言原始的字符串 字符串类题目 string类 string类文档 auto和范围for auto是个关键字 范围for string类的接口 string的模拟实现 浅拷贝 深拷贝 写时拷贝 string类的意义 C语言原始的字符串 字符串是以\0结尾的字符的合集,为了方便操作,C标准库提…...

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…...

C++的一些经典算法

以下是C的一些经典算法&#xff1a; 一、排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a; 它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换…...

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的SGD优化器案例实现

SGD优化器基本原理讲解 随机梯度下降&#xff08;SGD&#xff09;是一种迭代方法&#xff0c;其背后基本思想最早可以追溯到1950年代的Robbins-Monro算法&#xff0c;用于优化可微分目标函数。 它可以被视为梯度下降优化的随机近似&#xff0c;因为它用实际梯度&#xff08;从…...

μC/OS-Ⅱ源码学习(3)---事件模型

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始&#xff0c;进入事件源码的学习。 事件模型 在一个多任务系统里&#xff0c;各个任务在系统的统筹下相继执行&#xff0c;由于执行速度极快&a…...

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…...

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…...

移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX

演示地址&#xff1a; http://134.175.123.194:8811 admin admin 演示视频&#xff1a; https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报&#xff08;内置Modbus TCP/RTU/ASCII,GPS协…...

CSS 浮动定位

浮动定位 float : 浮动定位 left 左浮动right 右浮动 clear : 清除浮动 leftrightboth 浮动定位会导致 元素脱离正常文档流 、 对应的 父 元素 也可能会产生 高度坍塌 。 解决 父元素 高度坍塌的方案有&#xff1a; 1&#xff09; 父元素 添加 overflow , 值 为 除 visible 之…...

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

声明 因为这份文档我是边做边写的&#xff0c;遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7&#xff0c;后台为192.168.20.7:5480 后期请自行对应&#xff0c;后面的192.168.20.57请对应192.168.20.7&#xff0c;或根据自己的来 第一阶段…...

Android Webview 详解

一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前&#xff1a;Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后&#xff1a;直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & 调用…...

如何使用程序查询域名whois信息?

直接使用TCP协议向WHOIS服务器的43端口发送查询请求即可返回WHOIS信息。 一些国际域名(.COM/.NET/.CC等)需要继续向各注册商的WHOIS服务服务发送查询请求来获取详细信息。 大部分New gTLD来说&#xff0c;服务器是“whois.nic.[后缀]”&#xff0c;例如.red的WHOIS服务器为whoi…...

解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败

&#x1f609; 你好呀&#xff0c;我是爱编程的Sherry&#xff0c;很高兴在这里遇见你&#xff01;我是一名拥有十多年开发经验的前端工程师。这一路走来&#xff0c;面对困难时也曾感到迷茫&#xff0c;凭借不懈的努力和坚持&#xff0c;重新找到了前进的方向。我的人生格言是…...

复杂系统如何架构?

一张图看懂整个后端系统架构 下图展示了整个后端系统架构&#xff0c;包括数据库、应用服务器、API网关等&#xff0c;展示了它们是如何协同工作的。 一些小贴士 CDN是现代互联网架构中不可或缺的一部分&#xff0c;特别是对于那些需要向全球用户提供高性能和高可用性服务的网站…...

leetcode 3224. 使差值相等的最少数组改动次数

题目链接&#xff1a;3224. 使差值相等的最少数组改动次数 题目&#xff1a; 给你一个长度为 n 的整数数组 nums &#xff0c;n 是偶数 &#xff0c;同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中&#xff0c;你可以将数组中任一元素替换为 0 到 k 之间的任一…...

C# 小案例(IT资产管理系统)

开发工具&#xff1a;visual studio 2022 语言&#xff1a;C# 数据库&#xff1a;Sql Server 2008 页面展示 一、登录 二、主窗体 三、用户管理 四、资产管理 五、关于 Java版地址&#xff1a;基于若依开发物品管理系统(springbootvue)_若依物品管理系统-CSDN博客 Python版…...

React第十四节useState使用详解差异

一、useState() Hook 使用 useState视图更新用法 1、写法&#xff1a; import { useState } from react const [name, setName] useState(Andy)利用数组解构写法&#xff0c; 第一个参数是自定义的属性&#xff0c;用于初始化时候渲染&#xff0c;如上面代码&#xff0c;初…...

ubuntu 安装 docker详细教程

1. 准备工作 1.1系统更新 sudo apt update sudo apt upgrade -y 1.2 检查系统版本 lsb_release -a 2.安装docker 2.1. 安装依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 2.2 添加docker 官方GPG密钥 curl -fsSL https…...

图书管理系统|Java|SSM|JSP| 前后端分离

【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、M…...

Apache Echarts和POI

目录 Apache ECharts 介绍 入门 绘制一个简单的图表 Apache POI 介绍 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 导出Excel表格 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xf…...

ubuntu下的chattts 学习8(结束):长文本的语音转换优化及总结

代码 import ChatTTS import torch import numpy as np import torchaudio import re# 设置环境变量以避免内存碎片化 import os os.environ[PYTORCH_CUDA_ALLOC_CONF] expandable_segments:True# 使用 CPU 进行计算 device torch.device(cpu)chat ChatTTS.Chat() chat.loa…...

Luckysheet 实现 excel 多人在线协同编辑(全功能实现增强版)

前言 感谢大家对 Multi person online edit(多人在线编辑器) 项目的支持&#xff0c;mpoe 项目使用 quill、luckysheet、canvas-editor 实现的 md、excel、word 在线协同编辑&#xff0c;欢迎大家Fork 代码&#xff0c;多多 Start哦~ Multi person online edit 多人协同编辑器…...

最新VMware Workstation Pro领先的免费桌面虚拟化软件基于 x86 的 Windows 桌面虚拟化软件下载安装保姆级教程,直接下载,持续更新

目录 说明 安装程序下载 方法一&#xff1a;直接下载 方法二&#xff1a;官网下载 安装教程 说明 这几天重装电脑&#xff0c;想装VMware Workstation&#xff0c;搜了之后才发现它竟然对个人用户免费了&#xff0c;一个字&#xff1a;爽&#xff01;终于可以结束百度序列号…...

GitHub使用

太久不用GitHub发现自己又有些不会了&#xff0c;突发奇想为何不把每次看到的有指导意义的博客收录一下以便下次查阅呢 如何上传文件夹到GitHub上&#xff08;配图详解&#xff09;&#xff1f;_github上傳資料夾-CSDN博客 github上如何删除自己的仓库_github删除仓库-CSDN博…...

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖&#xff08;基于c语言&#xff09; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载&#xff1a;http://nginx.org/en/do…...

linux 用户名密码设置

安装linux时默认的密码最小长度是5个字节&#xff0c;但这并不够&#xff0c;要把它设为8个字节。修改最短密码长度需要编辑login.defs文件#vi /etc/login.defs PASS_MAX_DAYS 99999 #&#xff03;密码设置最长有效期&#xff08;默认值) PASS_MIN_DAYS 0 ##密…...

MySQL是否可以配合Keepalived实现高可用

MySQL是否可以配合Keepalived实现高可用 是的&#xff0c;MySQL 可以配合 Keepalived 实现高可用性。通常&#xff0c;使用 Keepalived 与 MySQL 配合的方式主要是通过配置 虚拟IP&#xff08;VIP&#xff09; 来实现主从数据库的自动切换&#xff0c;从而保证在主数据库宕机时…...

windows下 mysql开启 binlog日志

一、查看是否开启 binlog -- 方式一 show binary logs;-- 方式二 show VARIABLES like log_bin 说明没有开启 方式一 &#xff1a;you are not using binary logging 方式二&#xff1a;log_bin off 二、编辑 my.ini 配置文件 默认安装地点位于&#xff1a;C:\ProgramDat…...

59. 螺旋矩阵 II

59. 螺旋矩阵 II class Solution { public:vector<vector<int>> generateMatrix(int n) {// for(int i0;i<n;i){ 这样的遍历方式不对// for(int j 0;j<n;j){// generateMatrix[i][j] // }// } //初始化矩阵vector<vector<int&…...

XML 查看器:深入理解与高效使用

XML 查看器&#xff1a;深入理解与高效使用 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它通过使用标签来定义数据结构&#xff0c;使得数据既易于人类阅读&#xff0c;也易于机器解析。在本文中&#xff0c;我们将探讨 XML 查看器的功能…...

JDBC学习

配置文件 application.yml spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/rbac?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTC driver-class-name: com.mysql.jdbc.Driverrbac为我自己本地的数据库&…...

单元测试

junit5中五个方法为&#xff1a;Test、BeforeEach&#xff08;修饰实例方法&#xff0c;在测试方法开始之前执行&#xff09;、AfterEach&#xff08;修饰实例方法&#xff0c;在测试方法完成之后开始执行&#xff09;、BeforeAll&#xff08;修饰静态static方法&#xff0c;在…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

spring boot通过连接池的方式连接时序库IotDB

1、maven依赖 <dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>1.3.2</version></dependency>2、配置文件 iotdb:server:url: localhostport: 6667name: rootpwd: rootmax…...

maven多模块开发

目录 聚合 可选依赖 排除依赖 属性 打包 聚合 聚合就是将多个模块组成一个整体&#xff0c;进行项目构建。聚合工程&#xff08;也称为多模块项目&#xff09;是 Maven 的一种项目结构&#xff0c;它允许将一个大型项目拆分为多个较小的、更易于管理的子模块。每个子模块…...

Kubernetes Nginx-Ingress | 禁用HSTS/禁止重定向到https

目录 前言禁用HSTS禁止重定向到https关闭 HSTS 和设置 ssl-redirect 为 false 的区别 前言 客户请求经过ingress到服务后&#xff0c;默认加上了strict-transport-security&#xff0c;导致客户服务跨域请求失败&#xff0c;具体Response Headers信息如下&#xff1b; 分析 n…...

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…...

linux 安装composer

下载composer curl -sS https://getcomposer.org/installer | php下载后设置环境变量&#xff0c;直接通过命令composer -v mv composer.phar /usr/local/bin/composer查看版本看是否安装成功 composer -v...

ESP32-S3模组上跑通ES8388(24)

接前一篇文章:ESP32-S3模组上跑通ES8388(23) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析完了es8388_init函数中的第8段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在components\audio_hal\driver\es8388\es8388.c中,如下: ​ …...

类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。

类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。 这个错误表明你的项目尝试加载的 .class 文件&#xff08;编译好的 Java 类&#xff09;是用比你的运行环境支持更高版本的 Java 编译的。具体来说&#xff1a; 版本 61.0 对应 Ja…...

AI 的时代,新科技和新技术如何推动跨学科的整合?

在当前AI的发展中&#xff0c;我们面临的一个主要挑战就是融合的问题&#xff0c;这实际上不仅是技术上的融合&#xff0c;还有更深层次的哲学层面的思考。 或许在中国这方面的讨论较少&#xff0c;但在西方哲学和神学的语境中&#xff0c;探讨万物的根本和不同学科之间的联系…...

12.9-12.16学习周报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、SNN与传统ANN的比较1.SNN概述2.SNN神经元和ANN的比较结构3.spikingjelly1.数据格式2.状态的保存和重置3.传播模式4.神经元 二、图数据库1.图数据库…...

CanFestival移植到STM32 F4芯片(基于HAL库)

本文讲述如何通过简单操作就可以把CanFestival库移植到STM32 F4芯片上&#xff0c;作为Slave设备。使用启明欣欣的工控板来做实验。 一 硬件连接 观察CAN报文需要专门的设备&#xff0c;本人从某宝上买了一个兼容PCAN的开源小板子&#xff0c;二十几块钱&#xff0c;通过USB接…...