楔子

今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。

SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。

由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用,官方的教程也是用Hana Studio进行演示的,但是这有点麻烦:

  • Hana运行在服务器上,Hana Studio作为客户端运行在终端电脑上,使用Hana的场景基本上就是数据量大导致查询慢的场景,都这种情况了,难不成还得把备份完整不压缩的数据放到运维的电脑上?

  • 跨主机导入、导出受带宽和交换机的性能影响,传输效率会不会太低了点呢?

  • 普通电脑的配置不会太高,CPU和网卡的性能不见得会很快,导入、导出效率低势必会让操作人花费大量的时间

  • Hana Studio是基于eclipse开发的,本质上是个Java程序,占用内存会比较多,如果因为导出、导入时数据太大把Hana Studio内存给撑爆了呢?这不又得重新操作了嘛!

  • 而且导数据期间,这电脑基本干不了啥事了。

那么有没有一种办法能不占用运维、DBA的主机网络、硬盘,效率还能翻上几翻的办法呢?

  • 有的,兄弟,有的。
  • 那就是命令行操作,在数据库服务器上使用一部分CPU、硬盘去执行备份。
  • 命令行操作还有个好处是可以在传输前在服务器本地压缩一下,大大减少硬盘使用量以及传输压力。

本文采用SAP HANA的命令行工具hdbsql进行处理,由于在网上找资料和AI问答都很费劲,这才花时间整理出这篇资料。

一方面这符合我目前的DevOps的工作定位————提升效率,

另一方面也能减少被Hana Studio支配的苦恼————谁愿意装这种破玩意儿,操作逻辑反人类!

我会在本文中放上官方文档相关内容以待读者自行参考,在文章最后放上我踩坑总结的操作方法。

心动不如行动,我们开始吧,始吧,吧……(说话有回音才能显得我比较高大)

环境

公司目前使用hana官方的express edition 2.00.xx.00.20240701.1镜像部署测试环境数据库。

命令同样适用于2.00.xx其他版本(暂未在其他大版本上试验过,读者可自行尝试),

理论上命令行工具的设计应是跨版本一致的。

文中 SYSTEM 假定密码为 abcdefg ,普通用户 GCREPORT_PRD 假定密码为 12345678

迁移导入到普通用户 GCREPORT_TEST 假定密码为 87654321

数据库用户及组ID为12000:79

官方文档

参考自《SAP HANA数据库–SQL参考手册》数据导入导出语句 章节。

EXPORT - 导出命令

语法:

EXPORT <object_name_list> AS <export_format> INTO <path> [WITH <export_option_list>]

语法元素:

WITH <export_option_list>: 可以使用 WITH 子句传入 EXPORT 选项。 

<object_name_list> ::= <OBJECT_NAME>,... | ALL 

<export_import_format> ::= BINARY | CSV 

<path> ::= 'FULL_PATH' 

<export_option_list> ::= <export_option> | <export_option_list> <export_option> 

<export_option> ::= 

REPLACE | 

CATALOG ONLY | 

NO DEPENDENCIES | 

SCRAMBLE [BY <password>] | 

THREADS <number_of_threads>

描述:

EXPORT

命令以指定的格式 BINARY 或者 CSV,导出表、视图、列视图、同义词、序列或者存储过程。临时表的数据和"no logging"表不能使用 EXPORT 导出表。

OBJECT_NAME

将导出对象的 SQL 名。欲导出所有集合下的所有对象,你要使用 ALL 关键字。如果你想导出指定集合下的对象,你应该使用集合名和星号,如"SYSTEM"."*"。

BINARY

表数据将以内部 BINARY 格式导出。使用这种方式导出数据比以 CSV 格式快几个数量级。只有列式表可以以二进制格式导出。行式表总是以 CSV 格式导出,即使指定了 BINARY 格式。

CSV

表数据将以 CSV 格式导出。导出的数据可以导入至其他数据库中。另外,导出的数据顺序可能被打乱。列式和行式表都可以以 CSV 格式导出。

FULL_PATH

将导出的服务器路径。

注意:当使用分布式系统,FULL_PATH 必须指向一个共享磁盘。由于安全性原因,路径可能不包含符号链接,也可能不指向数据库实例的文件夹内,除了'backup' 和 'work'子文件夹。有效路径(假设数据库实例位于/usr/sap/HDB/HDB00)的例子:

'/tmp'
'/usr/sap/HDB/HDB00/backup'
'/usr/sap/HDB/HDB00/work'

REPLACE

使用 REPLACE 选项,之前导出的数据将被删除,而保存最新导出的数据。如果未指定 REPLACE 选项,如果在指定目录下存在先前导出的数据,将抛出错误。

CATALOG ONLY

使用 CATALOG ONLY 选项,只导出数据库目录,不含有数据。

NO DEPENDENCIES

使用 NO DEPENDENCIES 选项,将不导出已导出对象的相关对象。

SCRAMBLE

以 CSV 格式导出时,使用 SCRAMBLE [BY '<password>'],可以扰乱敏感的客户数据。当未指定额外

的数据库,将使用默认的扰乱密码。只能扰乱字符串数据。导入数据时,扰乱数据将以乱序方式

导入,使最终用户无法读取数据,并且不可能回复原状。

THREADS

表示用于并行导出的线程数。

使用的线程数给定 THREADS 数目指定并行导出的对象数,默认为 1。增加数字可能减少导出时间,但也会影响系统性能。

应当考虑如下:

  • 对于单个表,THREADS 没有效果。

  • 对于视图或者存储过程,应使用 2 个或更多的线程(最多取决于对象数)。

  • 对于整个集合,考虑使用多于 10 个线程(最多取决于系统内核数)。

  • 对于整个 BW / ERP 系统(ALL 关键字)的上千张表,数量大的线程是合理的(最多 256)。

系统和监控视图:

你可以使用系统视图 M_EXPORT_BINARY_STATUS 监控导出的进度。

你可以在如下语句中,使用会话 ID 从相应的视图中终止导出会话。

ALTER SYSTEM CANCEL [WORK IN] SESSION 'sessionId'

导出的详细结果存储在本地会话临时表#EXPORT_RESULT。

例子:

EXPORT "SCHEMA"."*" AS CSV INTO '/tmp' WITH REPLACE SCRAMBLE THREADS 10

IMPORT - 导入命令

语法:

IMPORT <object_name_list> [AS <import_format>] FROM <path> [WITH <import_option_list>]

语法元素:

WITH <import_option_list>: 

可以使用 WITH 子句传入 IMPORT 选项。 

<object_name_list> ::= <object_name>,... | ALL 

<import_format> ::= BINARY | CSV 

<path> ::= 'FULL_PATH' 

<import_option_list> ::= <import_option> | <import_option_list> <import_option> 

<import_option> ::= 

REPLACE | 

CATALOG ONLY | 

NO DEPENDENCIES | 

THREADS <number_of_threads>

描述:

IMPORT 命令导入表、视图、列视图、同义词、序列或者存储过程。临时表的数据和"no logging"表不能使用 IMPORT 导入。

OBJECT_NAME

将导入对象的 SQL 名。欲导入路径中的所有对象,你要使用 ALL 关键字。如果你想将对象导入至指定集合下,你应该使用集合名和星号,如"SYSTEM"."*"。

BINARY | CSV

导入过程可能忽略格式的定义,因为在导入过程中,将自动检测格式。将以导出的同样格式导入。

FULL_PATH

从该服务器路径导入。

注意:当使用分布式系统,FULL_PATH 必须指向一个共享磁盘。如果未指定 REPLACE 选项,在指定目录下存在相同名字的表,将抛出错误。

CATALOG ONLY

