PostgreSQL的学习心得和知识总结(一百五十七)|新的 COPY 选项 LOG_VERBOSITY


注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《PostgreSQL数据库内核分析》
2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》
3、PostgreSQL数据库仓库链接,点击前往
4、日本著名PostgreSQL数据库专家 铃木启修 网站主页,点击前往
5、参考书籍:《PostgreSQL指南:内幕探索》,点击前往
6、参考书籍:《事务处理 概念与技术》


1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
5、本文内容基于PostgreSQL master源码开发而成


新的 COPY 选项 LOG_VERBOSITY

  • 文章快速说明索引
  • 功能使用背景说明
  • 功能实现源码解析



文章快速说明索引

学习目标:

做数据库内核开发久了就会有一种 少年得志,年少轻狂 的错觉,然鹅细细一品觉得自己其实不算特别优秀 远远没有达到自己想要的。也许光鲜的表面掩盖了空洞的内在,每每想到于此,皆有夜半临渊如履薄冰之感。为了睡上几个踏实觉,即日起 暂缓其他基于PostgreSQL数据库的兼容功能开发,近段时间 将着重于学习分享Postgres的基础知识和实践内幕。


学习内容:(详见目录)

1、新的 COPY 选项 LOG_VERBOSITY


学习时间:

2024年10月27日 18:04:45


学习产出:

1、PostgreSQL数据库基础知识回顾 1个
2、CSDN 技术博客 1篇
3、PostgreSQL数据库内核深入学习


注:下面我们所有的学习环境是Centos8+PostgreSQL master +Oracle19C+MySQL8.0

postgres=# select version();version                                                   
------------------------------------------------------------------------------------------------------------PostgreSQL 18devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-21), 64-bit
(1 row)postgres=##-----------------------------------------------------------------------------#SQL> select * from v$version;          BANNER        Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production	
BANNER_FULL	  Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production Version 19.17.0.0.0	
BANNER_LEGACY Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production	
CON_ID 0#-----------------------------------------------------------------------------#mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27    |
+-----------+
1 row in set (0.06 sec)mysql>

功能使用背景说明

Add new COPY option LOG_VERBOSITY.This commit adds a new COPY option LOG_VERBOSITY, which controls the
amount of messages emitted during processing. Valid values are
'default' and 'verbose'.This is currently used in COPY FROM when ON_ERROR option is set to
ignore. If 'verbose' is specified, a NOTICE message is emitted for
each discarded row, providing additional information such as line
number, column name, and the malformed value. This helps users to
identify problematic rows that failed to load.

添加新的 COPY 选项 LOG_VERBOSITY

  • 此提交添加了新的 COPY 选项 LOG_VERBOSITY,用于控制处理期间发出的消息量。有效值为“default”和“verbose”
  • 当 ON_ERROR 选项设置为忽略时,当前在 COPY FROM 中使用此选项。如果指定了“verbose”,则会为每个丢弃的行发出一条 NOTICE 消息,提供其他信息,例如行号、列名和格式错误的值。这有助于用户识别无法加载的问题行
Add log_verbosity = 'silent' support to COPY command.Previously, when the on_error option was set to ignore, the COPY command
would always log NOTICE messages for input rows discarded due to
data type incompatibility. Users had no way to suppress these messages.This commit introduces a new log_verbosity setting, 'silent',
which prevents the COPY command from emitting NOTICE messages
when on_error = 'ignore' is used, even if rows are discarded.
This feature is particularly useful when processing malformed files
frequently, where a flood of NOTICE messages can be undesirable.For example, when frequently loading malformed files via the COPY command
or querying foreign tables using file_fdw (with an upcoming patch to
add on_error support for file_fdw), users may prefer to suppress
these messages to reduce log noise and improve clarity.

为 COPY 命令添加 log_verbosity = ‘silent’ 支持

  • 以前,当 on_error 选项设置为 ignore 时,COPY 命令将始终记录由于数据类型不兼容而丢弃的输入行的 NOTICE 消息。用户无法抑制这些消息
  • 此提交引入了一个新的 log_verbosity 设置 ‘silent’,当使用 on_error = ‘ignore’ 时,即使行被丢弃,它也会阻止 COPY 命令发出 NOTICE 消息。此功能在频繁处理格式错误的文件时特别有用,在这种情况下,大量的 NOTICE 消息可能是不受欢迎的
  • 例如,当通过 COPY 命令频繁加载格式错误的文件或使用 file_fdw 查询外部表时(即将发布的补丁将为 file_fdw 添加 on_error 支持),用户可能更愿意抑制这些消息以减少日志噪音并提高清晰度

案例展示1,如下:

postgres=# select version();version                                     
---------------------------------------------------------------------------------PostgreSQL 18devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 13.1.0, 64-bit
(1 row)postgres=# \set SHOW_CONTEXT always
postgres=# 
postgres=# CREATE TABLE check_ign_err (n int, m int[], k int);
CREATE TABLE
postgres=# COPY check_ign_err FROM STDIN WITH (on_error ignore, log_verbosity verbose);
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    {1}     1
>> a    {2}     2
>> 3    {3}     3333333333
>> 4    {a, 4}  4
>> 
>> 5    {5}     5
>> 6    a
>> 7    {7}     a
>> 8    {8}     8
>> \.
NOTICE:  skipping row due to data type incompatibility at line 2 for column "n": "a"
CONTEXT:  COPY check_ign_err
NOTICE:  skipping row due to data type incompatibility at line 3 for column "k": "3333333333"
CONTEXT:  COPY check_ign_err
NOTICE:  skipping row due to data type incompatibility at line 4 for column "m": "{a, 4}"
CONTEXT:  COPY check_ign_err
NOTICE:  skipping row due to data type incompatibility at line 5 for column "n": ""
CONTEXT:  COPY check_ign_err
NOTICE:  skipping row due to data type incompatibility at line 7 for column "m": "a"
CONTEXT:  COPY check_ign_err
NOTICE:  skipping row due to data type incompatibility at line 8 for column "k": "a"
CONTEXT:  COPY check_ign_err
NOTICE:  6 rows were skipped due to data type incompatibility
COPY 3
postgres=# table check_ign_err;n |  m  | k 
---+-----+---1 | {1} | 15 | {5} | 58 | {8} | 8
(3 rows)postgres=#

案例展示2,如下:

postgres=# CREATE DOMAIN dcheck_ign_err2 varchar(15) NOT NULL;
CREATE DOMAIN
postgres=# CREATE TABLE check_ign_err2 (n int, m int[], k int, l dcheck_ign_err2);
CREATE TABLE
postgres=# COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity verbose);
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    {1}     1       'foo'
>> 2    {2}     2       \N
>> \.
NOTICE:  skipping row due to data type incompatibility at line 2 for column "l": null input
CONTEXT:  COPY check_ign_err2
NOTICE:  1 row was skipped due to data type incompatibility
COPY 1
postgres=# table check_ign_err2;n |  m  | k |   l   
---+-----+---+-------1 | {1} | 1 | 'foo'
(1 row)postgres=#

案例展示3,如下:

postgres=# COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity silent);
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 3    {3}     3       'bar'
>> 4    {4}     4       \N
>> \.
COPY 1
postgres=# table check_ign_err2;n |  m  | k |   l   
---+-----+---+-------1 | {1} | 1 | 'foo'3 | {3} | 3 | 'bar'
(2 rows)postgres=# COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity default);
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 5    {5}     5       'bar'
>> 6    {6}     6       \N
>> \.
NOTICE:  1 row was skipped due to data type incompatibility
COPY 1
postgres=#

