GBase 8a数据库通过LOAD方式加载时,如果出现功能报错,如何排查

GBase 8a数据库通过LOAD方式加载时,如果出现功能报错,如何排查,第1张

前提参数设置

// 默认值是3,这个是session级别的,无需恢复

gbase> set gcluster_log_level=7;

Query OK, 0 rows affected (Elapsed: 00:00:0000)

// 默认值是0,建议先show一下原始值,排查完了记得改回去。

gbase> set global gbase_sql_trace_level=15;

Query OK, 0 rows affected (Elapsed: 00:00:0012)

// 默认值是0,这个是session级别,无需恢复

gbase> set gbase_sql_trace=1;

Query OK, 0 rows affected (Elapsed: 00:00:0001)

执行语句

gbase> load data infile ‘ftp://gbase:gbase1234@192168163100/t1txt’ into table testdbt1;

Query OK, 4 rows affected (Elapsed: 00:00:0035)

Task 394392 finished, Loaded 4 records, Skipped 0 records

查看日志

/opt/gbase/gcluster/log/gcluster/expresslog

# SQL处于check permission状态

# 获得表的锁

# 如果长时间无法拿到锁,通过gcadmin showlock 看看对应的表的锁在哪个节点哪个ID持有

2019-07-03 15:02:41352 [LOCK][INFO ][S:2108][Q:13221]:acquired WRITE lock: testdbt1580D5F90-B287-4199-B057-E6FBD44B5BFA, lwp:35693

2019-07-03 15:02:41352 [LOCK][INFO ][S:2108][Q:13221]:acquired READ lock: testdbt1, lwp:35693

2019-07-03 15:02:41353 [LOCK][INFO ][S:2108][Q:13221]:acquired READ lock: testdbt1rsync, lwp:35693

# 读取数据源ftp文件信息

# 检查数据库和FTP之间的性能问题,包括网络和FTP服务器的设置

2019-07-03 15:02:41354 [LOAD][INFO ][S:2108][Q:13221]:Start cluster load

2019-07-03 15:02:41358 == Information : Trying 192168163100

