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
📎 参考文章
- 一些引用
- 引用文章
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/159c7b13-c6a7-80df-8386-f9a44dabc8f9
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts