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.rhkb.cn/news/461467.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析 std::optional 的使用与常见错误

文章目录 引言常见错误及解决方案1. 错误使用 std::optional 变量进行算术运算2. 错误检查 std::optional 是否有值3. 忽视 std::optional 的默认值 结论 引言 std::optional 是 C17 引入的一个模板类,用于表示可能有也可能没有值的情况。它特别适用于函数返回值&a…

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

深度了解flink(七) JobManager(1) 组件启动流程分析

前言 JobManager是Flink的核心进程,主要负责Flink集群的启动和初始化,包含多个重要的组件(JboMaster,Dispatcher,WebEndpoint等),本篇文章会基于源码分析JobManagr的启动流程,对其各个组件进行介绍&#x…

深度学习模型入门教程指南

在当前的人工智能生成内容(AIGC)领域中,深度学习模型无疑是支撑其技术核心的关键组件。深度学习模型的广泛应用极大地推动了图像生成、自然语言处理和自动化工作流的发展,本文将从多个角度介绍深度学习模型的概念、构建过程、实际…

C语言指针的介绍

零.导言 在日常生活中,我们常常在外出时居住酒店,细心的你一定能发现酒店不同的房间上有着不同的门牌号,上面写着像308,512之类的数字。当你定了酒店之后,你就会拿到一个写有门牌号的钥匙,凭着钥匙就能进入…

【Spring MVC】DispatcherServlet 请求处理流程

一、 请求处理 Spring MVC 是 Spring 框架的一部分,用于构建 Web 应用程序。它遵循 MVC(Model-View-Controller)设计模式,将应用程序分为模型(Model)、**视图(View)和控制器&#x…

[ 问题解决篇 ] win11远程桌面报错:出现身份验证错误要求的函数不受支持(附完整解决方案)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

汽车免拆诊断案例 | 2010款起亚赛拉图车发动机转速表指针不动

故障现象  一辆2010款起亚赛拉图车,搭载G4ED 发动机,累计行驶里程约为17.2万km。车主反映,车辆行驶正常,但组合仪表上的发动机转速表指针始终不动。 故障诊断  接车后进行路试,车速表、燃油存量表及发动机冷却温度…

自动化运维

自动化运维是指使用工具和脚本自动化管理、配置、监控和维护IT基础设施的过程。通过自动化运维,可以提高工作效率,减少人为错误,增加系统的可预测性和稳定性。以下是实现自动化运维的常见步骤和工具: 常见步骤: 1. 定义…

驱动——线程断链和信息获取

实验环境&#xff1a;win7 x32 断链&#xff1a; #include <ntifs.h>NTSTATUS EnumThread(ULONG ulPid, ULONG ulTid) {PEPROCESS pProcessAddr PsGetCurrentProcess();PLIST_ENTRY pHeadlink (PLIST_ENTRY)((ULONG)pProcessAddr 0xb8);PLIST_ENTRY pNextlink pHead…

AWD挨打记录

前言 昨天参加了星盟的AWD集训&#xff0c;本来寻思能猛猛乱杀&#xff0c;结果加固时间只有20分钟&#xff0c;WAF还没push上去就被三家上了不死马QAQ cms是站帮主&#xff0c;之前没打过&#xff0c;D盾啥也没扫出来&#xff0c;还寻思是个贼安全的系统&#xff0c;结果洞满…

鸿蒙打包hvigorw clean报错No npmrc file is matched in the current user folder解决

问题 在执行hvigorw clean等命令时&#xff0c;报错如下&#xff1a; Error: The hvigor depends on the npmrc file. No npmrc file is matched in the current user folder. Configure the npmrc file first解决方案 在用户当前目录下新建.npmrc文件&#xff0c;并配置如下…

前端如何实现进度条

将进度条的宽度动态控制&#xff0c;通过css的transition动画来控制 <template><div class"container"><div class"base-progress"><div class"inner" :style"{ width: w % }"><div class"text&qu…

SWAT-MODFLOW地表水与地下水耦合实践技术

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

江协科技STM32学习- P27 实验-串口发送/串口接收

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Linux笔记--基础入门

文章目录 Linux基础知识点文件目录*磁盘分区**基础命令*Linux运行级别关机重启手册alias别名ntsysv系统服务管理程序 Linux常用命令命令分类命令行格式选项参数 命令行辅助操作 真常用命令()help命令&#xff1a;帮助指令man手册页manual page绝对路径与相对路径绝对路径&#…

11月1日星期五今日早报简报微语报早读

11月1日星期五&#xff0c;农历十月初一&#xff0c;早报#微语早读。 1、六大行今日起实施存量房贷利率新机制。 2、谷歌被俄罗斯罚款35位数&#xff0c;罚款远超全球GDP。 3、山西吕梁&#xff1a;女性35岁前登记结婚&#xff0c;给予1500元奖励。 4、我国人均每日上网时间…

Pandas DataFrame学习补充

1. 从字典创建&#xff1a;字典的键成为列名&#xff0c;值成为列数据。 import pandas as pd# 通过字典创建 DataFrame df pd.DataFrame({Column1: [1, 2, 3], Column2: [4, 5, 6]}) 2. 从列表的列表创建&#xff1a;外层列表代表行&#xff0c;内层列表代表列。 df pd.Da…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

推荐一款功能强大的文字处理工具:Atlantis Word Processor

Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档&#xff0c;并且软件的界面能够按用户的意愿去自定义&#xff0c;比如工具栏、字体选择、排版、打印栏等等&#xff0c;当然还有更多的功能&#xff0c;比如你还可以吧软件界面中的任何…