MySql(50)MySQL日志

news2024/11/20 15:30:03

文章目录

  • MySQL支持的日志
    • 日志类型
    • 日志的弊端
  • 慢查询日志(slow query log)
  • 通用查询日志
    • 查看当前状态
    • 启动日志
      • 永久启动
      • 临时启动
    • 查看日志
    • 删除\刷新日志
  • 错误日志(error log)
    • 删除\刷新日志
  • 二进制日志(bin log)
    • 查看默认情况
    • 日志参数设置
    • 查看日志
    • 使用日志恢复数据
    • 删除二进制日志
      • PURGE MASTER LOGS:删除指定日志文件
  • 再谈二进制日志(binlog)
    • 写入机制
    • binlog与redolog对比
    • 两阶段提交
  • 中继日志(relay log)
    • 查看中继日志

MySQL支持的日志

日志类型

MySQL有不同类型的日志文件,用来存储不同类型的日志,分为二进制日志、错误日志、通用查询日志和慢查询日志,这也是常用的4种。MySQL 8又新增两种支持的日志:中继日志和数据定义语句日志。使用这些日志文件,可以查看MySQL内部发生的事情。

这6类日志分别为:

  • 慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便对查询进行优化。
  • 通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
  • 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而从而对服务器进行维护。
  • 二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
  • 中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。
  • 数据定义语句日志:记录数据定义语句执行的元数据操作。除二进制日志外,其他日志都是文本文件。默认情况下,所有日志创建于MySQL数据目录中。

日志的弊端

  • 日志功能会降低MySQL数据库的性能。例如,在查询非常频繁的MySQL数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。
  • 日志会占用大量的磁盘空间。对于用户量非常大、操作非常频繁的数据库,日志文件需要的存储空间设置比数据库文件需要的存储空间还要大。

慢查询日志(slow query log)

性能分析工具的使用

通用查询日志

查看当前状态

SHOW VARIABLES LIKE '%general%';
/*
+------------------+------------------------------+
| Variable_name    |           Value   |
+------------------+------------------------------+
| general_log          | OFF                      | #通用查询日志处于关闭状态
| general_log_file | /var/lib/mysql/ttst01.log | #通用查询日志文件的名称是ttst01.log
+------------------+------------------------------+
*/

说明1∶系统变量general_log的值是OFF,即通用查询日志处于关闭状态。在MySQL中,这个参数的默认值是关闭的。因为一旦开启记录通用查询日志,MySQL 会记录所有的连接起止和相关的SQL操作,这样会消耗系统资源并且占用磁盘空间。我们可以通过手动修改变量的值,在需要的时候开启日志。

说明2:通用查询日志文件的名称是atguiguo1.log。存储路径是/var/lib/mysql/,默认也是数据路径。这样我们就知道在哪里可以查看通用查询日志的内容了

启动日志

永久启动

[mysqld]
general_log=ON
general_log_file="/path/filename" #日志文件所在目录路径,filename为日志文件名

如果不指定目录和文件名,通用查询日志将默认存储在MySQL数据目录中的hostname.log文件中,hostname表示主机名。

临时启动

SET GLOBAL general_log=on; # 开启通用查询日志
SET GLOBAL general_log_file=’path/filename’; # 设置日志文件保存位置

查看日志

通用查询日志是以文本文件 的形式存储在文件系统中的,可以使用文本编辑器 直接打开日志文件。每台MySQL服务器的通用查询日志内容是不同的。

