如何通过命令行高效执行SAP HANA数据导出与导入操作?
摘要:楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和
楔子
今天折腾了接近一下午,就为了使用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 格式快几个数量级。只有列式表可以以二进制格式导出。
