聊聊SAP HANA的命令行
-苟志于仁矣,无恶也。(更多知识关注公众号:SAP Technical)
写在前面
我们平常都是用SAP HANA Studio来连接数据库、创建新表、导入数据、执行查询等工作,众所周知,SAP HANA是运行在SUSE上的,而SUSE本身是Linux的一个发行版,因此大家肯定会想是否可以通过命令行或者SHELL脚本管理和操纵数据库。答案当然是YES,SAP HANA提供了HDBSQL用于数据库的管理、查询和其他一些工作。下面我们就来看看具体的使用。这篇文章是一个朋友很早以前写的,拿出来和大家分享一下。
命令行工具
SAP HANA的命令行工具主要是hdbsql,可以交互式或非交互式运行,还可以从文件导入命令执行。我们首先来看看如何交互式运行命令。我们现在已经有了一个SAP HANA数据库。进入到命令行后我们需要切换到HANA安装时创建的用户,我们将切换到这个用户名:su – a17adm。然后输入hdbsql,我们就进入了交互式界面,如下图所示。如果你用过MySQL的命令行,应该会觉得似曾相识,确实它们大同小异。本文的测试案例所使用的SAP HANA版本为SAP HANA SPS6 Revision 60.00。
公众号:SAP Technical为了交互式执行命令,必须首先登录到数据库。有两种方式,一种是进入hdbsql后登录。假设我们需要登录的数据库在本机,实例是01。为简单起见,我们就用系统管理员用户名SYSTEM,密码manager,则使用\c选项登录,如下图所示。
公众号:SAP Technical或者还可以在执行hdbsql时直接登录到数据库:hdbsql –n localhost -i 01 –u SYSTEM –p manager。
公众号:SAP Technical除了-n,-i等参数,还有其他一些参数你很可能也会用得着。可以运行hdbsql –help查看所有选项列表。
公众号:SAP Technical好,现在我们可以尝试执行一些命令了。首先我们使用\s看一下数据库的状态:
公众号:SAP Technical这里列出了主机名、数据库名、输入编码等一些基本信息。
如果你忘记了可以使用的基本命令,可以输入\?或者\h寻求帮助。
公众号:SAP Technical我们举几个常用的命令演示它的用法,其它的可以参考SAP HANA administration guide文档。\dc命令不加参数列出数据库中所有的表信息,包括表名称、字段名、字段类型、字段长度、字段是否可空、主键等,还可以加参数列出某个schema下的表信息,可使用正则表达式,%匹配零个或多个字符,而_匹配一个字符。比如我们想看SYS下D开头的所有表:\dc SYS.D%。
公众号:SAP Technical和MySQL类似,我们可以直接执行SQL命令,只是不需要以分号结束:
SELECT ID, PRICE FROM CLOTHES_MATCHING.CLOTHES_IMAGE
公众号:SAP Technical查询结果的显示是不是和MySQL有点像?我们看到显示结果虽然美观,但是不方便后期处理,相比之下我们更愿意在文件中处理这些数据,更方便的是显示成csv文件的格式,这个时候我们使用\al OFF就可以达到目的。这时的结果如下,更方便使用gawk进行进一步的处理了。
公众号:SAP Technical为了将结果写入文件,\o就派上用场了,它可以将查询结果重定向到指定的文件中,注意,如果文件已经存在,它会将数据附加到文件尾部而不会将其覆盖。
综合实例
下面我们用一个综合性的例子,结合hdbsql和SHELL脚本来完成一些简单的任务。我们的目标是完成数据库表的建立、导入一些数据、执行一些查询以表明我们的数据已成功导入并可以用来做一些实际的工作了。
假设我们要建立一个描述客户相关信息的表,其中包括客户编号、客户名、邮编、地址、联系方式这些信息。
CREATE SCHEMA HDBSQL_TEST;
CREATE TABLE HDBSQL_TEST.CUSTOMER
(
ID INTEGER NOT NULL PRIMARY KEY,
NAME NVARCHAR(50),
ZIP NVARCHAR(20),
ADDRESS NVARCHAR(100),
TELEPHONE NVARCHAR(20)
);
然后我们准备一些数据,比如data.csv
1001,”Hugh Jackman”,”10086″,”北京市朝阳区xxxxx街“,”6589xxxx”
1011,”Tom Cruise”,”10080″,”朝阳区广顺北大街xxxxx区“,”6589xxxx”
1342,”Dwayne Johnson”,”10081″,”北京市朝阳区霄云路“,”6589xxxx”
1344,”Jennifer Aniston”,”10082″,”北京市东城区xxxxx大街“,”5678xxxx”
1111,”Jennifer Lopez”,”20013″,”北京市海淀区xxxxx路“,”7623xxxx”
1012,”Megan Fox”,”103421″,”纽约市华尔街2号“,”5671xxxx”
1317,”Taylor Swift”,”13482″,”芝加哥市“,”5432xxxx”
1042,”Bill Clinton”,”23193″,”华盛顿特区宾夕法尼亚大道1600号“,”202-456-xxxx”
1043,”George W. Bush”,”23193″,”华盛顿特区宾夕法尼亚大道1600号“,”202-456-xxxx”
1044,”Barack Obama”,”23193″,”华盛顿特区宾夕法尼亚大道1600号“,”202-456-xxxx”
我们使用import导入数据,其中假设数据文件在/home/Alex,文件格式是标准的csv。
IMPORT FROM CSV FILE ‘/home/xxxxx/data.csv’ INTO “HDBSQL_TEST”.“CUSTOMER” WITH RECORD DELIMITED BY ‘\n’ FIELD DELIMITED BY ‘,’;
假设我们想要知道在华盛顿的客户信息,则
SELECT NAME, ADDRESS FROM “HDBSQL_TEST”.“CUSTOMER” WHERE ADDRESS LIKE ‘%华盛顿%’;
我们把查询信息保存到文件里,例如out.txt,这样就便于使用gawk等工具进行下一步的处理了。
我们建立一个SHELL脚本test.sh来执行所有这些工作:建立数据库表,导入数据,执行查询,得到结果。我们在hdbsql命令行中用-B和-resultencoding指明输入和输出都是UTF8格式以避免可能产生的乱码问题。
#!/bin/bash
host=localhost
instance=1
username=SYSTEM
password=manager
cmdFile=cmd.txt
outputFile=out.txt
encoding=UTF8
HDBSQL=`which hdbsql`
$HDBSQL -n $host -i $instance -u $username -p $password -B $encoding -resultencoding $encoding -I $cmdFile -o $outputFile
if [ $? -eq 0 ]
then
count=`gawk ‘BEGIN{count = 0;} {if(NR > 1) count++;} END{print count}’ $ outputFile`
echo “执行成功,总共有 $count 位客户符合条件“
fi
其中要执行的命令放到cmd.txt文件中
CREATE SCHEMA HDBSQL_TEST;
CREATE TABLE HDBSQL_TEST.CUSTOMER
(
ID INTEGER NOT NULL PRIMARY KEY,
NAME NVARCHAR(50),
ZIP NVARCHAR(20),
ADDRESS NVARCHAR(100),
TELEPHONE NVARCHAR(20)
);
IMPORT FROM CSV FILE ‘/home/xxxxx/data.csv’ INTO “HDBSQL_TEST”.”CUSTOMER” WITH RECORD DELIMITED BY ‘\n’ FIELD DELIMITED BY ‘,’;
\al OFF;
SELECT NAME, ADDRESS FROM “HDBSQL_TEST”.”CUSTOMER” WHERE ADDRESS LIKE ‘%华盛顿%’;
运行./test.sh 1>output.txt 2>error.txt。
现在打开out.txt文件,
公众号:SAP Technical我们得到了想要的结果。如果出现错误,错误信息会写入error.txt文件,帮助定位问题。
现在我们将hdbsql集成到SHELL脚本中,你可以把它放到cron任务列表来定期执行,或者用gawk对生成的结果进一步处理生成统计报告,发送每日邮件等,一切都很方便。
公众号:SAP Technical