/usr/sbin/mysqld, Version: 8.0.26 (MySQL Community Server - GPL). started with:

Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock	
Time	Id Command	Argument		
2022-01-04T07:44:58.052890Z	10	Query	SHOW VARIABLES LIKE '%general%'
2022-01-04T07:45:15.666672Z	10	Query	SHOW VARIABLES LIKE 'general_log%'
2022-01-04T07:45:28.970765Z	10	Query	select * from student	
2022-01-04T07:47:38.706804Z	11	Connect	root@localhost on  using Socket
2022-01-04T07:47:38.707435Z	11	Query	select @@version_comment limit 1
2022-01-04T07:48:21.384886Z	12	Connect	root@172.16.210.1 on	using TCP/IP
2022-01-04T07:48:21.385253Z	12	Query	SET NAMES utf8	
2022-01-04T07:48:21.385640Z	12	Query	USE `atguigu12`	
2022-01-04T07:48:21.386179Z	12	Query	SHOW FULL TABLES WHERE Table_Type !=
'VIEW'					
2022-01-04T07:48:23.901778Z	13	Connect	root@172.16.210.1 on	using TCP/IP
2022-01-04T07:48:23.902128Z	13	Query	SET NAMES utf8	
2022-01-04T07:48:23.905179Z	13	Query	USE `atguigu`	
2022-01-04T07:48:23.905825Z	13	Query	SHOW FULL TABLES WHERE Table_Type !=
'VIEW'					
2022-01-04T07:48:32.163833Z	14	Connect	root@172.16.210.1 on	using TCP/IP
2022-01-04T07:48:32.164451Z	14	Query	SET NAMES utf8	
2022-01-04T07:48:32.164840Z	14	Query	USE `atguigu`	
2022-01-04T07:48:40.006687Z	14	Query	select * from account	

在通用查询日志里面,我们可以清楚地看到,什么时候开启了新的客户端登陆数据库,登录之后做了什么 SQL 操作,针对的是哪个数据表等信息。

删除\刷新日志

如果数据的使用非常频繁,那么通用查询日志会占用服务器非常大的磁盘空间。数据管理员可以删除很长时间之前的查询日志,以保证MySQL服务器上的硬盘空间。

手动删除文件

SHOW VARIABLES LIKE 'general_log%';

可以看出,通用查询日志的目录默认为MySQL数据目录。在该目录下手动删除通用查询日志atguigu01.log。

使用如下命令重新生成查询日志文件,具体命令如下。刷新MySQL数据目录,发现创建了新的日志文件。前提一定要开启通用日志。

mysqladmin -uroot -p flush-logs

如果希望备份旧的通用查询日志,就必须先将旧的日志文件复制出来或者改名,然后执行上面的mysqladmin命令。正确流程如下

cd mysql-data-directory #输入自己的通用日志文件所在目录
mv mysql.general.log mysql.general.log.old #指名就的文件名 以及新的文件名
mysqladmin -uroot -p flush-logs

错误日志(error log)

错误日志记录了MySQL服务器启动、停止运行的时间,以及系统启动、运行和停止过程中的诊断信息,包括错误、警告和提示等。

通过错误日志可以查看系统的运行状态,便于即时发现故障、修复故障。如果MysQL服务出现异常,错误日志是发现问题、解决故障的首选。

在MySQL数据库中,错误日志功能是 默认开启 的。而且,错误日志 无法被禁止 。

删除\刷新日志

对于很久以前的错误日志,数据库管理员查看这些错误日志的可能性不大,可以将这些错误日志删除,以保证MySQL服务器上的 硬盘空间 。MySQL的错误日志是以文本文件的形式存储在文件系统中的,可以直接删除。

install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log

mysqladmin -uroot -p flush-logs
Enter password:
mysqladmin: refresh failed; error: 'Could not open file '/var/log/mysqld.log' for error logging.'

二进制日志(bin log)

binlog可以说是MySQL中比较 重要 的日志了,在日常开发及运维过程中,经常会遇到。

binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL 和 DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。

它以事件形式记录并保存在二进制文件中。通过这些信息,我们可以再现数据更新操作的全过程。

如果想要记录所有语句(例如,为了识别有问题的查询),需要使用通用查询日志。

binlog主要应用场景:

  1. 是用于数据恢复,如果MySQL数据库意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。
  2. 是用于数据复制,由于日志的延续性和时效性,master把它的二进制日志传递给slaves来达到master-slave数据—致的目的。