OK,接下来做一个小结 如下(当 ON_ERROR 选项设置为ignore时):

  1. 如果至少有一行被丢弃,则在 COPY FROM 结束时会发出一条 NOTICE 消息,其中包含被忽略的行数。
  2. 当 LOG_VERBOSITY 选项设置为 verbose 时,对于每个被丢弃的行,都会发出一条 NOTICE 消息,其中包含输入文件的行和输入转换失败的列名。
  3. 当设置为 silent 时,不会发出有关被忽略的行的消息。

功能实现源码解析

相关数据结构如下:

// src/include/commands/copy.h/** Represents verbosity of logged messages by COPY command.*/
typedef enum CopyLogVerbosityChoice
{COPY_LOG_VERBOSITY_SILENT = -1, /* logs none */COPY_LOG_VERBOSITY_DEFAULT = 0, /* logs no additional messages. As this is* the default, assign 0 */// 不记录其他消息。由于这是默认设置,因此分配 0COPY_LOG_VERBOSITY_VERBOSE, /* logs additional messages */
} CopyLogVerbosityChoice;
// src/backend/commands/copy.c/** Process the statement option list for COPY.* 处理 COPY 的语句选项列表。** Scan the options list (a list of DefElem) and transpose the information* into *opts_out, applying appropriate error checking.* 扫描选项列表(DefElem 列表)并将信息转置到 *opts_out,应用适当的错误检查。** If 'opts_out' is not NULL, it is assumed to be filled with zeroes initially.* 如果“opts_out”不为 NULL,则假定它最初用零填充。** This is exported so that external users of the COPY API can sanity-check* a list of options.  In that usage, 'opts_out' can be passed as NULL and* the collected data is just leaked until CurrentMemoryContext is reset.* 导出此信息,以便 COPY API 的外部用户可以对选项列表进行健全性检查。* 在这种用法中,“opts_out”可以作为 NULL 传递,并且收集的数据只会泄露,直到 CurrentMemoryContext 重置。** Note that additional checking, such as whether column names listed in FORCE* QUOTE actually exist, has to be applied later.  This just checks for* self-consistency of the options list.* 请注意,稍后必须应用其他检查,例如 FORCE QUOTE 中列出的列名是否实际存在。* 这只是检查选项列表的自洽性。*/
void
ProcessCopyOptions(ParseState *pstate,CopyFormatOptions *opts_out,bool is_from,List *options)
{.../* Support external use for option sanity checking */if (opts_out == NULL)opts_out = (CopyFormatOptions *) palloc0(sizeof(CopyFormatOptions));.../* Extract options from the statement node tree */foreach(option, options){DefElem    *defel = lfirst_node(DefElem, option);...else if (strcmp(defel->defname, "log_verbosity") == 0){if (log_verbosity_specified)errorConflictingDefElem(defel, pstate);log_verbosity_specified = true;opts_out->log_verbosity = defGetCopyLogVerbosityChoice(defel, pstate);}...}...
}

在这里插入图片描述

如上,即使没有指定该选项 也会被设置成默认值COPY_LOG_VERBOSITY_DEFAULT。接下来看一下解析函数:

/** Extract a CopyLogVerbosityChoice value from a DefElem.*/
static CopyLogVerbosityChoice
defGetCopyLogVerbosityChoice(DefElem *def, ParseState *pstate)
{char	   *sval;/** Allow "silent", "default", or "verbose" values.*/sval = defGetString(def);if (pg_strcasecmp(sval, "silent") == 0)return COPY_LOG_VERBOSITY_SILENT;if (pg_strcasecmp(sval, "default") == 0)return COPY_LOG_VERBOSITY_DEFAULT;if (pg_strcasecmp(sval, "verbose") == 0)return COPY_LOG_VERBOSITY_VERBOSE;ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),/*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */errmsg("COPY %s \"%s\" not recognized", "LOG_VERBOSITY", sval),parser_errposition(pstate, def->location)));return COPY_LOG_VERBOSITY_DEFAULT;	/* keep compiler quiet */
}

接下来看一下详细调试过程,如下:

在这里插入图片描述

在这里插入图片描述

此时的函数堆栈,如下:

NextCopyFrom(CopyFromState cstate, ExprContext * econtext, Datum * values, _Bool * nulls)
CopyFrom(CopyFromState cstate) 
DoCopy(ParseState * pstate, const CopyStmt * stmt, int stmt_location, int stmt_len, uint64 * processed)
standard_ProcessUtility(PlannedStmt * pstmt, const char * queryString, _Bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc)
ProcessUtility(PlannedStmt * pstmt, const char * queryString, _Bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) 
PortalRunUtility(Portal portal, PlannedStmt * pstmt, _Bool isTopLevel, _Bool setHoldSnapshot, DestReceiver * dest, QueryCompletion * qc) 
PortalRunMulti(Portal portal, _Bool isTopLevel, _Bool setHoldSnapshot, DestReceiver * dest, DestReceiver * altdest, QueryCompletion * qc)
PortalRun(Portal portal, long count, _Bool isTopLevel, _Bool run_once, DestReceiver * dest, DestReceiver * altdest, QueryCompletion * qc)
exec_simple_query(const char * query_string)
...

上面多行的循环处理,结束之后 如下:

在这里插入图片描述

postgres=# COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity verbose);
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 7    {7}     7       'bar'
>> 8    {8}     8       \N
>> 9    {9}     9       \N
>> \.
NOTICE:  skipping row due to data type incompatibility at line 2 for column "l": null input
NOTICE:  skipping row due to data type incompatibility at line 3 for column "l": null input
NOTICE:  2 rows were skipped due to data type incompatibility
COPY 1
postgres=#

如果这里设置的是silent,那么上面这一行也不会打印了!

这个功能比较简单,这里不再赘述!对错误信息的提示量根据自己需要酌情设置即可,如果指定了verbose,则会为每个丢弃的行发出一条 NOTICE 消息,提供其他信息(如上):

  • 例如行号、列名和格式错误的值
  • 这有助于用户识别无法加载的问题行

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

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

相关文章

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架,允许开发团队以单一、统一的格式生成、处理和传输遥测数据(telemetry data)。它由云原生计算基金会 (CNCF) 开发,旨在提供标准化协议和工具,用于收集…

MS01SF1 精准测距UWB模组助力露天采矿中的人车定位安全和作业效率提升

在当今矿业行业,随着全球对资源需求的不断增加和开采难度的逐步提升,传统的作业方式面临着越来越多的挑战。露天矿山开采,因其大规模的作业环境和复杂的地形特点,面临着作业人员的安全风险、设备调度的高难度以及资源利用率低下等…

此版本的IDM不支持该类下载,请尝试将IDM更新至最新版本

此版本的IDM不支持该类下载,请尝试将IDM更新至最新版本 平时可以正常使用,谷歌浏览器内用IDM下载突然提示不能用了,但是复制链接到IDM中新建任务不影响使用,推测可能和谷歌浏览器更新有关,打开谷歌浏览器的扩展工具&a…

从一到无穷大 #40:DB AI 融合

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言正文 引言 吐槽下CSDN和知乎的编辑器,没法发合并的表格,…

杭州德沃医美美妆美业精油美容si规范手册连锁品牌策划公司

上海班德设计,专业致力于连锁品牌策划,此次荣幸地为杭州德沃医美美妆美业精油美容SI规范手册提供策划与设计服务。以下是对本次设计项目的五百字说明: 一、项目概述 杭州德沃医美美妆美业精油美容,作为一家致力于为广大消费者提供…

【hacker送书第14期】AI训练师算法与模型训练从入门到精通

全面精通人工智能训练,成为行业领先、更懂AI的人! 前言内容简介总结参与方式 前言 在人工智能(AI)技术日益成熟的今天,AI训练师成为了一个新兴且重要的职业。他们不仅需要掌握AI的核心技术,还要能够将这些…

JSON交互处理

目录 一、什么是JSON 二、JSON和JavaScript对象互转 ​三、Controller返回JSON数据 3.1 使用Jackson 编写Controller 1. 一个对象 2. 多个对象 3. 输出时间对象 4. 优化:抽取为工具类 一、什么是JSON Json是JavaScript对象的字符串表示法,它用…