使用 CATALOG ONLY 选项,只导入数据库目录,不含有数据。

NO DEPENDENCIES

使用 NO DEPENDENCIES 选项,将不导入已导入对象的相关对象。

THREADS

表示用于并行导入的线程数。

使用的线程数给定 THREADS 数目指定并行导入的对象数,默认为 1。增加数字可能减少导入时间,但也会影响系统性能。

应当考虑如下:

  • 对于单个表,THREADS 没有效果。
  • 对于视图或者存储过程,应使用 2 个或更多的线程(最多取决于对象数)。
  • 对于整个集合,考虑使用多余 10 个线程(最多取决于系统内核数)。 对于整个 BW / ERP 系统(ALL 关键字)的上千张表,数量大的线程是合理的(最多 256)。

系统和监控视图:

你可以使用系统视图 M_IMPORT_BINARY_STATUS 监控导入的进度。

你可以在如下语句中,使用会话 ID 从相应的视图中终止导入会话。

ALTER SYSTEM CANCEL [WORK IN] SESSION 'sessionId'

导入的详细结果存储在本地会话临时表#IMPORT_RESULT。


IMPORT FROM - 将外部 csv 文件的数据导入至一个已有的表中

语法:

IMPORT FROM [<file_type>] <file_path> [INTO <table_name>] [WITH <import_from_option_list>]

语法元素:

WITH <import_from_option_list>: 

可以使用 WITH 子句传入 IMPORT FROM 选项。 

<file_path> ::= '<character>...' 

<table_name> ::= [<schema_name>.]<identifier> 

<import_from_option_list> ::= <import_from_option> | <import_from_option_list> <imp 

ort_from_option> 

<import_from_option> :: = 

THREADS <number_of_threads> | 

BATCH <number_of_records_of_each_commit> | 

TABLE LOCK | 

NO TYPE CHECK | 

SKIP FIRST <number_of_rows_to_skip> ROW | 

COLUMN LIST IN FIRST ROW | 

COLUMN LIST ( <column_name_list> ) | 

RECORD DELIMITED BY '<string_for_record_delimiter>' | 

FIELD DELIMITED BY '<string_for_field_delimiter>' | 

OPTIONALLY ENCLOSED BY '<character_for_optional_enclosure>' | 

DATE FORMAT '<string_for_date_format>' | 

TIME FORMAT '<string_for_time_format>' | 

TIMESTAMP FORMAT '<string_for_timestamp_format>' |

描述:

IMPORT FROM 语句将外部 csv 文件的数据导入至一个已有的表中。

THREADS:表示可以用于并行导出的线程数。默认值为 1,最大值为 256。

BATCH:表示每个提交中可以插入的记录数。

THREADS 和 BATCH 可以通过启用并行加载和一次提交多条记录,实现加载的高性能。一般而言, 对于列式表, 10 个并行加载线程以及 10000 条记录的提交频率是比较好的设置。

TABLE LOCK:锁住表为了更快的导入数据至列式表。如果指定了 NO TYPE CHECK,记录将在插入时,不检查每个字段的类型。

SKIP FIRST <int> ROW:跳过插入前 n 条记录。

COLUMN LIST IN FIRST ROW:表示在 CSV 文件中第一行的列。

COLUMN LIST ( <column_name_list> ):表示将要插入的字段列表。

RECORD DELIMITED BY '<string>':表示 CSV 文件中的记录分隔符。

FIELD DELIMITED BY '<string>':表示 CSV 文件中的字段分隔符。

OPTIONALLY ENCLOSED BY '<character>':表示字段数据的可选关闭符。

DATE FORMAT '<string>':表示字符的日期格式。如果 CSV 文件有日期类型,将为日期类型字段使用指定的格式。

TIME FORMAT '<string>':表示字符的时间格式。如果 CSV 文件有时间类型,将为时间类型字段使用指定的格式。

