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

postgresql数据库|wal日志的开启以及如何管理

一,

wal的基本概念

WAL即Write Ahead Log预写式日志,简称wal日志,相当于oracle中的redo日志。只是oracle中redo是固定几个redo日志文件,然后轮着切换去写入。pg中wal日志是动态切换,单个wal日志写满继续写下一个wal日志,连续不断生成wal日志。(可以简单理解为MySQL里面的binlog日志,虽然运行机制是完全不同的,但两者效果基本是一致的)

WAL的主要用途是用于故障恢复,针对数据库的数据insert/delete/update操作都会形成一些列的WAL日志记录,多个WAL日志组成WAL的日志序列,这些日志记录记录了哪些page做了什么修改。如果此时数据库发生故障(主机),哪些未被提交的事务或者需要回滚的事务可以从WAL中进行恢复。

另一个用途是搭建主从数据库以及迁移数据库。


二,

wal的参数

1,

wal_segment_size 参数

单个WAL文件的大小,默认为16MB,参数是wal_segment_size,可以理解为PG把Wal日志存储到N个大小为16M(默认值)的WAL segment file,一般不做更改,Postgresql 11版本之前只能在编译pg时指定,Postgresql 11版本开始支持 initdb(初始化数据库的时候) 和 pg_resetwal(一个postgresql的配置工具) 修改 WAL 文件大小

附注:pg_resetwal工具的简单使用

重设wal文件大小之前,需要停止数据库,并使用pg数据库的管理用户操作,设定的值只能是2的倍数,例如,16,32,64,128以此类推,单位为M,不得超过1G

因此,下面的修改,18是不被接受的,64可以接受

[root@EULEER pg_wal]# su - pg1 -c"pg_resetwal --wal-segsize=18 -D /usr/local/pgsql/data"
pg_resetwal: error: argument of --wal-segsize must be a power of 2 between 1 and 1024
[root@EULEER pg_wal]# su - pg1 -c"pg_resetwal --wal-segsize=64 -D /usr/local/pgsql/data"
Write-ahead log reset

再次启动数据库的时候,又报这个错了:

意思是min_wal_size的值必须至少是wal_segment_size的两倍,查看postgresql.conf配置文件,发现min_wal_size的默认值是80,因此,修改为128后启动成功。

[root@EULEER pg_wal]# bash ~/start-pgsql.sh 
waiting for server to start....2023-03-16 00:17:01.023 CST [31444] FATAL:  "min_wal_size" must be at least twice "wal_segment_size"
2023-03-16 00:17:01.023 CST [31444] LOG:  database system is shut downstopped waiting
pg_ctl: could not start server

启动数据库成功后,查看PGDATA目录下的pg_wal目录,可以看到wal日志大小变为了64M,原来默认的是16M

[root@EULEER pg_wal]# pwd
/usr/local/pgsql/data/pg_wal
[root@EULEER pg_wal]# ls -alh
total 65M
drwx------  3 pg1 pg1 4.0K Mar 16 00:15 .
drwx------ 19 pg1 pg1 4.0K Mar 16 00:18 ..
-rw-------  1 pg1 pg1  64M Mar 16 00:24 00000002000000000000000A
-rw-------  1 pg1 pg1   33 Mar 15 20:15 00000002.history
drwx------  2 pg1 pg1 4.0K Mar 16 00:14 archive_status

三,

wal文件的查看

oracle的redo日志是没有内置程序查看的,但MySQL里有,postgresql的查看redo日志程序是pg_waldump

登陆psql客户端,执行一下命令,查询现在postgresql在使用哪个wal文件(此命令是函数嵌套):

如果是开启了备份功能,也就是archive,该文件将会复制到备份目录内,也就是postgresql.conf这个配置文件里的cp命令干的事情(本例是/usr/local/pgsql/backup目录)。


archive_mode = on               # enables archiving; off, on, or always# (change requires restart)
archive_command = ' cp %p /usr/local/pgsql/backup/%f'        
postgres=# select pg_walfile_name(pg_current_wal_lsn());pg_walfile_name      
--------------------------00000001000000000000000B
(1 row)

可以看到,确实是有  00000001000000000000000B

[root@EULEER pg_wal]# ls -al
total 65548
drwx------  3 pg1 pg1     4096 Mar 16 04:38 .
drwx------ 19 pg1 pg1     4096 Mar 16 04:23 ..
-rw-------  1 pg1 pg1 16777216 Mar 16 04:38 00000001000000000000000B
-rw-------  1 pg1 pg1 16777216 Mar 16 04:23 00000001000000000000000C
-rw-------  1 pg1 pg1 16777216 Mar 16 04:12 00000001000000000000000D
-rw-------  1 pg1 pg1 16777216 Mar 16 04:36 00000001000000000000000E
drwx------  2 pg1 pg1     4096 Mar 16 04:38 archive_status
[root@EULEER pg_wal]# 

查看wal日志文件有多少个(和上面的命令互相印证,是一致的):

postgres=# select count(*) from pg_ls_waldir();         count 
-------4
(1 row)
[root@EULEER pg_wal]# ls -al
total 65548
drwx------  3 pg1 pg1     4096 Mar 16 04:38 .
drwx------ 19 pg1 pg1     4096 Mar 16 04:23 ..
-rw-------  1 pg1 pg1 16777216 Mar 16 04:38 00000001000000000000000B
-rw-------  1 pg1 pg1 16777216 Mar 16 04:23 00000001000000000000000C
-rw-------  1 pg1 pg1 16777216 Mar 16 04:12 00000001000000000000000D
-rw-------  1 pg1 pg1 16777216 Mar 16 04:36 00000001000000000000000E
drwx------  2 pg1 pg1     4096 Mar 16 04:38 archive_status
[root@EULEER pg_wal]# 

随便找一个表,做增删改操作,这里是删除一个表:

postgres=# \dt+List of relationsSchema |   Name   | Type  |  Owner   |    Size    | Description 
--------+----------+-------+----------+------------+-------------public | bonus    | table | postgres | 8192 bytes | public | dept     | table | postgres | 16 kB      | public | emp      | table | postgres | 16 kB      | public | salgrade | table | postgres | 16 kB      | 
(4 rows)
postgres=# drop table bonus;
DROP TABLE

持续刷新wal日志文件,类似于tail -f 命令:

pg_waldump -f 00000002000000000000000C
[root@EULEER data]# pg_waldump pg_wal/00000001000000000000000C 
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/0C000028, prev 0/0B0000D8, desc: CHECKPOINT_SHUTDOWN redo 0/C000028; tli 1; prev tli 1; fpw true; xid 0:518; oid 16420; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0C0000A0, prev 0/0C000028, desc: RUNNING_XACTS nextXid 518 latestCompletedXid 517 oldestRunningXid 518
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0C0000D8, prev 0/0C0000A0, desc: RUNNING_XACTS nextXid 518 latestCompletedXid 517 oldestRunningXid 518
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/0C000110, prev 0/0C0000D8, desc: CHECKPOINT_ONLINE redo 0/C0000D8; tli 1; prev tli 1; fpw true; xid 0:518; oid 16420; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 518; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0C000188, prev 0/0C000110, desc: RUNNING_XACTS nextXid 518 latestCompletedXid 517 oldestRunningXid 518
rmgr: Heap        len (rec/tot):     65/  1141, tx:        518, lsn: 0/0C0001C0, prev 0/0C000188, desc: HOT_UPDATE off 12 xmax 518 flags 0x00 ; new off 15 xmax 0, blkref #0: rel 1663/16386/16395 blk 0 FPW
rmgr: Transaction len (rec/tot):     34/    34, tx:        518, lsn: 0/0C000638, prev 0/0C0001C0, desc: COMMIT 2023-03-16 08:29:11.019821 CST
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/0C000660, prev 0/0C000638, desc: RUNNING_XACTS nextXid 519 latestCompletedXid 518 oldestRunningXid 519

