暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【工具指南】磐维数据库 __ 关于gs_loader的使用

原创 磐维数据库 2025-07-25
168

gs_loader简介

gs_loader是一个命令行工具,主要用于将外部数据文件中的数据快速加载到数据库表中。它其实是利用\COPY的功能来做数据导入工作,将控制文件支持的语法转换为\COPY语法,通过控制文件可以定义数据源、编码格式、列的控制方式等。
gs_loader可以在导入过程中会生成错误日志文件,帮助用户识别和解决导入过程中的问题。


gs_loader使用示例

1、使用管理员用户创建测试业务库、用户、表

$ gsql -r

create database test;

\c test

CREATE USER test WITH PASSWORD '*********';

\q

$ gsql -r -d test -U test -W *********

CREATE TABLE test.test_loader

(

ID NUMBER,

NAME VARCHAR2(20),

CON VARCHAR2(20),

DT DATE);

\q


2、在gs_loader客户端机器上创建控制文件loader.ctl

LOAD DATA

truncate into table test.test_loader

WHEN (2:2) = ','

fields terminated by ','

trailing nullcols

(

id integer external,

name char(32),

con ":id || '-' || :name",

dt date

)


3、在gs_loader客户端机器上创建数据文件data.csv

1,OK,chenrw,2007-07-8

2,,chenrw,2007-07-8

3,OK,,2007-07-8

,,,

4,,,

a,err int,,

4,err date,,2007-500-500

44,err when,,,


后续导入时会有如下效果,说明如下:

1,OK,chenrw,2007-07-8 -- 导入成功

2,,chenrw,2007-07-8 -- 导入成功,第三个字段值"chenrw"会变成":id || '-' || :name"的格式

3,OK,,2007-07-8 -- 导入成功,第三个字段值 '空' 会变成":id || '-' || :name"的格式

,,, -- 导入忽略,所有字段均为空时,不会被导入

4,,, -- 导入成功,非全空时,若字段缺失,补 null 处理

a,err int,, -- 导入失败,第一个字段类型不对

4,err date,,2007-500-500 -- 导入失败,第四个字段时间范围不对

44,err when,,, -- 导入忽略,被 WHEN 条件过滤



4、执行gs_loader导入

gs_loader control=loader.ctl data=data.csv log=loader.log bad=loader.bad discard=loader.discard create=false clean=true

errors=5 host=127.0.0.1 port=17700 db=test passwd=********* user=test


验证是否导入成功

gsql -r -d test -U test -W ********* -c "select * from test.test_loader;"

gsql -r -d test -U test -W ********* -c "select * from public.gs_copy_summary;"

gsql -r -d test -U test -W ********* -c "select * from public.pgxc_copy_error_log;"


查看各日志

cat loader.bad

cat loader.discard

cat loader.log

执行报错,需要先执行步骤5,为普通用户test手动创建过程表。


5、过程表授权

报错如下:

ERROR: Unable to open public.pgxc_copy_error_log table for COPY FROM error logging.

HINT: You may want to use copy_error_log_create() to create it first.


处理如下:

$ gsql -r -d test

SELECT copy_error_log_create() WHERE NOT EXISTS(SELECT * FROM pg_tables WHERE schemaname='public' AND tablename='pgxc_copy_error_log');

GRANT INSERT,SELECT,DELETE ON public.pgxc_copy_error_log To test;


报错如下:

ERROR: ERROR: relation "gs_copy_summary" does not exist on dn_6001_6002_6003


处理如下:

$ gsql -r -d test

SELECT copy_summary_create() WHERE NOT EXISTS(SELECT * FROM pg_tables WHERE schemaname='public' AND tablename='gs_copy_summary');

GRANT INSERT,SELECT ON public.gs_copy_summary To test;


步骤4成功导入过程截图如下:

6、验证中间表是否只需要创建一次

中间过程表只需要创建一次,以后无论入库任何表,都可以复用这个过程表。以下导入均成功。

gs_loader control=loader.ctl data=data.csv log=loader.log bad=loader.bad discard=loader.discard create=false clean=true errors=5 host=127.0.0.1 port=17700 db=test passwd=********* user=test

gs_loader control=loader2.ctl data=data2.csv log=loader.log bad=loader.bad discard=loader.discard create=false clean=true errors=5 host=127.0.0.1 port=17700 db=test passwd=********* user=test

gs_loader control=test.ctl data=test.csv log=loader.log bad=loader.bad discard=loader.discard create=false clean=true errors=5 host=127.0.0.1 port=17700 db=test passwd=********* user=test


7、非表属主是否可以导入

schema、table的属主是test,将表权限授权给etl普通用户:

$ gsql -r -d test

create user etl identified by '********';

GRANT USAGE ON SCHEMA test TO etl;

GRANT SELECT,INSERT,UPDATE,DELETE,TRUNCATE ON ALL TABLES IN SCHEMA test TO etl;

ALTER DEFAULT PRIVILEGES FOR USER test IN SCHEMA test GRANT SELECT,INSERT,UPDATE,DELETE,TRUNCATE ON TABLES TO etl;


中间表的权限也要授权给etl,如下:

GRANT INSERT,SELECT,DELETE ON public.pgxc_copy_error_log To etl;

GRANT INSERT,SELECT ON public.gs_copy_summary To etl;

\q


执行导入:

gs_loader control=loader.ctl data=data.csv log=loader.log bad=loader.bad discard=loader.discard create=false clean=true errors=5 host=127.0.0.1 port=17700 db=test passwd=********* user=etl

gsql -r -d test -U etl -W ********* -c "select * from test.test_loader;"

gsql -r -d test -U etl -W ********* -c "select * from public.gs_copy_summary;"

gsql -r -d test -U etl -W ********* -c "select * from public.pgxc_copy_error_log;"


查看各日志

cat loader.bad

cat loader.discard

cat loader.log


  • 注意,当只把SELECT,INSERT,UPDATE,DELETE权限授权给etl用户,append可以,但是truncate和replace都不行。
  • 注意,当只把SELECT,INSERT,UPDATE,DELETE,TRUNCATE权限授权给etl用户,append、truncate和replace都可以。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论