MySQL 其他数据库日志
我们了解数据库事务时,知道两种日志:重做日志,回滚日志。
对于线上数据库应用系统,突然遭遇 数据库宕机 怎么办?在这种情况下,定位宕机的原因 就非常关键。我们可以查看数据库的 错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注释等信息。比如: 从日志中发现某个连接中的sql操作发生了死循环,导致内存不足,被系统强行终止了。明确了原因,处理起来也就轻松了,系统很快就恢复运行了。
除了发现错误,日志在数据库复制,数据恢复,操作审计,以及确保数据的永久和一致性等方面,都有着不可替代的作用。
千万不要小看日志。很多看似奇怪的问题,答案就往往藏在日志里。很多情况下只有通过查看日志才能发现问题的原因,真正解决问题。所以,一定要学会查看日志,养成检查日志的习惯,对提升你的数据库应用开发能力至关重要。
1. MySQL支持的日志
1.1 日志类型
mysql有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志,错误日志,通用查询日志 和 慢查询日志,这也是常用的4中。mysql8由新增两种支持的日志:中继日志 和 数据定义语句日志。使用这些日志文件,可以查看MySQL内部发生的事情。
这6类日志分别为:
~ 慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
~ 通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景,发现问题,甚至是对数据库操作的审计都有很大帮助。
~ 错误日志:记录MySQL服务启动,运行或停止MySQL服务时出现问题,方便我们了解服务器的状态,从而对服务器进行维护。
~ 二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
~ 中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。
~ 数据定义语句日志:记录数据定义语句执行的元数据操作。
除了二进制日志外,其他日志都是文本文件。默认情况下,所有日志创建于MySQL数据目录中。
1.2 日志的弊端
~ 日志功能会 降低MySQL数据库的性能。例如,在查询非常频繁的MySQL数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。
~ 日志会 占用大量的磁盘空间。对于用户量非常大,操作非常频繁的数据库,日志文件需要的存储空间设置比数据库文件需要的存储空间还要大。
2. 慢查询日志
性能分析工具章节explian已经讲过。
3. 通用查询日志
通用查询日志用来 记录用户的所有操作,包括启动和关闭mysql服务,所有用户的连接开始时间和截止时间,发给MySQL数据库服务器的所有sql指令等。当我们的数据发生异常时,查看通用查询日志,还原操作时的具体场景,可以帮助我们准确定位问题。
3.1 问题场景
在电商系统中,购买商品并且使用微信支付完成以后,却发现支付中心的记录并没有新增,此时用户再次使用支付宝支付,就会出现重复支付的问题。但是当去数据库中查询数据的时候,会发现只有一条记录存在。那么此时给到的现象就是只有一条支付记录,但是用户却支付了两次。
我们对系统进行了仔细检查,没有发现数据问题,因为用户编号和订单编号以及第三方流水号都是对的。可是用户确实支付了两次,这个时候,我们想到了检查通用查询日志,看看当天到底发生了什么。
查看之后,发现1月1日下午2点,用户使用微信支付完成以后,但是由于网络故障,支付中心没有及时收到微信支付的回调通知,导致当时没有写入数据。1月1日下午2点30,用户又使用支付宝支付,此时记录更新到支付中心。1月1日晚上9点,微信的回调通知过来了,但是支付中心已经存在了支付宝的记录,所以只能覆盖记录了。
由于网络的原因导致了重复支付。至于解决问题的方案就很多了,这里省略。
可以看到通用查询日志可以帮助我们了解操作发生的具体时间和操作的细解,对找出异常发生的原因极其关键。
3.2 查看当前状态
show variables like '%general%';
1. general_log 默认关闭,即通用查询日志处于关闭状态。在mysql中,这个参数的默认值是关闭的。因为一旦开启记录通用查询日志,MySQL会记录所有的连接起止和相关的sql操作,这样很消耗系统资源并且占用磁盘空间。我们可以通过手动修改变量的值,在需要的时候开启日志。
2. 通用查询日志文件的名称是iz2ze30kmgo52sv7anqvviz.log。存储路径是/var/lib/mysql,默认也是数据库路径。这样我们就知道在哪里可以查看通用查询日志的内容了。
3.3 启动日志
方式一:永久启动
修改my.cnf或者my.ini配置文件来设置。在mysql组下加入log选项,并重启MySQL服务。
[mysqld]
general_log=ON
general_log_file=[path[filename]] # 日志文件所在的目录路径,filename为日志文件名
方式二:临时性方式set global general_log=on; # 开启通用查询日志
4. 错误日志
错误日志记录了MySQL服务器启动,停止运行的时间,以及系统启动,运行和停止过程中的诊断信息,包括错误,警告和提示等。
通过错误日志可以查看系统的运行状态,便于及时发现故障,修复故障。如果MySQL服务出现异常,错误日志时发现问题,解决故障的首选。
4.1 启动日志
在MySQL数据库中,错误日志功能是默认开启的,错误日志无法被禁止。
默认情况下,错误日志存储在MySQL数据库的数据文件夹下,名称默认为 mysqld.log(linux系统下)或 hostname.err (mac系统下)。如果需要制定文件名,则需要在没my.cnf或者my.ini中做如下配置:
[mysqld]
log-error=[path/[filename]] # path为日志文件所在的目录路径。
修改配置项后,需要重启MySQL服务已生效。
4.2 查看日志
MySQL错误日志是以文本形式存储的,可以使用文本编辑器直接查看。
查询错误日志的存储路径:
show variables like 'log_err%';
日志内容如下图所示
可以看到,错误日志文件中记录了服务器启动的时间,以及存储引擎innodb启动和停止的时间等。我们在做初始化的时候生成的数据库初始密码也是记录在error.log中。
4.3 删除/刷新日志
对于很久以前的错误日志,数据库管理员查看这些错误日志的可能性不大,可以将这些错误日志删除,以保证mysql服务器上的硬盘空间。MySQL的错误日志是以文本形式存储在文件系统中的。可以直接删除。
5. 二进制日志
binlog可以说是MySQL比较重要的日志了,在日常开发及运维过程中,经常会遇到。
binlog即binary log,二进制日志文件,也叫做变更日志。它记录了数据库所有执行的ddl和dml等数据库更新时间的语句,但是不包含没有修改任何数据的语句。
它以 事件形式 记录并保存在 二进制文件中。通过这些信息,我们可以在线数据更新操作的全过程。
binlog主要应用场景:
~ 一是用于数据恢复,如果MySQL数据库意外停止,可以通过二进制日志文件来查看用户执行了那些操作,对数据库服务器文件做了那些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。
~ 二是用户数据复制,由于日志的延续性和时效性,master把它的二进制日志传递给slaves来达到master-slaves数据一直的目的。
可以说MySQL数据库的数据备份,主备,主主,主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

5.1 查看默认情况
查看记录二进制文件是否开启:在MySQL8.0中默认情况下,二进制文件是开启的。
show variables like '%log_bin%';
log_bin_basenam:是binlog日志的基本文件名,后面会追加标识来表示每一个文件
log_bin_index:是binlog文件的索引文件,这个文件管理所有的binlog文件的目录
log_bin_trust_function_creators;显示存储过程,前面我们已经讲过了,这是因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建,修改,调用
log_bin_user_v1_row_events:此只读系统变量已弃用。on表示使用版本1二进制日志行,off表示使用版本2二进制日志行。
5.2 日志参数设置
方式1:永久性方式
修改MySQL的my.cnf或my.ini文件可以设置二进制日志的相关参数:
[mysqld]
# 启用二进制文件
# 给二进制文件命名
log-bin=atguigu-bin
# 日志保存时间
binlog_exprire_logs_seconds=600
# 日志文件上限大小
max_binlog_size=100M
提示:1. log-bin=mysql-bin # 打开日志(主机需要打开),这个mysql-bin也可以自定义,这里也可以加上路径,如 /home/www/mysql_bin_log/mysql-bin
2. binlog_expire_logs_seconds:此参数控制二进制日志文件保留的时长,单位是S,默认是30天
3.max_binlog_size:控制单个二进制文件日志的大小,当前日志文件大小超过此变量,执行切换操作。此参数的最大和默认值是1GB,该设置并不能严格控制binlog的大小,尤其是binlog比较靠近最大值而由于到一个比较大事务时,为了保证事务的完整性,可能不做切换日志的动作,只能将该事务的所有sql都记录进当前日志,知道事务结束。一般情况下可采取默认值。
方式二:临时性方式如果不希望通过修改配置文件并重启的方式设置二进制日志的话,还可以使用如下指令,需要注意的是在mysql8中只有会话级别的设置,没有global级别的设置了。
# 会话级别设置 set sql_log_bin=0;
5.3 查看日志
当MySQL创建二进制日志文件时,先创建一个以'filename'为名称,以'.index'为后缀的文件,再创建一个以'filename'为名称,以‘.00001’为后缀的文件。
MySQL服务重新启动一次,以'.00001'为后桌的文件就会增加一个,并且后缀名按1递增。即日志文件的个数与MySQL服务启动的次数相同;如果日志长度超过了max_binlog_size上线,就会创建一个新的日志文件。
查看当前二进制日志文件列表及大小。指令如下:
show binary logs;
所有对数据库的修改都会记录到binlog中。但binlog 是二进制文件,无法直接查看,想要更直观的观测它就要借助mysqlbinlog命令工具了。指令如下:在查看执行,先执行一条sql语句。
update student set name='张三' where id = 1;开始查询binlog
show binlog events in 'atguigu-bin.00002';将二进制文件格式化输出, 对应下面两个事务。
5.4 使用日志恢复数据
如果MySQL服务器启用了二进制日志,在数据库出现意外丢失数据时,可以使用MySQLbinlog工具从指定的时间点开始直到现在或另一个指定的时间点的日志中恢复数据。
mysqlbinlog恢复数据的语法如下:
mysqlbinlog [option] filename | mysql -uuser -ppass;
这个命令可以这样理解:使用mysqlbinlog命令来读取filename中的内容,然后使用mysql命令将这些内容恢复到数据库中。
~ filename:是日志文件名。
~ option:可选项,比较重要的两队option参数是--start-date,--stop-date和--start-position,--stop-position。
~ --start-date,--stop-date:可以指定恢复数据库的起始时间点和结束时间点。
~ --start-position,--stop-position:可以指定恢复数据的开始位置和结束位置。
案例:
# 查看表中数据 select * form student;
此时插入三条记录:
insert into student(id,name,class) values (20, 'aaa', 'No.1'); insert into student(id,name,class) values (21, 'aaa', 'No.1'); insert into student(id,name,class) values (22, 'aaa', 'No.1');
删除一个id=20的数据
误操作,将id>20 的全部删除
这个时候dml已经完成提交,无法回滚,我们上述操作,此时已经记录到binlog日志中,使用binlog日志文件进行恢复。
查看binlog日志文件
使用binlog日志进行恢复,其实就是在修改表,恢复的同时,又会给日志文件新增日志。这时候建议开辟一个新的日志文件, flush log开辟一个新的日志文件。
此时我们可以把002文件看作是恢复数据的文件。
恢复数据有两种方式,一种是position,一种是时间恢复。
我们使用position方式进行恢复数据。
首先恢复三条新增数据,此时查找到的pos_id如下:
从事务开启的beginid开始恢复,884 - 1729恢复这个区间段。恢复语句:
/use/bin/mysqlbinlog --start-position=884 --stop-position=1729 --databases=atguigu3 /var/lib/mysql/binlog/atguiu-bin.00005 | /use/bin/mysql -uroot -p123456 -v atguigu3
5.5 删除二进制日志
MySQL的二进制文件可以配置自动删除,同时MySQL也提供了安全的手动删除二进制文件的方式。purge master logs 只删除指定部分的二进制日志,reset master 删除所有的二进制日志。具体如下:
1. purge master logs: 删除指定的日志文件
purge {master | binary} logs to '指定日志文件名';
purge {master | binary} logs before '指定日志文件名';
举例: 使用purge master logs语句删除创建时间比binlog.00005早的所有日志(1)多次重新启动MySQL,便于生成多个日志文件。然后用show语句显示二进制日志文件列表
show binary logs;(2)执行purge master logs语句删除创建时间比binlog.00005早的所有日志
purge master logs to 'binlog.00005';(3)显示二进制日志文件列表
show binary logs;比binlog.00005早的所有日志文件都删除了。
5.6 其他场景
二进制日志可以通过数据库的 全量备份 和二进制日志保存的 增量信息,完成数据库的 无损恢复。但是,如果遇到数据量大,数据库和数据表很多(比如分库分表的应用)的场景,用二进制日志进行数据恢复,是很有挑战性的,因为起此位置不容易管理。
在这种情况下,一个有效的解决办法是 配置主从数据库服务器,甚至是 一主多从 的架构,把二进制文件的内容通过中继日志,同步到从数据库服务器中,这样就可以有效避免数据库故障导致数据异常等问题。
6. 在谈二进制日志
6.1 写入机制
binlog的写入时机也非常简单,事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。因为一个事务的binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个快内存作为binlog cache。
我们可以通过binlog_cache_size 参数控制单个线程binlog cache大小,如果存储内容超过了这个参数,就要暂存到磁盘。binlog日志刷盘流程如下:

上图的write,是指把日志写入到文件系统的page cache,并没有把数据持久化到磁盘,所以速度比较快
上图的fsync,才是将数据持久化到磁盘的操作
write和fsync的时机,可以由参数 sync_binlog控制,默认是0。为0的时候,表示每次提交事务都只会write,由系统自行判断什么时候执行fsync。虽然性能得到提升,但是机器宕机,page cache里面的binlog会丢失。如下图:

为了安全起见,可以设置为1,表示每次提交事务都会执行fsync,就如同redo log刷盘流程一样。
最后还有一种折中方式,可以设置为N(N>1),表示每次提交事务都write,但累计N个事务后才fsync。

6.2 binlog与redolog对比
redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于innodb存储引擎层产生的。
binlog是逻辑日志,记录内容是语句的原始逻辑,类似于“给ID=2这一行的C字段加1”,属于mysql server层的。
~ 虽然他们都数据持久化的保证,但是侧重点不同。
1. redo log 让innodb存储引擎拥有了崩溃恢复的能力
2. binlog保证了mysql集群架构数据的一致性
6.3 两阶段提交
在执行更细语句过程,会记录redo log与binlog两块日志,已基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的写入时机不同。

redo log 与binlog两份日志之间的逻辑不一致,会出现什么问题?
以update语句为例,假设id=2的记录,字段c值时0,把字段c值更新成1,sql语句为update T set c=1 where id=2.
假设执行过程中写完redo log日志后,binlog日志写期间发生了异常,会出现什么情况?