刷新出来如下内容:

以上表明删除表的事务ID是572,因此,需要使用前一位的事务ID571来进行恢复,恢复前需要停止数据库:

root@EULEER data]# bash ~/stop-pgsql.sh 
waiting for server to shut down....2023-03-16 02:01:28.827 CST [8091] LOG:  received fast shutdown request
2023-03-16 02:01:28.830 CST [8091] LOG:  aborting any active transactions
2023-03-16 02:01:28.831 CST [8395] FATAL:  terminating connection due to administrator command
2023-03-16 02:01:28.832 CST [8200] FATAL:  terminating connection due to administrator command
2023-03-16 02:01:28.847 CST [8091] LOG:  background worker "logical replication launcher" (PID 8099) exited with exit code 1
2023-03-16 02:01:28.847 CST [8093] LOG:  shutting down
.2023-03-16 02:01:30.231 CST [8091] LOG:  database system is shut downdone
server stopped[root@EULEER data]# su - pg1 -c "pg_resetwal -x 571 -D /usr/local/pgsql/data/"
Write-ahead log reset
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/14000138, prev 0/14000100, desc: RUNNING_XACTS nextXid 518 latestCompletedXid 517 oldestRunningXid 518
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/14000170, prev 0/14000138, desc: CHECKPOINT_ONLINE redo 0/14000138; tli 1; prev tli 1; fpw true; xid 0:518; oid 16420; multi 1; offset 0; oldest xid 479 in DB 16386; oldest multi 1 in DB 16386; oldest/newest commit timestamp xid: 0/0; oldest running xid 518; online
rmgr: Heap        len (rec/tot):     59/  1511, tx:        518, lsn: 0/140001E8, prev 0/14000170, desc: DELETE off 7 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1262 blk 0 FPW
rmgr: Heap        len (rec/tot):     59/   923, tx:        518, lsn: 0/140007D0, prev 0/140001E8, desc: DELETE off 11 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1214 blk 0 FPW
rmgr: Heap        len (rec/tot):     54/    54, tx:        518, lsn: 0/14000B70, prev 0/140007D0, desc: DELETE off 12 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1214 blk 0
rmgr: Heap        len (rec/tot):     54/    54, tx:        518, lsn: 0/14000BA8, prev 0/14000B70, desc: DELETE off 13 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1214 blk 0
rmgr: Heap        len (rec/tot):     54/    54, tx:        518, lsn: 0/14000BE0, prev 0/14000BA8, desc: DELETE off 14 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1214 blk 0
rmgr: Heap        len (rec/tot):     54/    54, tx:        518, lsn: 0/14000C18, prev 0/14000BE0, desc: DELETE off 10 flags 0x00 KEYS_UPDATED , blkref #0: rel 1664/0/1214 blk 0
rmgr: Standby     len (rec/tot):     54/    54, tx:          0, lsn: 0/14000C50, prev 0/14000C18, desc: RUNNING_XACTS nextXid 519 latestCompletedXid 517 oldestRunningXid 518; 1 xacts: 518
rmgr: Standby     len (rec/tot):     54/    54, tx:          0, lsn: 0/14000C88, prev 0/14000C50, desc: RUNNING_XACTS nextXid 519 latestCompletedXid 517 oldestRunningXid 518; 1 xacts: 518
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/14000CC0, prev 0/14000C88, desc: CHECKPOINT_ONLINE redo 0/14000C88; tli 1; prev tli 1; fpw true; xid 0:519; oid 16420; multi 1; offset 0; oldest xid 479 in DB 16386; oldest multi 1 in DB 16386; oldest/newest commit timestamp xid: 0/0; oldest running xid 518; online
rmgr: Database    len (rec/tot):     34/    34, tx:        518, lsn: 0/14000D38, prev 0/14000CC0, desc: DROP dir 1663/16386
rmgr: Transaction len (rec/tot):     82/    82, tx:        518, lsn: 0/14000D60, prev 0/14000D38, desc: COMMIT 2023-03-16 08:46:05.921552 CST; inval msgs: catcache 21 snapshot 1214; sync
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/14000DB8, prev 0/14000D60, desc: RUNNING_XACTS nextXid 519 latestCompletedXid 518 oldestRunningXid 519

