首页 文章 精选 留言 我的

精选列表

搜索[PostgreSQL],共4398篇文章
优秀的个人博客,低调大师

PostgreSQL pg_rewind实例--could not find previous WA

一、介绍 作为pg_rewind报错章节补充一个用例,说明其用法。 二、实例 1、history文件 --新主 $ cat 00000004.history 1 0/140000C8 no recovery target specified 2 0/19000060 no recovery target specified 3 0/1F000090 no recovery target specified --老主 $ cat 00000003.history 1 0/140000C8 no recovery target specified 2 0/19000060 no recovery target specified 2、查找分叉点 说明:findCommonAncestorTimeline: 1)比较sourceHistory[0]、targetHistory[0]的时间线和begin的值,可以得出两者相等,则转到第2个条目的比较 2)比较sourceHistory[1]、targetHistory[1]的时间线和begin的值,可以得出两者相等,则转到第3个条目的比较 3)比较sourceHistory[2]、targetHistory[2]的时间线和begin的值,可以得出两者相等,此时比较结束 4)取第3个条目进行返回:MinXLogRecPtr(sourceHistory[i].end, targetHistory[i].end),此时返回的是sourceHistory[i].end的值作为分叉点,即 0/1F000090 3、此时ControlFile_target.checkPoint < divergerec && target的chkptendrec!=divergerec,所以可以进行pg_rewind 4、findLastCheckpoint查找分叉点divergerec之前最近的checkpoint作为rewind起点。 1)首先需要定位到分叉点divergerec开始的记录,然后根据该记录的xl_prev指针定位前一个wal记录 2)判断第1)步得到的wal记录是否是checkpoint,如果不是则重新返回到第1),直到找到checkpoint点 3)这里就有个问题,如果得到的分叉点正好是老主结束位置,即本例:1F000090为分叉点,实际上是老主和新主没有发生数据分叉,可以认为是没有作为备没有接收完新主数据呢 4)target从1F000090这个位置开始获取prev指针向前找checkpoint时,因为这个位置后都是0了,所以不能继续向下遍历找了,报错:could not find previous WAL record at %X/%X 三、小结 这里pg_rewind执行时,判断不出来没有分叉的情景,即本文的场景。此时执行pg_rewind会报错,让用户还以为WAL文件由损坏导致执行pg_rewind失败。这个工具如果能够将这种场景识别出来,报不需要rewind是不是更好? 四、pg_rewind原理及报错流程分析参考 https://blog.51cto.com/yanzongshuai/2368285https://blog.51cto.com/yanzongshuai/2334303

优秀的个人博客,低调大师

PostgreSQL 数据库内外查询速度比较

数据库内使用 Rust 编写存储过程,使用pgxr程序库; 数据库外使用 Go 语言,使用pgx连接数据库进行查询; 逻辑都是查询某个表的字段列表,循环执行10000次; 测试结果如下: Rust 存储过程: test_sql_speed: 26.810285862s Go 连接数据库查询: 32.746561715s Go 语言只建立一次连接。 看来复用连接的话开销很小的嘛,一次只需要花费 0.5 毫秒左右。 然后,又测试了最简单的 SQL 查询:SELECT 1,同样也是 10000 次; 这次,Rust 存储过程: test_sql_speed: 67.651917ms Go 连接数据库查询: 1.261617769s 数据库内查询那是相当快的,这样算来每次处理连接的耗时大概在 0.1 毫秒左右。 源代码如下: Rust #[no_mangle] pub extern "C" fn test_sql_speed(_fcinfo: FunctionCallInfo) -> Datum { let sys_time = SystemTime::now(); for _ in 1..10000 { let _i = query_for_int("select 1"); } let difference = SystemTime::now().duration_since(sys_time) .expect("SystemTime::duration_since failed"); eprintln!("test_sql_speed: {:?}", difference); PG_RETURN_I32(1) } Go func main() { db := openDbConnection() start := time.Now() i := 0 for i = 1; i <= 10000; i++ { db.Query(`SELECT 1`) } t := time.Now() elapsed := t.Sub(start) fmt.Printf("%v\n", elapsed) } 后来发现用于查询表字段的方法效率不行,是从 information_schema 这个 ANSI 标准目录里去查的,后来看了一些资料,改成从 pg_catalog 这个原生目录去查,结果性能有了大幅提升。 Rust 里查询一万次只用了 1 秒,Go 里查询一万次用了 3 秒。

优秀的个人博客,低调大师

使用PostgreSQL_Notify实现多实例缓存同步

Parallel与Hierarchy是架构设计的两大法宝,缓存是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性。 分布式系统受到CAP定理的约束,分区一致性P是一般来说是不允许牺牲的,不可能让两个实例对同样的请求却给出不同的结果。用缓存是为了更好的性能,所以如果还要追求可用性A,就一定会牺牲C。我们能做的,就是通过巧妙设计让AP系统的一致性损失最小化。 传统方法 最简单粗暴的办法就是定时重新拉取,例如每个整点,所有应用一起去数据库拉取一次最新版本的数据。很多应用都是这么做的。当然问题也很多:拉的间隔长了,变更不能及时应用,用户体验差;拉的频繁了,IO压力大。而且实例数目和

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册