前言
我司要进行大量数据抽取的场景主要是SQL Server到GreenPlum,已知GP的GPLOAD可以高效加载数据到GP,那么SQL Server有没有什么高效导出数据的工具呢?到微软的SQL文档里面查了一下,果然找到了一个叫‘大容量复制实用工具(bcp)’的东东,那么来动手试试吧!
安装
我的服务器是用的CentOS7,因此按照官方文档中‘在 RHEL 8 上安装工具’部分操作:
下载存储库配置文件:
#下载存储库配置文件到yum源
curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/msprod.repo
删除之前安装过的mssql-tools:
yum remove mssql-tools unixODBC-utf16-devel
运行以下命令,以使用 unixODBC 开发人员包安装 mssql-tools:
yum install mssql-tools unixODBC-devel
安装后,可以看到/opt下有了一个mssql-tools的目录,我们需要的bcp在/opt/mssql-tools/bin/目录下面:
最后我们添加环境变量,使bcp工具可以方便使用:
#修改环境变量文件
vi /etc/profile
添加如下图所示的两行:
然后使用以下命令刷新环境变量使其生效:
source /etc/profile
在任意路径输入bcp,看看环境变量是否配置成功:
测试
bcp支持许多参数,我们测试需求是从网络上一台SQL Server服务器导出某张大数据表到本地txt文件,命令格式如下:
bcp [数据库名].[架构名].[表名] [模式in|out] [文件路径全名] -S [服务器地址/实例名] -U [数据库用户] -P [数据库用户密码] -c
用同一局域网100W行2列的一个数据表试了下,耗时13.57s,平均每秒7W3行,果然够快:
第二次用了一个局域网967.8W行30列的数据表试了下,耗时186s,平均每秒5.1W行,还是相当不错的:
接下来想法是将将bcp导出的数据直接往linux管道写,然后让GPload直接从管道读取并加载到GreenPlum数仓,敬请期待!