查询当前事务ID:

postgres=# SELECT CAST(txid_current() AS text);txid_current 
--------------520
(1 row)

利用arclog目录内的归档文件恢复指定事务:

那么现在恢复到删除表前的话,应该是518这个事务了,编辑主配置文件,然后基础备份文件解压替换原来的data文件,重启就可以了。

restore_command = 'cp /usr/local/pgsql/arclog/%f %p'
recovery_target_xid = '518'

以上简单的演示了归档文件的查看和使用,其实可以确定的一点就是,arclog归档文件就是配合pg_basebackup命令恢复用的

四,

arclog文件的管理

[postgres@node1 arclog]$ pwd
/usr/local/pgsql/arclog[postgres@node1 arclog]$ ll
total 1179656
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 16:31 000000010000000100000003
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 16:31 000000010000000100000004
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 16:36 000000010000000100000005
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 16:37 000000010000000100000006
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 16:37 000000010000000100000007
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 17:21 000000010000000100000008
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 17:21 000000010000000100000009
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 17:21 00000001000000010000000A
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 17:21 00000001000000010000000B
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 17:31 00000001000000010000000C
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:01 00000001000000010000000D
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:06 00000001000000010000000E
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:09 00000001000000010000000F
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:17 000000010000000100000010
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:17 000000010000000100000011
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:18 000000010000000100000012
-rwxr-x--- 1 postgres postgres      340 Sep 30 18:18 000000010000000100000012.00000028.backup
-rwxr-x--- 1 postgres postgres 67108864 Sep 30 18:18 000000010000000100000013
-rw-r----- 1 postgres postgres 67108864 Sep 30 18:46 000000020000000100000014
-rw-r----- 1 postgres postgres       34 Sep 30 18:31 00000002.history

如何清理这些文件呢?如果你确定最近短期内不会进行任何恢复工作的话:

[root@node1 pg_wal]# pg_controldata |grep "REDO WAL"
Latest checkpoint's REDO WAL file:    000000020000000100000015[root@node1 pg_wal]# pg_archivecleanup -d /usr/local/pgsql/arclog/ 000000020000000100000015

可以先试运行,在正式删除,参数-n是试运行,-d 是详细输出:

[root@node1 arclog]# pg_archivecleanup  -n  /usr/local/pgsql/arclog/  000000020000000100000019
/usr/local/pgsql/arclog//000000020000000100000015
/usr/local/pgsql/arclog//000000020000000100000016
/usr/local/pgsql/arclog//000000020000000100000017
/usr/local/pgsql/arclog//000000020000000100000018
[root@node1 arclog]# pg_archivecleanup  -d  /usr/local/pgsql/arclog/  000000020000000100000019
pg_archivecleanup: keeping WAL file "/usr/local/pgsql/arclog//000000020000000100000019" and later
pg_archivecleanup: removing file "/usr/local/pgsql/arclog//000000020000000100000015"
pg_archivecleanup: removing file "/usr/local/pgsql/arclog//000000020000000100000016"
pg_archivecleanup: removing file "/usr/local/pgsql/arclog//000000020000000100000017"
pg_archivecleanup: removing file "/usr/local/pgsql/arclog//000000020000000100000018"

五,

arclog的拷贝命令

