type
status
date
slug
summary
tags
category
icon
password
😀
文章前言:
本文作者在学习PolarDB数据库优化时,尝试了许多插件,均获得不同效果上的提升,在此将所尝试过的插件整理如下,希望能为大家在其他数据库的插件使用上提供一定的提示。
(本文默认环境为阿里的PolarDB开发环境Docker镜像ubuntu20.04,使用PolarDB11版本)
 

1 bulkload


环境准备

安装概述

报错一:未定义MemoryContext 类似的

看报错应该是缺少包含MemoryContext的头文件引用, 搜索代码, 找到了这个定义在utils/palloc.h中.
这里使用Ctrl+F在文档中进行搜索,如果看不懂代码可以扔给ChatGPT,但是一定要在ChatGPT分析完之后自己再看一遍,这样之后自己就可以解决类似的报错了。
修改报错的recovery.c代码:

报错二:参数不匹配,找到对应的函数,在最后加上false即可

看起来是pg_bulkload调用的BasicOpenFilePerm被PolarDB修改过, 和PostgreSQL 11的不兼容了。
如何解决这个报错呢?

法一:点击报错函数,跳转,进行参数补全

 

法二:深入bulkload源码

1、搜索PolarDB 11源码中 BasicOpenFilePerm 的定义
相比PostgreSQL 11多了一个 bool polar_vfs 参数.
这个polar_vfs到底应该设置为true还是false呢?
简单可以这么来理解: PolarDB 支持共享存储架构, 多个计算节点可以访问同一份数据, 因为各个机器有本地缓存(cache/file meta cache等) 访问共享存储时不能像单机PostgreSQL实例那样使用本地文件系统和本地文件操作的系统调用接口, 而是需要通过一层PolarDB自己定义的pfs, 来保证共享数据的一致性等.
看PolarDB代码的话, 很多接口都适配了 polar_vfs , 例如:
所以简单的让pg_bulkload编译通过的话, 可以直接写死true or false. 例如
2、找到pg_bulkload源码中调用了BasicOpenFilePerm的代码文件
全部改成 false
重新编译就正常了.
现在可以在PolarDB 11中创建 pg_bulkload 插件了:
但是PolarDB 11 使用 pg_bulkload 插件导入数据又出现报错了。

报错三:数据导入报错

首先使用上面的解决办法解决pg_bulkload安装的问题。然后使用TPCH生成点数据,并使用bulkload命令进行导入。
报错如下:
报错和这个issue ( ApsaraDB/PolarDB-for-PostgreSQL#532 ) 遇到的问题一样:
1、分析这个报错的代码出处
搜索pg_bulkload中包含could not open data file错误的代码
看了pg_bulkload的手册, 导入和recovery无关, 所以重点分析 lib/writer_direct.c :
从代码可以看出 通过BasicOpenFilePerm获取文件描述符失败了, BasicOpenFilePerm的其他参数都没问题, 那就只能是fname有问题了.
再往前翻一下, fname是这样得到的:
2、打印看看fname到底是什么?
使用ereport把fname打印到PolarDB的日志中, 把下面2行放到上面这段fname代码的下面:
3、重新编译pg_bulkload, 执行导入, 查看PolarDB日志:
PolarDB日志在master节点的pg_log目录中, 如下:
file name路径中为什么会包含 file-dio:// 呢?
不应该是这样的吗?
4、PolarDB的file name路径中为什么要以 file-dio:// 开头?
老规矩, 搜一下PolarDB v11的代码:
是POLAR_VFS_PROTOCAL_LOCAL_DIO这个宏定义的, 那么当PolarDB部署在本地环境中(不使用共享存储和PFS时), 要解决pg_bulkload以上报错, 去掉路径中的 file-dio:// 应该就可以了.
5、把fname头部的 file-dio:// 去掉, 重新编译, 测试导入.
修改相关代码, 最终代码如下. 这部分使用了chatgpt, 后来在释放新增变量内存空间时遇到一个问题产生了coredump, 分析core时也用到了chatgpt.
重新编译, 测试导入
PolarDB 数据库日志显示正常
pg_bulkload 日志显示正常
注意这个文档仅供学习交流, 很多pg_bulkload的功能也没有测试是否正常, 解决方法也只适合PolarDB使用本地磁盘的情况, 对于PolarDB使用共享存储时, 可能要适配pfs接口进行写入.

延展问题: pg_bulkload导入PolarDB后, 重启数据库前“查不到数据”

虽然上面导入日志都正常, 但是“查不到数据”.
导入完成后迅速查询一下数据有没有导入进去?
奇怪了, 数据文件都已经有3.6MB了, 显然数据已经进去了, 但是查不到.
使用pageinspect看一看foo表的数据块, 居然报错
顺着PolarDB pageinspect插件代码往下查, 有可能和PolarDB table size cache管理有一定关系:
contrib/pageinspect/rawpage.c
src/backend/storage/buffer/bufmgr.c
src/backend/storage/smgr/smgr.c
相关参数
目前通过pg_bulkload direct模式导入到PolarDB的数据, 需要重启数据库, 才能查到数据
polar_nblocks_cache_mode设置为scan, pg_bulkload导入后可以直接看到数据.
现在pg_bulkload导入后, 可以在PolarDB中直接看到数据, 不需要重启PolarDB了!

📎 参考文章

2 vops


 
 
 

📎 参考文章

  • 一些引用
  • 引用文章
 
💡
有关问题,欢迎您在底部评论区留言,一起交流~
Relate Posts
Linux程序设计:进程与进程同步
Lazy loaded image
智能体开发与接口调用
Lazy loaded image
Linux程序设计:Linux C 编程 + GDB 调试 + 文件操作实验
Lazy loaded image
Linux程序设计:shell编程1
Lazy loaded image
RK3568 OpenHarmony环境搭建
Lazy loaded image
Linux程序设计:文件目录
Lazy loaded image
Web大作业论文华为ICT大赛练习题二
Loading...
Koreyoshi
Koreyoshi
一个无可救药的乐观主义者
Latest posts
编译原理:文法和语言
2025-6-3
智能体开发与接口调用
2025-6-3
软件工程:面向对象设计
2025-6-3
软件工程:面向对象的需求获取与需求分析
2025-6-3
软件工程:软件测试
2025-6-3
编译原理:语法制导翻译技术和中间代码生成
2025-6-3
Announcement
🎉写给自己的2025心愿🎉
保研
国奖
完善博客
学一门乐器
发表一篇论文
拍摄人生照片
去3个城市旅游
专业课知识视频
拍摄毕业季视频
----- 2025 ------
👏希望我们一起变好👏