C/C++ 矩阵的QR分解

#include <iostream> #include <vector> using namespace std;int main() /* 矩阵A的QR分解*/ {// 动态分配内存int m 3; // 行数int n 3; // 列数// 初始化矩阵Adouble A[3][3] {{1, 2, 2},{2, 1, 2},{1, 2, 1}};double R[3][3] { 0 };double Q[3][3] { 0 };…

java:修复aspectj-maven-plugin插件在java9项目中执行报错:cannot be resolved to a module

javadocreader9(https://gitee.com/l0km/javadocreader9)是我最近写的一个基于Java 9 的javadoc读取java代码注释的工具。在基于Java 9(我用的编译器JDK 19)编译时&#xff0c;aspectj-maven-plugin插件在执行报了一堆错误&#xff1a; xxx cannot be resolved to a module,如下…

C++ | Leetcode C++题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:Solution(int m, int n) {this->m m;this->n n;this->total m * n;srand(time(nullptr));}vector<int> flip() {int x rand() % total;vector<int> ans;total--; // 查找位置 x 对应的…

mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能

这里是引用 文章目录 一、开发环境二、MFC项目创建三、集成opencv3.1 opencv安装3.2 添加项目属性3.3 测试OpenCV&#xff08;打开摄像头&#xff09;3.4 OPENCV视频嵌入到弹框中 四、关闭摄像头、拍照功能实现4.1 添加按钮4.2 添加全局静态变量4.3 关闭摄像头功能实现4.4 拍照…

面试题:Vue生命周期

Vue生命周期 一、是什么二、Vue2生命周期三、Vue2生命周期整体流程四、Vue3生命周期 一、是什么 Vue中的实例从创建到销毁的过程就是生命周期&#xff0c;即指从创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程 二、Vue2生命周期 Vue2生命周期总共…

元宇宙VR展会突破传统会展局限,打造会展新生态与商业新机遇

一、身临其境感受会展新境界 元宇宙VR展会利用虚拟现实技术&#xff0c;为参会用户打造了一个高度还原的虚拟会展空间。用户只需使用手机、平板、电脑等设备&#xff0c;即可瞬间穿越至展会现场&#xff0c;仿佛置身于真实的会展环境中。 在这里&#xff0c;用户可以自由浏览…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…

【产品经理】工业互联网企业上市之路

树根互联2022年6月2日提交招股书之后&#xff0c;因财务资料超过六个月有效期加三个月延长期&#xff0c;2022年9月30日上市审核中止&#xff1b;2022年12月26日树根互联更新了2022年半年度财务资料&#xff0c;又九个月过去了&#xff0c;其上市进程将面临再一次中止。 处于上…

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法&#xff1a;图像可以表示为高维空间中的向量。当两个图像相似时&#xff0c;它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度&#xff08;或余弦相似度&#xff09;来确定这些向量的相似程度。如果角度小&#xff0c;…

AI风险及数据合规问题

一、数据来源合规问题 1、请说明发行人采集数据时是否获得了相关信息主体及用户的合法授权&#xff0c;获取用户数据的手段及方式是否合法合规; 2、请说明发行人获取用户数据及标签的过程及方法&#xff0c;是否对用户有明示提示&#xff0c;用户授权在法律上是否完备&#xff…

yoloV5实战笔记—环境搭建(一)

一、安装miniconda 从清华源进行下载 https://mirrors.tuna.tsinghua.edu.cn/ 具体命令参考&#xff0c;注意修改pip国内镜像地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 创建环境&#xff0c;指定python版本 conda create -n demo python3.9激活环境 conda acti…

Docker:存储原理

Docker&#xff1a;存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层&#xff0c;轻量且高效的文件系统。其将整个文件系统分为多个层&#xff0c;层与层之间进行覆盖&#x…

【源码+文档】基于SpringBoot的养老院管理系统

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…