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都可以。