将归档文件复制到指定目录:
archive_command = 'cp %p /path/to/archive/%f'
1.
使用rsync将归档文件复制到远程服务器:
archive_command = 'rsync -av %p user@remote:/path/to/archive/%f'
2.
将归档文件压缩后复制到指定目录:
archive_command = 'gzip -c %p > /path/to/archive/%f.gz'
3.
将归档文件发送到AWS S3存储桶:
archive_command = 'aws s3 cp %p s3://my-bucket/archive/%f'

这些主要是针对磁盘空间比较少的情况,通常使用压缩或者rsync 推送到远程服务器上,比如,在本地压缩:

archive_mode = on               # enables archiving; off, on, or always# (change requires restart)
archive_command = 'test ! -f /usr/local/pgsql/arclog/%f && gzip -c  %p >/usr/local/pgsql/arclog/%f.gz' 
[root@node1 arclog]# ls -alh
total 65M
drwxr-x---  2 postgres postgres 161 Sep 30 21:57 .
drwxr-x---. 8 postgres postgres  82 Sep 30 13:28 ..
-rwxr-x---  1 postgres postgres 340 Sep 30 18:18 000000010000000100000012.00000028.backup
-rw-r-----  1 postgres postgres 64M Sep 30 21:56 000000020000000100000019
-rw-r-----  1 postgres postgres 64K Sep 30 21:57 00000002000000010000001A.gz
-rw-r-----  1 postgres postgres  34 Sep 30 18:31 00000002.history

可以看到,很明显的压缩后,归档文件小了很多很多

未完待续!!!


 

相关文章:

postgresql数据库|wal日志的开启以及如何管理

一, wal的基本概念 WAL即Write Ahead Log预写式日志,简称wal日志,相当于oracle中的redo日志。只是oracle中redo是固定几个redo日志文件,然后轮着切换去写入。pg中wal日志是动态切换,单个wal日志写满继续写下一个wal日志,连续不断生成wal日志。&#xf…...

小波变换学习笔记【1】

【声明】本博客为学习B站视频小波分解与重构所做笔记,供自己和大家查阅学习,想查看 up 原视频请移步 B 站,侵删。 1.1 小波变换的由来 傅里叶变换基本思想:将信号分解成一系列不同频率的连续正弦波的叠加。 其缺点是,…...

雷柏mv20鼠标使用体验

用了1年多,第一次用竖着的鼠标,现在已经很习惯了,感觉还不错。说说使用感受: 1、 仍然是长时间使用鼠标,但是很少出现手腕痛的情况,确实是有一定效果的。 2、使用场景是有限制的,我是配合笔记…...

【分布式云储存】Springboot微服务接入MinIO实现文件服务

文章目录 前言技术回顾准备工作申请accessKey\secretKey创建数据存储桶公共资源直接访问测试 接入springboot实现文件服务依赖引入配置文件MinIO配置MinIO工具类 OkHttpSSLSocketClient兼容ssl静态资源预览解决方案资源上传预览测试测试结果 前言 上篇博客我们介绍了分布式云存…...

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化,拟牛…...

ThemeForest – Canvas 7.2.0 – 多用途 HTML5 模板

ThemeForest 上的 HTML 网站模板受到全球数百万客户的喜爱。与包含网站所有页面并允许您在 WP 仪表板中自定义字体和样式的 WordPress 主题不同,这些设计模板是用 HTML 构建的。您可以在 HTML 编辑器中编辑模板,但不能在 WordPress 上编辑模板&#xff0…...

本地部署 川虎 Chat

本地部署 川虎 Chat 1. 川虎 Chat 项目概述2. Github 地址3. 部署 川虎 Chat4. 配置 config.json5. 启动 川虎 Chat 1. 川虎 Chat 项目概述 为ChatGPT等多种LLM提供了一个轻快好用的Web图形界面和众多附加功能。 支持 GPT-4 基于文件问答 LLM本地部署 联网搜索 Agent 助理…...

IntelliJ IDEA 控制台中文乱码的四种解决方法