2019-07-03 15:02:41362 == Information : Connected to 192168163100 (192168163100) port 21 (#0)

2019-07-03 15:02:41370 <= Recv header : 220 (vsFTPd 302)

2019-07-03 15:02:41371 => Send header : USER gbase

2019-07-03 15:02:41371 <= Recv header : 331 Please specify the password

2019-07-03 15:02:41371 => Send header : PASS gbase1234

2019-07-03 15:02:41419 <= Recv header : 230 Login successful

2019-07-03 15:02:41419 => Send header : PWD

2019-07-03 15:02:41419 <= Recv header : 257 "/home/gbase"

2019-07-03 15:02:41419 == Information : Entry path is '/home/gbase'

2019-07-03 15:02:41419 => Send header : TYPE I

2019-07-03 15:02:41419 == Information : ftp_perform ends with SECONDARY: 0

2019-07-03 15:02:41420 <= Recv header : 200 Switching to Binary mode

2019-07-03 15:02:41420 => Send header : SIZE t1txt

2019-07-03 15:02:41420 <= Recv header : 213 8

2019-07-03 15:02:41420 => Send header : REST 0

2019-07-03 15:02:41420 <= Recv header : 350 Restart position accepted (0)

2019-07-03 15:02:41421 == Information : Remembering we are in dir ""

2019-07-03 15:02:41421 == Information : Connection #0 to host 192168163100 left intact

2019-07-03 15:02:41422 == Information : Trying 192168163100

2019-07-03 15:02:41422 == Information : Connected to 192168163100 (192168163100) port 21 (#0)

2019-07-03 15:02:41424 <= Recv header : 220 (vsFTPd 302)

2019-07-03 15:02:41424 => Send header : USER gbase

2019-07-03 15:02:41425 <= Recv header : 331 Please specify the password

2019-07-03 15:02:41425 => Send header : PASS gbase1234

2019-07-03 15:02:41465 <= Recv header : 230 Login successful

2019-07-03 15:02:41465 => Send header : PWD

2019-07-03 15:02:41465 <= Recv header : 257 "/home/gbase"

2019-07-03 15:02:41465 == Information : Entry path is '/home/gbase'

2019-07-03 15:02:41465 => Send header : TYPE I

2019-07-03 15:02:41465 == Information : ftp_perform ends with SECONDARY: 0

2019-07-03 15:02:41465 <= Recv header : 200 Switching to Binary mode

2019-07-03 15:02:41465 => Send header : SIZE t1_2txt

2019-07-03 15:02:41466 <= Recv header : 213 8

2019-07-03 15:02:41466 => Send header : REST 0

2019-07-03 15:02:41466 <= Recv header : 350 Restart position accepted (0)

2019-07-03 15:02:41466 == Information : Remembering we are in dir ""

2019-07-03 15:02:41466 == Information : Connection #0 to host 192168163100 left intact

#准备分派任务

2019-07-03 15:02:41467 [LOAD][INFO ][S:2108][Q:13221]:AddNodeLoadFileNum host[::ffff:192168163101]add num [1]

2019-07-03 15:02:41474 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdbt1

2019-07-03 15:02:41474 [LOCK][INFO ][S:2108][Q:13221]:acquired WRITE lock: testdbt16ef6f8a9-87f0-4d6c-8043-899367d02df3, lwp:35693

2019-07-03 15:02:41475 [LOAD][INFO ][S:2108][Q:13221]:AddNodeLoadFileNum cur node state:[ip:::ffff:192168163100:num:0][ip:::ffff:192168163101:num:1]

# 此时SQL已经在loading状态,

# 开始下发任务。一般是某个节点性能导致,或者数据非常倾斜。

# a) 可以测试从每个数据库的数据节点,用ftp直接获取数据文件的性能

# 比如 curl ftp://XXXXX/XXcsv > 1txt

# 多跑几次,看看哪个节点比较慢

# b) 排查机器的内存是否出现SWAP, *** 作系统/var/log/messages是否有磁盘报错

# c) 查看CPUINFO是否有异常降频

# d) 用top、iotop、nmon等工具观察一段时间系统资源,是否有资源紧张

#

2019-07-03 15:02:41476 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:set scn = 395447

2019-07-03 15:02:41521 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:LOAD DATA INFILE 'ftp://gbase:@192168163100/t1txt#offset=0&length=8&firstblock&ffsize=8,ftp://gbase:@192168163100/t1_2txt#offset=0&length=8&firstblock&ffsize=8' INTO TABLE `testdb``t1_n1` DATA_FORMAT 3 FILE_FORMAT UNDEFINED HOST '::ffff:192168163101' CURRENT_TIMESTAMP 1562137361 SCN_NUMBER 395447 GCLUSTER_PORT 5258 INTO SERVER (HOST '::ffff:192168163100, ::ffff:192168163101', PORT '5050', USER 'root', DATABASE 'testdb', TABLE 't1_n1, t1_n2', COMMENT 'table_host 0 1 0 # 1 0 1, scn 395447, group -1')

2019-07-03 15:02:42004 [LOAD][INFO ][S:2108][Q:13221]:ReduceNodeLoadFileNum host[::ffff:192168163100] reduce num [0]

2019-07-03 15:02:42004 [LOAD][INFO ][S:2108][Q:13221]:ReduceNodeLoadFileNum host[::ffff:192168163101] reduce num [1]

2019-07-03 15:02:42004 [LOAD][INFO ][S:2108][Q:13221]:ReduceNodeLoadFileNum cur node state:[ip:::ffff:192168163100:num:0][ip:::ffff:192168163101:num:0]

2019-07-03 15:02:42004 [LOAD][INFO ][S:2108][Q:13221]:Task 395447 finished, Loaded 8 records, Skipped 0 records

# 拿到排它锁,要切换版本了。

2019-07-03 15:02:42008 [LOCK][INFO ][S:2108][Q:13221]:acquired WRITE lock: testdbt109B5BEEC-1EF7-4FA6-9850-C4217A781E0F, lwp:35693

# 设置SCN

2019-07-03 15:02:42008 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:SET SELF SCN = 395447

2019-07-03 15:02:42009 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:SET SELF SCN = 395447

2019-07-03 15:02:42009 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:SET SELF SCN = 395447

2019-07-03 15:02:42009 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:SET SELF SCN = 395447

# 以指定的SCN来刷新数据

2019-07-03 15:02:42011 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:flush commit "testdb""t1_n1" scn_number 395447

2019-07-03 15:02:42011 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:flush commit "testdb""t1_n2" scn_number 395447

2019-07-03 15:02:42019 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:flush commit "testdb""t1_n2" scn_number 395447

2019-07-03 15:02:42055 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:flush commit "testdb""t1_n1" scn_number 395447

# 验证SCN

2019-07-03 15:02:42060 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:select scn from information_schematables where table_schema = 'testdb' and table_name = 't1_n1'

2019-07-03 15:02:42061 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:select scn from information_schematables where table_schema = 'testdb' and table_name = 't1_n1'

2019-07-03 15:02:42061 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:select scn from information_schematables where table_schema = 'testdb' and table_name = 't1_n2'

2019-07-03 15:02:42061 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:select scn from information_schematables where table_schema = 'testdb' and table_name = 't1_n2'

2019-07-03 15:02:42063 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:set autocommit=1

2019-07-03 15:02:42063 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:set autocommit=1

2019-07-03 15:02:42063 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163100, SQL:set autocommit=1

2019-07-03 15:02:42063 [SQLDISP][INFO ][S:2108][Q:13221]:Target:::ffff:192168163101, SQL:set autocommit=1

# SQL处于commit阶段 或者 rollback阶段

# 提交commit成功

2019-07-03 15:02:42067 [COMMIT][INFO ][S:2108][Q:13221]:commit table(testdbt1) success for scn:395447

2019-07-03 15:02:42068 [LOAD][INFO ][S:2108][Q:13221]:successful to cluster load

# 释放锁

2019-07-03 15:02:42068 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdb

2019-07-03 15:02:42069 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdbt109B5BEEC-1EF7-4FA6-9850-C4217A781E0F

2019-07-03 15:02:42070 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdbt1rsync

2019-07-03 15:02:42071 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdbt1580D5F90-B287-4199-B057-E6FBD44B5BFA

2019-07-03 15:02:42072 [LOCK][INFO ][S:2108][Q:13221]:unlocked: testdbt16ef6f8a9-87f0-4d6c-8043-899367d02df3

1可以使用ETL工具,比如PowerCenter,Datastage,这个做的好处是可以直接自动调用,适合做完后定时、经常使用的场合。

2使用文本load,这种方式是先吧数据从源数据库导出至文本,然后使用Load命令导入数据库中,这个在最后导入的速度是最快的。

3其他程序的方法,一般来说到了执行阶段都是拼成Insert语句让数据库执行的,这样的速度都不会很快。

基本知识

Oracle 的  SQL LOADER  可以将外部格式化的文本数据加载到数据库表中 通常 与 SPOOL导出文本数据方法配合使用

命令格式

SQLLDR keyword=value [ keyword=value ……]

例 $ sqlldr user/pwd control=emp ctl data=emp dat bad=emp bad log=emp log

控制文件

SQLLOADER  根据控制文件可以找到需要加载的数据 并且分析和解释这些数据

控制文件由三个部分组成 具体参数参考帮助文档   全局选件 行 跳过的记录数等 INFILE 子句指定的输入数据   数据特性说明

ment ——注释

load data infile

append    ——除了 append外 还有 insert replace truncate等方式

into table emp fields terminated b y |

no             float external name char( )

age           integer external

duty         char( ) salary      float external

upd_ts     date( ) YYYYMMDDHH MISS )

begindata

|Mulder| | | |

|Scully| | | |

控制文件中infile选项跟sqlldr 命令行中data 选项含义相同 如使用infile 则表明数据在本控制文件以 begin data 开头的区域内 一些选项 FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x FILLER_ FILLER //  指定某一列将不会被装载

DEPTNO position( ) DNAME position( ) //  指定列的位置SEQNO RECNUM //载入每行的行号

SKIP n          //  指定导入时可以跳过多少行数据

数据文件

按控制文件数据格式定义的数据行集

|Tom| | | |

|Jerry| | | |

固定格式 可变格式 流记录格式

固定格式

当数据固定的格式(长度一样)时且是在文件中得到时 要用 INFILE fix n

load data

infile example dat fix

into table example

fields terminated b y optionally enclosed by

(col char( ) col char( )) example dat

cd fghi

lmn

pqrs

uvwx

可变格式

当数据是可变格式(长度不一样)时且是在文件中得到时 要用 INFILE var n 如

load data

infile example dat var

into table example

fields terminated b y optionally enclosed by

(col char( ) col char( )) example dat

hello cd world im

my name is

流记录格式 // Stream recored format load data infile xx dat str |\n

into table xx field terminated b y optionally enclosed by

(col char( ) col char( ))

example dat

hello ccd |

world bb |

  坏文件

bad=emp bad坏文件包含那些被 SQLLoader拒绝的记录 被拒绝的记录可能是不符合要求的记录

  日志文件及日志信息

log=emp log当 SQLLoader  开始执行后 它就自动建立  日志文件 日志文件包含有加载的总 结 加载中的错误信息等

  高级选项

Conventional Path Load与Direct Path Load

Conventional path Load 通过常规通道方式上载

特点 mit always  gen redo logs   enforce all constraints fire insert triggers can load into cluster other user can make change

rows 每次提交的记录数

bindsize 每次提交记录的缓冲区

readsize 与 bindsize 成对使用 其中较小者会自动调整到较大者

sqlldr 先计算单条记录长度 乘以 rows 如小于 bindsize 不会试图扩张 rows以填充 bindsize 如超出 则以 bindsize 为准 命令为

$ sqlldr dbuser/oracle control=emp ctl log=emp log rows= bindsize=

Direct Path Load

通过直通方式上载 可以跳过数据库的相关逻辑 不进行  SQL解析 而直接将数 据导入到数据文件中

特点 save conditionly gen redo logs enforce PK UK NN not fire triggers can not load into cluster other user can not make change命令为

$ sqlldr dbuser/oracle control=emp ctl log=emp log direct=true

SPOOL导出文本数据方法

导入的数据文件可以用 SPOOL导出文本数据方法生成

SQLPLUS环境设置

SET NEWPAGE NONE HEADING OFF SPACE

PAGESIZE SET TRIMOUT ON TRIMSPOOL ON LINESIZE

注 LINESIZE 要稍微设置大些 免得数据被截断 它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格

但是如果 LINESIZE 设置太大 会大大降低导出的速度 另外在 WINDOWS下导 出最好不要用 PLSQL导出 速度比较慢 直接用  MEND 下的 SQLPLUS命令最 小化窗口执行 对于字段内包含很多回车换行符的应该给与过滤 形成比较规矩的文本 文件

通常情况下 我们使用 SPOOL方法 将数据库中的表导出为文本文件 如下述

set trimspool on

set linesize pagesize newpage heading off    term off spool  路径+文件名

select col || ||col || ||col || ||col || …… from tablename

spool off

脚本

  将表中数据记录导出为字段值用分隔符 | 分开的 dat文件

#!/bin/ksh

##################################################################

##    名称 unloadtable

##    功能   本 shell 用于将表中数据记录导出

##                 导出为字段值用分隔符 | 分开的 dat文件

##    编者

##    日期

##################################################################

if [ $# ne ]

then echo usage unloadtable tablename username password

exit

fi

##准备工作

echo set heading off     >/tmp/$l

echo set pagesize >>/tmp/$l

echo set linesize     >>/tmp/$l

echo set feedback off    >>/tmp/$l

echo set tab off              >>/tmp/$l

echo  select  column_name||   from  user_tab_columns  where  lower(table_name)= $   order  by

column_id >> /tmp/$l

##产生 select 语句

echo set heading off     >/tmp/$ sel

echo set pagesize >>/tmp/$ sel

echo set linesize     >>/tmp/$ sel

echo set feedback off    >>/tmp/$ sel

echo set tab off              >>/tmp/$ sel

echo select >>/tmp/$ sel

echo  `sqlplus  s  $ /$   <  /tmp/$l`  |sed  s/ /|| | ||/g   |sed  s/||$//g |sed  s/date/\ date\ /g

>>/tmp/$ sel

##生成 dat文件

#echo from $ \n/ >>/tmp/$ sel    由于  /  导致多执行一次 select

echo from $ \n >>/tmp/$ sel

sqlplus s $ /$ < /tmp/$ sel >$ _tmp dat

#awk {if(FNR!= ) print $ } $ _tmp dat >$ dat       FNR 选项使得第一条记录选不出

awk {print $ } $ _tmp dat >$ dat

rm f $ _tmp dat

  将数据导入到相应表中

#!/bin/ksh

##################################################################

##    名称 loadtable

##    功能 本 shell 用于将已经准备好的 dat数据文件导入相应的表中

##               dat 文件各个字段值用分隔符 | 分开

##    编者

##    日期

##################################################################

if [ $# ne ]

then

echo usage loadtable tablename username    password exit fi

##准备工作

echo set heading off     >/tmp/$lsql

echo set pagesize >>/tmp/$lsql

echo set linesize     >>/tmp/$lsql

echo set feedback off    >>/tmp/$lsql

echo set tab off              >>/tmp/$lsql

echo  select  column_name||   from  user_tab_columns  where  lower(table_name)= $   order  by

column_id >> /tmp/$lsql

##产生 ctl文件

echo load data >/tmp/$ ctl

echo infile >>/tmp/$ ctl

echo into table $ >>/tmp/$ ctl

echo fields terminated by | >>/tmp/$ ctl

echo `sqlplus s $ /$ < /tmp/$lsql` |sed s/ $/)/g |sed s/^/(/g >>/tmp/$ ctl

##开始导入数据

echo truncate table $ >/tmp/$ sql

sqlplus $ /$ < /tmp/$ sql

lishixinzhi/Article/program/Oracle/201311/17312

此事件是在一个窗体被装载时发生。当使用 Load 语句启动应用程序,或引用未装载的窗体属性或控件时,此事件发生。

语法

Private Sub Form_Load( )

Private Sub MDIForm_Load( )

说明

通常,Load 事件过程用来包含一个窗体的启动代码—例如,指定控件缺省设置值,指明将要装入 ComboBox 或 ListBox 控件的内容,以及初始窗体级变量等。

Load 事件是在 Intialize 事件之后发生。

当在代码中引用一个未装载窗体的属性时,该窗体自动被装载但不自动成为可视窗体,除非 MDIChild 属性被设置为 True。如果一个 MDIForm 对象未被装载而一个 MDI 子窗体却被装载,则 MDIForm 和该子窗体都自动被装载并且都将成为可视的窗体。除非使用 Show 方法或将 Visible 属性设置为 True,否则其它窗体都不能显示出来。

例如将scott用户下所有表,导入到test用户下

1 exp scott/tiger file=scottdmp owner=scott

2 (1) 如果test用户下有scott的表,哪些需要先删除在导入

conn test/test

select 'drop table '||table_name||' purge;' from user_tables;

imp test/test file=scottdmp fromuser=scott touser=test

(2) 如果test用户下没有scott用户的表,可以直接导入

imp test/test file=scottdmp fromuser=scott touser=test

我估计你是问怎么从文件导入到数据库。一般每个数据库都有一个从文件直接load数据到数据库的命令或者工具。

比如SQLServer 有个bcp。 MySql 就是 load。

给你搜了详细的帮助。看看链接吧。以下是精简的使用方法:

基本用法:

mysql> USE db1;

mysql> LOAD DATA INFILE "/datatxt" INTO TABLE db2my_table;

指定行,字段的分隔符:

mysql> LOAD DATA INFILE 'datatxt' INTO TABLE tbl_name

FIELDS TERMINATED BY ',' ENCLOSED BY '"'

LINES TERMINATED BY '\n';

以上就是关于GBase 8a数据库通过LOAD方式加载时,如果出现功能报错,如何排查全部的内容,包括:GBase 8a数据库通过LOAD方式加载时,如果出现功能报错,如何排查、往数据库中加载大量数据(1000w条)有哪些方法,最快的是哪种,为什么、Oracle数据库备份与恢复之二:SQL*Loader等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10159056.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存