openGauss

开源数据库

openGauss社区官网

开源社区

openGauss/MOGDB Copy支持容错机制

云和恩墨-阎书利2022-05-23openGauss/MOGDB Copy支持容错机制

openGauss/MOGDB Copy 支持容错机制

本文出处:https://www.modb.pro/db/374246

一、COPY 容错机制相关选项

MOGDB/openGauss 允许用户在使用 Copy From 指令时指定容错选项,使得 Copy From 语句在执行过程中部分解析、数据格式、字符集等相关的报错不会报错中断事务、而是被记录至错误表中,使得在 Copy From 的目标文件即使有少量数据错误也可以完成入库操作。用户随后可以在错误表中对相关的错误进行定位以及进一步排查。

主要包括三个主要的选项:

  • LOG ERRORS 若指定,则开启对于 COPY FROM 语句中数据类型错误的容错机制

  • LOG ERRORS DATA

    LOG ERRORS DATA 和 LOG ERRORS 的区别:

    1. LOG ERRORS DATA 会填充容错表的 rawrecord 字段。
    2. 只有 supper 权限的用户才能使用 LOG ERRORS DATA 参数选项。
  • REJECT LIMIT 'limit’ 与 LOG ERROR 选项共同使用,对 COPY FROM 的容错机制设置数值上限,一旦此 COPY FROM 语句错误数据超过选项指定条数,则会按照原有机制报错。 取值范围:正整数(1-INTMAX),‘unlimited’(无最大值限制)

二、Copy 错误表创建函数

MOGDB/openGauss 里已经给用户提供了封装好的 Copy 错误表创建函数 pg_catalog.copy_error_log_create()。执行就可以创建相应的错误表 public.pgxc_copy_error_log。当然这个函数也可以手动移除重建。如下是重建的函数。

CREATE OR REPLACE FUNCTION pg_catalog.copy_error_log_create()
RETURNS bool
AS $$
DECLARE
	query_str_create_table text;
	query_str_create_index text;
	query_str_do_revoke text;
	BEGIN
		query_str_create_table := 'CREATE TABLE public.pgxc_copy_error_log
							(relname varchar, begintime timestamptz, filename varchar, lineno int8, rawrecord text, detail text)';
		EXECUTE query_str_create_table;

		query_str_create_index := 'CREATE INDEX copy_error_log_relname_idx ON public.pgxc_copy_error_log(relname)';
		EXECUTE query_str_create_index;

		query_str_do_revoke := 'REVOKE ALL on public.pgxc_copy_error_log FROM public';
		EXECUTE query_str_do_revoke;

		return true;
	END; $$
LANGUAGE 'plpgsql' NOT FENCED;

REVOKE ALL on FUNCTION pg_catalog.copy_error_log_create() FROM public;
如果不创建copy错误表,仅仅带上容错选项的话,会有如下相关提示。
执行 pg_catalog.copy_error_log_create()创建copy错误表

三、COPY FROM 存在错误的数据

再执行 copy 命令,报错的 copy 数据会被记录到 public.pgxc_copy_error_log 里而不会影响其他正确的数据的导入。

注意要指定 REJECT LIMIT ‘limit’,且 limit 的值要足够大,否则当 COPY FROM 语句错误数据超过选项指定条数,则会按照原有机制报错。

表里记录的内容,是通过 Log_copy_error_spi 函数读取缓存文件中的每一行,并组装 spi 要执行的查询字符串,把将错误记录插入带有 spi 的 copy_error_Log 表中。