可以说MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据—致性。

在这里插入图片描述

查看默认情况

查看记录二进制日志是否开启:在MySQL8中默认情况下,二进制文件是开启的。

 show variables like '%log_bin%';	
/*
+---------------------------------	+----------------------------------	+
| Variable_name	| Value	|
+---------------------------------	+----------------------------------	+
| log_bin	| ON	|
| log_bin_basename	| /var/lib/mysql/binlog	|
| log_bin_index	| /var/lib/mysql/binlog.index	|
| log_bin_trust_function_creators	| OFF	|
| log_bin_use_v1_row_events	| OFF	|
| sql_log_bin	| ON	|
+---------------------------------	+----------------------------------	+
6 rows in set (0.00 sec)	
*/
  • log_bin_basename : 是binlog日志的基本文件名,后面会追加标识来表示每一个文件
  • log_bin_index:是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
  • log_bin_trust_function_creators:限制存储过程,前面我们已经讲过了,这是因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用
  • log_bin_use_v1_row_events 此只读系统变量已弃用。ON表示使用版本1二进制日志行,OFF表示使用版本2二进制日志行(MysQL 5.6的默认值为2)。

日志参数设置

新建的文件夹需要使用mysql用户,使用下面的命令即可。

chown -R -v mysql:mysql binlog
[mysqld]
#启用二进制日志
log-bin="/var/lib/mysql/binlog/atguigu-bin"
binlog_expire_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:此参数控制二进制日志文件保留的时长,单位是秒,默认2592000 3(天-- 14400 4小时; 86400 1天; 259200 3天;
  3. max_binlog_size:控制单个二进制日志大小,当前日志文件大小超过此变量时,执行切换动作。此参数的最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,可能不做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束。一般情况下可采取默认值

查看日志

当MySQL创建二进制日志文件时,先创建一个以“filename”为名称、以“.index”为后缀的文件,再创建一个以“filename”为名称、以“.000001”为后缀的文件。

MySQL服务 重新启动一次 ,以“.000001”为后缀的文件就会增加一个,并且后缀名按1递增。即日志文件的个数与MySQL服务启动的次数相同;如果日志长度超过了 max_binlog_size 的上限(默认是1GB),就会创建一个新的日志文件。

查看当前的二进制日志文件列表及大小。指令如下:

SHOW BINARY LOGS;	
/*	
+	--------------------	+	-----------	+-----------	+
| Log_name		|	File_size | Encrypted |
+	--------------------	+	-----------	+-----------	+
| atguigu-bin.000001	|	156	| No	|
+	--------------------	+	-----------	+-----------	+
1	行于数据集 (0.02	秒)				
*/						

下面命令将行事件以 伪SQL的形式 表现出来

mysqlbinlog -v "/var/lib/mysql/binlog/atguigu-bin.000002"
#220105	9:16:37 server id 1	end_log_pos 324 CRC32 0x6b31978b
Query
thread_id=10
exec_time=0	error_code=0
SET TIMESTAMP=1641345397/*!*/;
SET @@session.pseudo_thread_id=10/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb3 *//*!*/;
SET
@@session.character_set_client=33,@@session.collation_connection=33,@@session.collatio n_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 324
#220105	9:16:37 server id 1	end_log_pos 391 CRC32 0x74f89890	Table_map:
`atguigu14`.`student` mapped to number 85
# at 391
#220105	9:16:37 server id 1	end_log_pos 470 CRC32 0xc9920491	Update_rows: table id
85 flags: STMT_END_F
BINLOG '
dfHUYRMBAAAAQwAAAIcBAAAAAFUAAAAAAAEACWF0Z3VpZ3UxNAAHc3R1ZGVudAADAw8PBDwAHgAG
AQEAAgEhkJj4dA==
dfHUYR8BAAAATwAAANYBAAAAAFUAAAAAAAEAAgAD//8AAQAAAAblvKDkuIkG5LiA54+tAAEAAAAL
5byg5LiJX2JhY2sG5LiA54+tkQSSyQ==
'/*!*/;
###	UPDATE `atguigu`.`student`
###	WHERE
###	@1=1
###	@2='张三'
###	@3='一班'
###	SET
###	@1=1
###	@2='张三_back'
###	@3='一班'
# at 470
#220105 9:16:37 server id 1 end_log_pos 501 CRC32 0xca01d30f Xid = 15 COMMIT/*!*/;

前面的命令同时显示binlog格式的语句,使用如下命令不显示它

mysqlbinlog -v --base64-output=DECODE-ROWS "/var/lib/mysql/binlog/atguigu-bin.000002" #220105 9:16:37 server id 1 end_log_pos 324 CRC32 0x6b31978b Query thread_id=10
exec_time=0	error_code=0
SET TIMESTAMP=1641345397/*!*/;
SET @@session.pseudo_thread_id=10/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb3 *//*!*/;
SET
@@session.character_set_client=33,@@session.collation_connection=33,@@session.collatio n_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 324
#220105	9:16:37 server id 1	end_log_pos 391 CRC32 0x74f89890	Table_map:
`atguigu14`.`student` mapped to number 85
# at 391
#220105	9:16:37 server id 1	end_log_pos 470 CRC32 0xc9920491	Update_rows: table id
85 flags: STMT_END_F
###	UPDATE `atguigu14`.`student`
###	WHERE
###	@1=1
###	@2='张三'
###	@3='一班'
###	SET
###	@1=1
###	@2='张三_back'
###	@3='一班'
# at 470
#220105	9:16:37 server id 1	end_log_pos 501 CRC32 0xca01d30f	Xid = 15

使用日志恢复数据

如果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 :可以指定恢复数据的开始位置和结束位置。

删除二进制日志

MySQL的二进制文件可以配置自动删除,同时MySQL也提供了安全的手动删除二进制文件的方法。PURGE MASTER LOGS 只删除指定部分的二进制日志文件, RESET MASTER 删除所有的二进制日志文件。具体如下:

PURGE MASTER LOGS:删除指定日志文件

PURGE {MASTER | BINARY} LOGS TO ‘指定日志文件名’ PURGE {MASTER | BINARY} LOGS BEFORE ‘指定日期’

再谈二进制日志(binlog)

写入机制

binlog的写入时机也非常简单,事务执行过程中,先把日志写到 binlog cache ,事务提交的时候,再把binlog cache写到binlog文件中。因为一个事务的binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache。

我们可以通过binlog_cache_size参数控制单个线程binlog cache大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。binlog日志刷盘流程如下:

在这里插入图片描述

上图的write,是指把日志写入到文件系统的page cache,并没有把数据持久化到磁盘,所以速度比较快

上图的 fsync,才是将数据持久化到磁盘的操作

binlog与redolog对比

  • redo log 它是 物理日志 ,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎层产生的。

  • 而 binlog 是逻辑日志 ,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于 MySQL Server层。
    虽然它们都属于持久化的保证,但是侧重点不同。

  • redo log让InnoDB存储引擎拥有了崩溃恢复能力

  • binlog 保证了MySQL集群架构的数据一致性。

两阶段提交

在执行更新语句过程,会记录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日志恢复数据时,发现redolog还处于prepare阶段,并且没有对应binlog日志,就会回滚该事务。

在这里插入图片描述

中继日志(relay log)

中继日志只在主从服务器架构的从服务器上存在。从服务器为了与主服务器保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入本地的日志文件 中,这个从服务器本地的日志文件就叫中继日志。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步 。

搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。

文件名的格式是: 从服务器名 -relay-bin.序号 。中继日志还有一个索引文件: 从服务器名 -relay-bin.index ,用来定位当前正在使用的中继日志。

查看中继日志

SET TIMESTAMP=1618558728/*!*/;
BEGIN
/*
/*!*/;
# at 950
#210416 15:38:48 server id 1	end_log_pos 832 CRC32 0xcc16d651	Table_map:
`atguigu`.`test` mapped to number 91
# at 1000
#210416 15:38:48 server id 1	end_log_pos 872 CRC32 0x07e4047c	Delete_rows: table id
91 flags: STMT_END_F	-- server id 1 是主服务器,意思是主服务器删了一行数据
BINLOG '
CD95YBMBAAAAMgAAAEADAAAAAFsAAAAAAAEABGRlbW8ABHRlc3QAAQMAAQEBAFHWFsw=
CD95YCABAAAAKAAAAGgDAAAAAFsAAAAAAAEAAgAB/wABAAAAfATkBw==
'/*!*/;
# at 1040
*/

定位到表 atguigu.test 编号是 91 的记录,日志位置是 832;

删除编号是 91 的记录,日志位置是 872。
:38:48 server id 1 end_log_pos 872 CRC32 0x07e4047c Delete_rows: table id
91 flags: STMT_END_F – server id 1 是主服务器,意思是主服务器删了一行数据
BINLOG ’
CD95YBMBAAAAMgAAAEADAAAAAFsAAAAAAAEABGRlbW8ABHRlc3QAAQMAAQEBAFHWFsw=
CD95YCABAAAAKAAAAGgDAAAAAFsAAAAAAAEAAgAB/wABAAAAfATkBw==
'/!/;
#at 1040
*/


> 定位到表 atguigu.test 编号是 91 的记录,日志位置是 832;
> 
> 删除编号是 91 的记录,日志位置是 872。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 响应式对象的 api ,你全用过了吗?

文章目录Ⅰ. ref、reactive ( 递归监听 )Ⅱ. isRef、isReactive ( 判断 )Ⅲ. toRef 和 toRefs ( 解构 )Ⅳ. toRaw 、 markRaw ( 解除代理)Ⅴ. unref ( 拷贝 )Ⅵ. shallowRef 、shallowReactive( 非递归监听 )Ⅶ. triggerRef (强制更新&#x…

红黑树原理及旋转

红黑树,本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢?这就引出了红黑…

相似度_对抗学习:SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE: Simple Contrastive Learning of Sentence Embeddings 这篇论文,我觉得有意思。在创造对抗学习的正负例时,正例直接使用它本身。将同一个句子传递给预先训练好的编码器两次:通过应用两次dropout,我们可以得到两个不同的嵌…

云计算基础:云计算越来越广泛,我们应该如何去学习云计算

随着时代的发展,云计算越来越普及,越大众化,使用的人越来越多,我们应该如何去学习这门技术呢?这篇文章我们就来介绍如何学习我们的云计算。 学前介绍: 学前介绍 学习资料:HedEX Lite、产品文档、笔记、P…

非科班程序员被裁员后反而涨薪了200%,这两个月他都经历了哪些?

今年年初开始,裁员潮一浪接着一浪翻滚而来,让互联网人胆颤心惊,时刻担心下一波裁员是否就要降临到自己身上。 小帅(化名)是一个原本月薪8k,在小外包公司做政府项目的一名普通员工,前不久就被裁员…

数据仓库建模(四):维度表的设计

数据仓库建模(四):维度表的设计一、维度表的整体结构1.1 维度表的结构设计1.2 维度代理键1.3 自然键、超久键和超自然键1.4 下钻与上卷1.5 维度退化1.6 非规范化的扁平维度1.7 多层次维度1.8 维度属性的标识与状态信息1.9 维度表中的空值属性…

趣学算法(2)

14天阅读挑战赛 目录前言一 几类时间复杂度二 兔子数列1.问题分析2.方法13.方法24.方法3最后前言 这篇文章是《趣学算法》的读书笔记,也对数据结构与算法的初步介绍,阅读这篇文章,我会带你改进一个算法。 一 几类时间复杂度 常见的算法时间复…

Vue项目的记录(十三)

1.登录注册静态组件 assets这个文件夹放所有的组件公用的静态资源 在样式当中也可以使用符号,(src目录的别名),要注意的是在前面你加上~ 2.注册业务 这里的验证码,正常来说应该是要后台发送到用户手机上&#xff0c…

拓端tecdat|R语言辅导配对检验分析案例

全文链接:http://tecdat.cn/?p3424 原文出处:拓端数据部落公众号 什么是检验对? 检验对的形式 (x1,x2) 出现在两种情况中: 对同一实体执行两次测量。例如,一项评估新型胰岛素疗效…

C-文件操作实现数据持久化,帮你快速了解文件操作函数

目录 一.了解文件 二.文件的打开和关闭 三.顺序读写文件函数 fputc字符输入函数 fgetc字符输入函数 fputs文本行输出函数 fgets文本行输入函数 fprintf格式化输出函数 fscanf格式化输入函数 fwrite二进制输出函数 fread二进制输入函数 四. 解析上述的流 五.文件的随机…

Redis 主从安装-Centos

Redis 主从安装-Centos 由于机器有限,所以接下来的教程都是在一台虚拟机中进行部署安装. Redis主从工作原理 如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。master…

计算机网络--传输层

这篇博客博主应该在前天就要完成的,但是博主忙乱了,又堕落几天,希望大家别像我一样最近学习三天打鱼,两个天晒网的。此后博主为了激励自己重头再来,就特意换了个发型,哈哈。回到正题,传输层也是…

操作系统真相还原_第4章:进入保护模式

文章目录实模式的缺陷保护模式的扩展段寄存器的变化寄存器扩展寻址扩展全局描述符表GDT描述符格式字段含义进入保护模式步骤解释示例说明程序编写boot.incmbr.sloader.s编译并写入硬盘启动bochs执行实模式的缺陷 1、实模式下用户程序所引用的地址都是指向真实的物理地址&#…

计算机等级考试Python二级

补记录一下之前考Python二级的一些相关理论记录 数据结构与算法 算法杂度 算法复杂度用来衡量算法的优劣,它包括算法的时间复杂度和算法的空间复杂度 时间复杂度:执行算法所需要的计算量【所需要的计算工作量是用算法所执行的基本运算次数来度量的】 …

子串和子序列问题-动态规划向

1. 子串子序列问题概述 有关于子序列和子串的问题是字符串或者数组经常会遇到的问题,一般我们经常使用多指针,滑动窗口,回溯,动态规划的方式去解决,而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问…

Java开发手册解析_编程规约-集合处理

前言 《Java开发手册(黄山版)》编程规约-集合处理 该章节的知识点基本都来源于jdk源码,将结合源码及例子进行理解 备注:文章中的详细及说明为手册本身内容 博客地址:芒果橙的个人博客 【http://mangocheng.com】 1.【强…

服务与发现

文章目录服务与发现什么是服务发现应用层服务发现模式平台层服务发现模式服务与发现 假设你正在编写一些调用具有 REST API 的服务的代码,为了发出请求,你的代码需要知道服务实例的网络位置(IP 地址和端口),在物理硬件…

整型数据是如何在内存中存储的

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一. 整型在内存中的存储1.1 整型…

Vue2生命周期详细图解和代码

加油&#xff0c;新时代打工人&#xff01;&#xff01;&#xff01; 话不多说&#xff0c;看图。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

C语言数据结构——链表

C语言数据结构——链表 链表包括单链表&#xff0c;双链表&#xff0c;循环链表等。 而今天要说的是单链表&#xff0c;它是一个线性表&#xff0c;它在内存中是无序的&#xff0c;由一个个指针来连接。 图示&#xff1a; 小方块代表的就是存储的数据&#xff0c;箭头就是指…