SAP HANA使用命令行快速导出导入
楔子
今天折腾了接近一下午,就为了使用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
如需使用普通用户导入,则使用SYSTEM用户登录hdbsql为其赋权,执行
GRANT IMPORT TO 用户名;,然后再使用普通用户登录与导入。
今天的文章就到这里了,如果对你有启发,给我来个点赞、关注呗!
我是Hellxz,下次见!
相关文章:
SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用…...
goland做验证码识别时报“undefined: gosseract.NewClient”
gosseract 应该有 和 c 相关的配置库因此需要安装 cgo 并且启用 CGO_ENABLED 在cmd下面输入这个 go env -w CGO_ENABLED1 接着输入 go env 验证是否设置成功 解决了这个问题后 “undefined: gosseract.NewClient” 又出现了 # runtime/cgo …...
计算机网络 实验四 静态路由的配置与应用
一、实验目的 掌握路由器基础工作原理及静态路由协议机制熟练使用华为ENSP网络模拟器进行拓扑设计与设备配置建立系统化的网络故障排除思维通过实践验证静态路由在中小型网络中的部署优势 二、实验环境 硬件配置:标准PC终端软件工具:华为企业网络模拟…...
Vue自定义指令-防抖节流
Vue2版本 // 防抖 // <el-button v-debounce"[reset,click,300]" ></el-button> // <el-button v-debounce"[reset]" ></el-button> Vue.directive(debounce, { inserted: function (el, binding) { let [fn, event "cl…...
[每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器
文章目录 一、什么是 sync.Pool?二、sync.Pool 的基本作用三、sync.Pool 的主要方法四、sync.Pool 的内部工作原理五、sync.Pool 适用场景六、使用示例示例 1:基本使用输出示例:示例 2:并发使用 七、一个基于 sync.Pool 的 **Benc…...
3.QT-信号和槽|自定义槽函数|自定义信号}自定义的语法}带参数的信号和槽(C++)
信号和槽 Linux信号 Signal 系统内部的通知机制. 进程间通信的方式. 信号源:谁发的信号.信号的类型:哪种类别的信号信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行. Qt中的信号和Linux中的信号,虽…...
健康养生之道
在快节奏的现代生活中,健康养生不再是中老年人的专属话题,越来越多的人开始意识到,合理的养生方式是保持良好身体状态和生活质量的关键。 饮食养生是健康的基石。遵循 “食物多样、谷类为主” 的原则,保证每天摄入足够的蔬菜、…...
Spark-SQL核心编程3
数据加载与保存 通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet 数据加载方法: spark.read.lo…...
TVM计算图分割--Collage
1 背景 为满足高效部署的需要,整合大量优化的tensor代数库和运行时做为后端成为必要之举。现在的深度学习后端可以分为两类:1)算子库(operator kernel libraries),为每个DL算子单独提供高效地低阶kernel实现。这些库一般也支持算…...
elementUI中MessageBox.confirm()默认不聚焦问题处理
在项目中使用elementUI的MessageBox.confirm()出现了默认不聚焦的问题,默认确认按钮是浅色的,需要点击一下才会变成正常。面对这种问题,创建新组件,实现聚焦。替换默认的MessageBox.confirm() 解决 创建components/MessageBoxCo…...
【刷题Day20】TCP和UDP(浅)
TCP 和 UDP 有什么区别? TCP提供了可靠、面向连接的传输,适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输,适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性,保证数据按顺序…...
sql server 预估索引大小
使用deepseek工具预估如下: 问题: 如果建立一个数据类型是datetime的索引,需要多大的空间? 回答: 如果建立一个数据类型是 datetime 的索引,索引的大小取决于以下因素: 索引键的大小&#…...
利用 i2c 快速从 Interface 生成 Class
利用 i2c 快速从 Interface 生成 Class(支持 TS & ArkTS) 在日常 TypeScript 或 ArkTS 开发中,需要根据 interface 定义手动实现对应的 class,这既重复又容易出错。分享一个命令行工具 —— interface2class,简称…...
MCGS昆仑通太屏笔记
4.3寸:4013ef/e1 7寸:7032kw 特点: 如果是使用组态屏进行调试使用,选择com1如果是实际项目使用,选择com2 操作步骤: 先创建设备窗口,再创建用户界面 在设备窗口界面,依次设置如下…...
服务治理-搭建Nacos注册中心
运行nacos.sql文件。 将准备好的nacos目录和nacos.tar包上传。 192.168.59.101是我的虚拟机ip,8848是我们设置的访问端口号。...
网络--socket编程(2)
Socket 编程 TCP TCP 网络程序 和刚才 UDP 类似 . 实现一个简单的英译汉的功能 TCP socket API 详解 下面介绍程序中用到的 socket API, 这些函数都在 sys/socket.h 中。 socket(): • socket() 打开一个网络通讯端口 , 如果成功的话 , 就像 open() 一样返回一个…...
【FreeRTOS进阶】优先级翻转现象详解及解决方案
【FreeRTOS进阶】优先级翻转现象详解及解决方案 接下来我们聊聊优先级翻转这个经典问题。这个问题在实时系统中经常出现,尤其是在任务较多的场景下,而且问题定位起来比较麻烦。 什么是优先级翻转? 优先级翻转的核心定义很简单:…...
结合建筑业务讲述TOGAF标准处理哪种架构
TOGAF标准处理哪种架构 内容介绍业务架构业务策略,治理,组织和关键业务流程数据架构组织的逻辑和物理数据资产以及数据管理资源的结构应用架构待部署的各个应用程序,它们之间的交互以及与组织核心业务流程的关系的蓝图技术架构支持业务&#…...
C++入门小馆: 深入string类(一)
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
NHANES指标推荐:WWI
文章题目:Weight-adjusted waist circumference index with hepatic steatosis and fibrosis in adult females: a cross-sectional, nationally representative study (NHANES 2017-2020) DOI:10.1186/s12876-025-03706-4 中文标题:体重调整…...
2025.04.18|【Map】地图绘图技巧全解
Add circles Add circles on a Leaflet map Change tile Several background tiles are offered by leaflet. Learn how to load them, and check the possibilities. 文章目录 Add circlesChange tile 2025.04.18【Map】| 地图绘图技巧全解1. 准备工作2. 地理区域着色图&…...
PR第一课
目录 1.新建 2.PR内部设置 3.导入素材 4.关于素材窗口 5.关于编辑窗口 6.序列的创建 7.视频、图片、音乐 7.1 带有透明通道的素材 8.导出作品 8.1 打开方法 8.2 导出时,需要修改的参数 1.新建 2.PR内部设置 随意点开 编辑->首选项 中的任意内容&a…...
C# 预定义类型全解析
在 C# 编程中,预定义类型是基础且重要的概念。下面我们来详细了解 C# 的预定义类型。 预定义类型概述 C# 提供了 16 种预定义类型,包含 13 种简单类型和 3 种非简单类型。所有预定义类型的名称都由全小写字母组成。 预定义简单类型 预定义简单类型表…...
@EnableAsync+@Async源码学习笔记之六
接上文,我们本文分析 AsyncExecutionAspectSupport 的源码: package org.springframework.aop.interceptor;import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFu…...
Java CMS和G1垃圾回收器
举个真带劲的例子:把JVM内存比作你家的祖传旱厕 想象你有个祖传旱厕,分三个坑: 新坑区(年轻代):刚拉的屎热乎着(新对象)陈年坑(老年代):风干的屎…...
Vue+Notification 自定义消息通知组件 支持数据分页 实时更新
效果图: message.vue 消息组件 子组件 <template><div class"custom-notification"><div class"content"><span click"gotoMessageList(currentMessage.split()[1])">{{ currentMessage.split()[0] }}</…...
不规则曲面上两点距离求取
背景 在CT中求皮肤上两点间的弧长。由于人体表面并不是规则的曲面,不可能用圆的弧长求取方法来计算出两点间的弧长。 而在不规则的曲面上求两点的距离,都可以用类似测地线距离求取的方式来求取(积分),而转化为搜索路…...
Redis面试问题缓存相关详解
Redis面试问题缓存相关详解 一、缓存三兄弟(穿透、击穿、雪崩) 1. 穿透 问题描述: 缓存穿透是指查询一个数据库中不存在的数据,由于缓存不会保存这样的数据,每次都会穿透到数据库,导致数据库压力增大。例…...
性能比拼: Elixir vs Go
本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 对比 Elixir 和 Go 简介 许多人长期以来一直要求我对比 Elixir 和 Go。在本视频…...
精益数据分析(6/126):深入理解精益分析的核心要点
精益数据分析(6/126):深入理解精益分析的核心要点 在创业和数据驱动的时代浪潮中,我们都在不断探索如何更好地利用数据推动业务发展。我希望通过和大家分享对《精益数据分析》的学习心得,一起在这个充满挑战和机遇的领…...