由于binlog没写完就异常了,这时候binlog里面没有对应的修改记录。因此,之后用binlog日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而源库因为redo log日志恢复,这一行c值是1,最终数据不一致。

为了解决两份日志之间的逻辑一致问题,innodb存储引擎使用两阶段提交方案。原理很简单,将redo log的写入拆分成两个步骤prepare和commit,这就是两阶段提交。
使用两阶段提交后,写入binlog时发生异常也不会有影响,因为MySQL根据redo log日志恢复数据时,发现redo log还处于prepare阶段,并且没有对应binlog日志,就会回滚该事务。

另一个场景,redo log设置commit阶段发生异常,那会不会回滚事务呢?

并不会回滚事务,他会执行上图逻辑,虽然redo log是出于prepare阶段,但是能通过事务id找到对应的binlog日志,所以MySQL认为是完整的,就会提交事务恢复数据。
7. 中继日志
7.1 介绍
中继日志只在主从服务器架构的从服务器上存在。从服务器为了与主服务器保持一直,要从服务器读取二进制日志的内容,并且把读取到的信息写入 本地的日志文件中。这个从服务器本地的日志文件就叫 中继日志。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步。
搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。
文件名的格式是:从服务器名-relay-bin.序号。中继日志还有一个索引文件:从服务器名-relay-bin.index ,用来定位当前正在使用的中继日志。
7.2 查看中继日志
中继日志查看与二进制日志查看相同,可以用mysqlbinlog工具进行查看。
7.3 恢复的典型错误
如果从服务器宕机,有的时候为了系统恢复,要重装操作系统,这样就可能会导致你的 服务器名称 与之前 不同。而中继日志里是 包含从服务器名 的。在这种情况下,就可能导致你恢复服务器的时候,无法从宕机前的中继日志里读取数据,以为是日志文件损坏了,其实是名称不对。
解决方法也很简单,把从服务器的名称改回之前的名称。
相关文章:
MySQL 其他数据库日志
我们了解数据库事务时,知道两种日志:重做日志,回滚日志。 对于线上数据库应用系统,突然遭遇 数据库宕机 怎么办?在这种情况下,定位宕机的原因 就非常关键。我们可以查看数据库的 错误日志。因为日志中记录…...
为何企业和开发团队应该重视进行兼容性测试
随着科技的不断进步和软件的广泛应用,保证软件在不同平台和环境下正常运行变得至关重要。本文将探讨软件兼容性测试的重要性和好处,并介绍为何企业和开发团队应该重视进行兼容性测试,以确保软件的稳定性和用户体验。 提供用户友好的体验 软件…...
牛客网Verilog刷题——VL51
牛客网Verilog刷题——VL51 题目答案 题目 请编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号zero,当置位信号set 有效时,将当前输出置为输入的数值set_num。模块的接口信号图如下: 模块的时序图…...
从零实现深度学习框架——Transformer从菜鸟到高手(一)
引言 💡本文为🔗[从零实现深度学习框架]系列文章内部限免文章,更多限免文章见 🔗专栏目录。 本着“凡我不能创造的,我就不能理解”的思想,系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…...
数组指针
数组指针的定义 1.数组指针是指针还是数组? 指针。 int a 10;int* p &a;//指向整型数据的指针 char b w;char* q &b;//指向字符变量的指针 所以数组指针应该是指向数组的指针。 2.数组指针应该怎么定义? int arr[10] { 0 };int(*p)[10] …...
C++设计模式之过滤器设计模式
C过滤器设计模式 什么是过滤器设计模式 过滤器设计模式是一种行为型设计模式,它允许你在特定的条件下对输入或输出进行过滤,以便实现不同的功能。 该模式有什么优缺点 优点 可扩展性:过滤器设计模式允许您轻松地添加、删除或替换过滤器&a…...
SpringBoot整合RedisTemplate操作Redis数据库详解(提供Gitee源码)
前言:简单分享一下我在实际开发当中如何使用SpringBoot操作Redis数据库的技术分享,完整的代码我都提供了出来,大家按需复制使用即可! 目录 一、导入pom依赖 二、yml配置文件 三、使用FastJson序列化 四、核心配置类 五、工具…...
SQL 执行计划管理(SPM)
一、SPM 需求背景 任何数据库应用程序的性能在很大程度上都依赖于查询执行,尽管优化器无需用户干预就可以评估最佳计划,但是 SQL 语句的执行计划仍可能由于以下多种原因发生意外更改:版本升级、重新收集优化器统计信息、改变优化器参数或模式…...
浅谈微服务异步解决方案
导言 异步是一种设计思想,不是设计目的,因此不要为了异步而异步,要有所为,有所不为。 异步不是『银弹』, 避免试图套用一个『异步框架』解决所有问题, 需要根据不同的业务特点或要求,选择合适的…...
【音视频SDK测评】线上K歌软件开发技术选型
摘要 在线K歌软件的开发有许多技术难点,需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外,此外,开发者还应关注音乐版权问题,确保开发的应用合规合法。 前言 前面写了几期关于直播 …...
Jackson:String转object反序列化失败
场景 消费mq时String转Object 代码 for (MessageExt msg : msgs) {String msgBody new String(msg.getBody(), StandardCharsets.UTF_8);BinlogEvent binlogEvent JsonUtil.silentString2Object(msgBody, BinlogEvent.class);binlogEvent.setPort(Long.valueOf(port));tCo…...
Spark_Core---6
spark 相关概念补充 课程目标 了解spark的安装部署知道spark作业提交集群的过程 6.1 spark的安装部署 1、下载spark安装包 http://spark.apache.org/downloads.html 高版本不存在cdh的编译版本,可以从官网下载源码版本,指定高版本hadoop进行编译 编译…...
游戏运营需要什么条件和准备?
游戏运营是一个复杂的过程,需要综合考虑多个因素。以下是一些游戏运营需要的条件和准备: 1、良好的游戏产品 首先,需要有一款优秀、有吸引力的游戏产品。游戏的质量和内容决定了用户是否愿意下载、留存和付费。 2、游戏运营团队 拥有专业…...
SVN限制Message提交的格式
限制Message提交的格式必须为以下格式 [Version] [Description] [TPA] [Doors] REPOS"$1" TXN"$2"# Make sure that the log message contains some text. SVNLOOK/usr/bin/svnlook MSG$SVNLOOK log -t "$TXN" "$REPOS"if [[ $MSG ~ …...
windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本
目录 一、anaconda安装及虚拟环境创建 1.anaconda的下载 2.Anaconda的安装 3.创建虚拟环境 3.1 环境启动 3.2 切换镜像源 3.3环境创建 3.4 激活环境 3.5删除环境 二、pycharm安装 1.pycharm下载 2.pycharm的安装 三、CUDA的安装 1.GPU版本和CUDA版本、cudnn版本、显卡…...
【计算机网络】传输层协议 -- UDP协议
文章目录 1. 传输层相关知识1.1 端口号1.2 端口号范围划分1.3 知名端口号1.4 一些相关命令 2. UDP协议2.1 UDP协议格式2.2 UDP协议的特点2.3 什么是面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议 1. 传输层相关知识 传输层是计算机网络中的一个重要层…...
python制作超高难度走迷宫游戏,你要来挑战嘛~(赶紧收藏)
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 走迷宫,是一项充满智慧的挑战~ 作为经常刷短视频的我们,见识过不少迷宫小游戏 当然印象深刻的当然是小动物走迷宫 这里有几组挑战走迷宫的小可爱。先来看看吧! (1ÿ…...
springboot整合tio-websocket方案实现简易聊天
写在最前: 常用的http协议是无状态的,且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式,所以引入了websocket协议,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务…...
《TCP IP网络编程》第十三章
第 13 章 多种 I/O 函数 13.1 send & recv 函数 Linux 中的 send & recv: send 函数定义: #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags); /* 成功时返回发送的字节数,失败…...
驱动开发 day8 (设备树驱动,按键中断实现led亮灭)
//编译驱动 (注意Makefile的编译到移植到开发板的内核) make archarm //清除编译生成文件 make clean ****************************************** //安装驱动 insmod mycdev.ko //卸载驱动 rmmod mycdev 需要在<内核路径>/arch/arm/boot/dts/ 修改 stm32mp157a-fsm…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...