前言 IntelliJ IDEA 如果不进行配置的话,运行程序时控制台有时候会遇到中文乱码,中文乱码问题非常严重,甚至影响我们对信息的获取和程序的跟踪。开发体验非常不好。 本文中我总结出四点用于解决控制台中文乱码问题的方法,希望有助…...

23岁准备转行嵌入式

前端难找工作,而且感觉没有前景,我觉得我就算入行也不会干多久,软件开发让我感觉不到实在的东西。小时候喜欢去动手制作一些玩具,我对实在一些的东西感兴趣一些例如手表,小机器人等等一些。我有保持坚持学习下去的动力…...

http请求报错:406 Not Acceptable的解决办法

目录 应用场景 基本概念 解决方法 方法一: 方法二: 方法三: 应用场景 接口在返回结果集的时候出现了406的报错,但是返回String类型不会报错,正常返回。 基本概念 406 Not Acceptable是一个HTTP响应状态码&…...

信息化发展75

数字化治理 数字化治理通常指依托互联网、大数据、人工智能等技术和应用,创新社会治理方法与手段,优化社会治理模式,推进社会治理的科学化、精细化、高效化,助力社会治理现代化。数字化治理是数字经济的组成部分之一,…...

C++八股

1、简述一下C中的多态 在面向对象中,多态是指通过基类的指针或引用,在运行时动态调用实际绑定对象函数的行为,与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择…...

Nat. Commun. | 大规模高分辨单光子成像

本文由论文作者团队(课题组)投稿 单光子雪崩二极管(Single Photon Avalanche Diode,简称SPAD)阵列因其极佳的单光子灵敏度而受到广泛关注,已广泛应用于量子通信与计算、荧光寿命成像、时间飞行成像等各个领域。与同样具有较高灵敏度的EMCCD和sCMOS相比,SPAD阵列能够在极…...

Android开源库

见:GitHub - eHackyd/Android_OpenSourceLibrary: Android开源库的学习笔记...

【小程序 - 基础】页面导航、页面事件、生命周期、WXS脚本_04

目录 一、页面导航 1. 什么是页面导航 2. 小程序中实现页面导航的两种方式 2.1 声明式导航 2.1.1 导航到 tabBar 页面 2.1.2 导航到非 tabBar 页面 2.1.3 后退导航 2.2 编程式导航 2.2.1 导航到 tabBar 页面 2.2.2 导航到非 tabBar 页面 2.2.3 后退导航 2.3. 导航…...

矩阵求导数

矩阵 A ∣ 1 2 1 2 − 1 3 ∣ , 计算 f ( x ) ∣ ∣ A x ∣ ∣ 2 ∣ ∣ x ∣ ∣ 2 的最大值。 矩阵A \begin {vmatrix} 1 & 2 & 1\\2 & -1 & 3 \end {vmatrix},计算f(x) \frac{||Ax||_2}{||x||_2}的最大值。 矩阵A ​12​2−1​13​ ​,计算f(x)∣∣x∣∣2…...

竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据疫…...

数据结构--栈

线性表的定义 前面文章有讲过,线性表就是一次保存单个同类型元素,多个元素之间逻辑上连续 例子:数组,栈,队列,字符串 栈 1.1 栈和队列的特点 栈和队列都是操作受限的线性表。 前面学过的数组,…...

期权定价模型系列【7】:Barone-Adesi-Whaley定价模型

期权定价模型系列第7篇文章 1.前言 目前大连商品交易所、郑州商品交易所、以及上海期货交易所的所有商品期权都为美式期权,并且大商所的所有期权合约会根据BAW(Barone-Adesi-Whaley)美式期权定价模型计算新上市期权合约的挂牌基准价。 BAW模型(Barone-Adesi and W…...

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板,图表在中继器表格里填写具体的数据,调整坐标系后,就可以根据表格数据自动生成对应高度的圆柱图,鼠标移入时,可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...