TIMESTAMP FORMAT '<string>':表示字符的时间戳格式。如果 CSV 文件有时间戳类型,将为日期类型字段使用指定的格式。

例子:

IMPORT FROM CSV FILE '/data/data.csv' INTO "MYSCHEMA"."MYTABLE" WITH RECORD DELIMITED BY
'\n' FIELD DELIMITED BY ',';

踩坑总结

坑1:Hana镜像的SYSTEM用户竟然没有备份的权限,只有导入的权限。

坑2:虽然SYSTEM用户有部分权限的授予权限,但Hana限制当前用户不能为当前用户赋权,导出只能由普通用户执行。

坑3:不像传统数据库SQL那样,hdbsql登录后可以输入英文单引号和双引号,但是这两者并不等同!

以下命令均在数据库服务器所在环境中执行。

导出

(仅首次需要)为用户授备份与导出权限,这里为GCREPORT_PRD用户赋权。

hdbsql -i 90 -d HXE -u SYSTEM -p 'abcdefg'
GRANT BACKUP ADMIN,EXPORT TO GCREPORT_PRD;
\q

登录GCREPORT_PRD用户,执行4线程导出操作。

hdbsql -i 90 -d HXE -u GCREPORT_PRD -p '12345678'
EXPORT GCREPORT_PRD."*" AS BINARY INTO '/hana/mounts/GCREPORT_PRD' WITH REPLACE THREADS 4;
\q

特别注意:"*"用得是英文双引号,前边的用户SCHEMA名称也可以用英文双引号包围,不能用单引号!

压缩、迁移与解压

cd /hana/mounts
tar zcf GCREPORT_PRD.tar.gz GCREPORT_PRD

假设已将GCREPORT_PRD.tar.gz移到另一个服务上,解压

cd /hana/mounts
tar zxf GCREPORT_PRD.tar.gz

授权(仅供参考)

chown 12000:79 -R GCREPORT_PRD

导入

使用SYSTEM用户导入就行,这里切换了SCHEMA,由GCREPORT_PRD导入为GCREPORT_TEST。

hdbsql -i 90 -d HXE -u SYSTEM -p 'abcdefg'
IMPORT ALL AS BINARY FROM '/hana/mounts/GCREPORT_PRD' WITH REPLACE RENAME SCHEMA GCREPORT_PRD TO GCREPORT_TEST THREADS 4;
\q

今天的文章就到这里了,如果对你有启发,给我来个点赞、关注呗!

我是Hellxz,下次见!

SAP HANA使用命令行快速导出导入的更多相关文章

  1. linux命令行下导出导入.sql文件

    一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构(以管理员身份运行): ------------------------------------ ...

  2. mysql 命令行快速导出数据,导入数据

    如果数据有20几万以上的时候,下面的方法很实用 导出数据 1.into outfile select * from table into outfile 'C:/a.sql'; 2.mysqldump ...

  3. mysql 命令行快速将数据库转移到另一个服务器中(数据库备份还原)

    想将A服务器中的数据库快速转移到B服务器中,一般是先从A服务器中备份下来,下载备份数据,还原到B服务器中.使用phpMyAdmin备份和还原针对数据量很小的情况下很方便,数据量大的话很容易中断失败. ...

  4. centos 宝塔 使用命令行快速导入数据库sql

    先将sql文件上传到服务器,例如上传到www文件夹 然后打开命令行工具 输入 mysql -u 数据库用户名 -p 然后复制密码进去 然后输入 use 数据库名 回车 然后输入 source /www ...

  5. 【PHP实现】高效使用印象笔记之命令行快速保存

    一.功能 脑袋中冒出一个想法时,命令行(Terminal)中输入一条命令快速保存到Evernote. 注:这里适用于保存简短的内容 不喜欢听絮叨的,直接文末找Github地址吧. 二.想法来源 一直使 ...

  6. 使用NPOI快速导出导入Excel

    这两天做项目需要导入导出EXCEL,是基于NPOI的封装,设计思路是使用DataTable,然后导出一个和DataTable一模一样的Excel表出来 github地址:https://github. ...

  7. linux命令行—《命令行快速入门》

    pwd print working directory 打印工作目录 hostname my computer's network name 电脑在网络中的名称 mkdir make director ...

  8. Mac 在命令行快速切换目录 mark

    转自: http://www.ccvita.com/520.html ,略修改. 每天在命令行下,一大部分的工作都是一遍又一遍的输入 cd ~/some/very/deep/often-used/di ...

  9. shell命令行快速编辑命令

    ctrl r:命令行出现 reverse-i-search,输入字符将在输入历史中匹配命令 ctrl p:向前翻看历史 ctrl n:向后翻看历史 ctrl a:命令行首 ctrl e:命令行尾 ct ...

  10. 使用Maven命令行快速创建项目骨架(archetype)

      > mvn archetype:generate 接下来就会输出一些列带索引变化的archetype项可供我们选择,然后提示我们选择一个编号,可以直接回车选择默认的编号(392),然后就跟着 ...

随机推荐

  1. Maven:目前的部分技术

  2. VScode配置X11转发!让你彻底摆脱显示屏!!!

    作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 在我们远程SSH使用开发板或者是服务器开发的时候,你是否总是苦于没有图像显示环境导致OpenCV的cv2.sho ...

  3. 安全可信 | 首批!天翼云边缘安全加速平台AccessOne通过信通院“软件自研创新能力”专项评估

    近日,中国信息通信研究院(以下简称"中国信通院")公布"软件自研创新能力"专项评估(简称"可信研创")结果,天翼云边缘安全加速平台Acces ...

  4. Atcoder ABC390F Double Sum 3 题解 [ 绿 ] [ 贡献思维 ] [ 计数 ]

    Double Sum 3:简单计数题. 思路 首先考虑单个区间的 \(f\) 值如何计算,显然等于值域上连续段的个数.那么我们进一步观察值域上连续段的性质,发现一个连续段的开头一定满足比开头小 \(1 ...

  5. 我的世界服务端插件安装 Vault经济前置插件安装(商店,圈地等需要该前置插件)

    Minecraft服务端插件安装-Vault用户登录插件安装 需要准备Vault插件 Vault.jar经济前置插件 Minecraft Vault插件是一款用于Minecraft服务器的多功能经济. ...

  6. 【计算机】常见CPU指令集发展及其关系

    [计算机]常见 CPU 指令集发展及其关系 CPU 与指令集 任何计算机都有一块 CPU,CPU 有其支持的指令集,根据指令集间的兼容性,一种 CPU 可能同时支持多种指令集. 指令集中记录了 CPU ...

  7. 【博客搭建】Latex数学书写笔记

    [博客搭建]Latex 数学书写笔记 Latex 是一种文档书写语言,支持大量的特殊字符,包括书写数学公式,并且很多 Markdown 环境都支持该语言. 布局实现 靠左:使用内联数学块$...$. ...

  8. SparkRDD算子(transformations算子和actions算子)

    RDD提供了两种类型的操作:transformation和action1.所有的transformation都是采用的懒策略,如果只是将transformation提交是不会执行计算的,计算只有在ac ...

  9. CCRC软件开发评审-材料应该怎么准备

    1. 什么是CCRC软件开发评审 软件安全开发资质认证是对软件开发方的基本资格.管理能力.技术能力和软件安全过程能力等方面进行评价全软件开发服务资质级别是衡量服务提供方的软件安全开发服务资格和能力的尺 ...

  10. python excel 读取:如何读取符合多个条件的记录【出差、外出、调休、年假】

    if 语句结合or 实现:读取所有出差.外出.调休.年假的记录 if '出差' in str(c_cell) or '外出' in str(c_cell) or'调休' in str(c_cell) ...