本文已参与「新人创作礼」活动,一起开启掘金创作之路
前言
在做某项目时,客户说他上一个Vender实施的定时同步数据这段时间出故障了,在没有足够业务背景情况下,我调查了相关数据集成的代码,并没发现sf上有任何数据集成或者定时任务,几经周折后,客户发了第一波实施文档,发现它们是由Data Loader在做定时同步数据。那么疑惑来了,这个Data Loader是我们平时用到的Data Loader吗?并没有发现它有定时同步数据的功能呀。直到准备Admin201考试时,无意中发现了Data Loader Command Line。
当第一次攻克这个难题后,就开始计划写这篇文章,直到1个季度过去了,这类问题又重新被抛到了我这,又花了不少时间研究,这次我想把这块好好说说,以备不时之需。
谈到这块,没做过的朋友可能想问这个技术能做什么?实施这个的流程有哪几步?成功的关键又有哪些?下面我们一一来盘点。
技术边界
能定时从Windows(仅适用于该系统)电脑指定文件夹加载数据,并同步到Salesforce。
举个例子:如果你们的业务需要每天定时同步数据到sf,而且这个量的峰值不是很好估计,涉及的对象又有很多,使用集成很可能触发限制,这个时候你可能需要考虑使用这项技术,把文件放在指定目录,定时触发command line发送指定借助Data Loader进行数据操作。
实施流程
- 下载Data Loader;
- 使用命令行创建加密key文件;
- 创建加密密码;
- 字段映射;
- 创建配置文件;
- 执行导入数据操作;
释义:我们会在一个xml的配置文件中模拟我们在Data Loader用户界面的一些配置项,比如我们需要将Data Loader连接到数据导入的目标环境,就涉及登录信息,然后我们需要选择数据操作类型insert/update/delete等,再比如我们需要确定操作对象,并指定CSV文件源,以及日志信息的存储路径等。
实例演示
- 我们需要对Servicing Consultant对象进行upsert操作,表结构如下:
本次案例,我们需要使用到的字段有:Primary_Consultant__c(Lookup Contact),Account__c(Lookup Account),Is_Primary_Consultant__c,Import_ID__c(外键);
- Data Sample:csv文件示例
- 字段映射,我们可以使用Data Loader来保存字段映射的Mapping文件,核心步骤如下:
a. 选择Upsert,使用关系字段外键来做映射(如我们不会直接使用ContactId和AccountId来作为导入关系字段的值,因为外部系统没有这些,这些值只有选择Upsert才能选中)
b. 按如下做好映射,并保存Mapping文件到指定目录:
c. 保存后的mapping文件preview:
Note: 如果你选择Insert操作,当你在做mapping时,选不到关系字段外键,如下:
- 加密登录密码,我们不会直接暴露登录密码到xml的配置文件,我们会按照如下命令行操作获取加密文件:
a. 找到Data Loader文件bin的路径:
右键打开文件位置如下:
右键属性并代开文件所在位置,并复制bin的路径。
b. 打开命令行窗口切换到bin目录路径,切换后依次输入下面指令:
encrypt.bat —k:用于生成加密key文件;
encrypt.bat –e :用于获取登录密码的加密文本;
- 保存好你的key file路径和上图标记c的加密密码文本,接下来我们来设置配置文件:process-conf.xml - 可参考官方文档
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="servicingConsultantUpsert"
class="com.salesforce.dataloader.process.ProcessRunner"
singleton="false">
<description>servicingConsultantUpsert job gets the account record from the CSV file
and upserts it into Salesforce.</description>
<property name="name" value="servicingConsultantUpsert"/>
<property name="configOverrideMap">
<map>
<!-- login info -->
<entry key="sfdc.endpoint" value="https://test.salesforce.com"/>
<entry key="sfdc.username" value="your username"/>
<entry key="process.encryptionKeyFile"
value="C:\Users\sales.dataloader\dataLoader.key"/>
<!--Password below has been encrypted using key file,
therefore, it will not work without the key setting:
process.encryptionKeyFile.
The password is not a valid encrypted value,
please generate the real value using the encrypt.bat utility -->
<entry key="sfdc.password" value="your encoded password"/>
<!-- data access and fields mapping info -->
<entry key="sfdc.entity" value="Servicing_Consultant__c"/>
<entry key="sfdc.externalIdField" value="Import_ID__c"/>
<entry key="dataAccess.type" value="csvRead"/>
<entry key="dataAccess.name"
value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\servicingConsultantUpsert.csv"/>
<!-- You can refer to the documention to configuration the operation:
https://developer.salesforce.com/docs/atlas.en-us.dataLoader.meta/dataLoader/loader_operations.htm -->
<entry key="process.operation" value="upsert"/>
<entry key="process.mappingFile"
value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\servicingconsultantUpsertMap.sdl"/>
<!-- other info -->
<entry key="process.initialLastRunDate"
value="2019-03-15T22:00:00.000-0800"/>
<entry key="sfdc.timeoutSecs" value="600"/>
<entry key="sfdc.loadBatchSize" value="200"/>
<entry key="sfdc.useBulkApi" value="true"/>
<!-- debug and log storage -->
<entry key="sfdc.debugMessages" value="true"/>
<entry key="sfdc.debugMessagesFile"
value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsertSoapTrace.log"/>
<entry key="process.outputSuccess"
value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsert_success.csv"/>
<entry key="process.outputError"
value="C:\Users\sales\Desktop\Command Line Data Loader Test\Discovery\log\servicingConsultantUpsert_error.csv"/>
</map>
</property>
</bean>
</beans>
复制代码
你也可以参考这篇文章,来了解每个参数的含义及允许的值: Data Loader 进程配置参数
- 执行命令行导入数据:此处易出错
process.bat "<process-conf.xml文件所在的路径>" <进程名称 - 使用你的process-conf.xml文件中的name属性的值>
执行完上述命令你的文件夹下会多出如下标注的文件和log文件夹的日志信息:
常见错误
如果你按上述操作可规避如下问题:
如果上述问题被正确规避,其他问题请参考log文件的error提示,一般要么是OLS/FLS/RLS等权限问题,要么是你参考的数据没找着,如下:
上面我提到过我需要插入的servicing consultant数据需要参考contact和account,如果data sample中的数据在sf系统没有,当然会出错呀,所以这个测试我需要先创建外键为data sample的contact和account数据后,再跑一遍命令行。
其他问题
SCHEDULE DATA LOADER IN SALESFORCE
Q1、如何使用windows定时任务来执行数据导入命令行?
A1、实施笔记:
1. 实时运行单个process
前提:切换到data loader bin目录下
win搜索cmd,右键以管理员身份运行
c: // 以防在其他根目录下
cd C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin
方法一:
使用相对路径处理单条数据
process ../demo/conf upsertAccounts
方法二:process.bat "C:\Users\sales\AppData\Local\salesforce.com\Data Loader\demo\conf" upsertAccounts
2. 实时自动执行多个processes:
创建batchxxx.bat文件
文件写入cmd执行语句,如下:
cd C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin
CALL process ../demo/conf upsertAccounts
CALL process ../demo/conf upsertContacts
pause
3. 定时自动执行多个processes
利用windows的task scheduler,可以创建高级task来确保在电脑关机情况下运行。
4. 其他:
AF_ScriptCode.clearSampleData(); // 清楚appForce的sample data
C:\Users\sales\AppData\Local\salesforce.com\Data Loader\bin // bin路径
C:\Users\sales.dataloader\dataLoader.key // key file path
db9569ab6b0b4cf777f082179056d14ccfec0dbe0253245e28f3eabb6ddf6abd // encrypted password -> test2020
命令行:
encrypt.bat -k
encrypt.bat -e test2020 C:\Users\sales.dataloader\dataLoader.key
process.bat "C:\Users\sales\AppData\Local\salesforce.com\Data Loader\demo\conf" upsertAccounts
复制代码
Q2、导入时中文字符乱码如何解决?
A2、设置dataAccess.readUTF8
Q3、执行process时,报错:Caused by: com.salesforce.dataloader.exception.ConfigInitializationException: Error initializing encryption for key file C:Userssales.dataloaderdataLoader.key: Failed to open file: C:Userssales.dataloaderdataLoader.key
A3、有两种方法解决:
方法1:将process.encryptionKeyFile=C:\Users{user}.dataloader\dataLoader.key信息从config.properties配置进process-conf.xml
方法2:在config.properties中配置如下:
# process.encryptionKeyFile=C:\Users\sales\AppData\Local\salesforce.com\Data Loader\project\savills\dataLoader.key
# the path need to be converted
process.encryptionKeyFile=C:\Users\sales\AppData\Local\salesforce.com\Data Loader\project\savills\dataLoader.key
复制代码
Q4、执行process时,报错:Caused by: java.lang.IllegalArgumentException: No enum constant com.salesforce.dataloader.action.OperationInfo.hard delete
A4、配置operation如下:
<!-- <entry key="process.operation" value="hard delete"/> -->
<entry key="process.operation" value="hard_delete"/>
复制代码
注意:记得分配'Bulk API Hard Delete' permission set给系统管理员!
Q5、导出SF数据写SOQL需要注意哪些?
A5、对于字符串无需使用转义字符,如下:
<entry key="sfdc.extractionSOQL" value="SELECT Id, External_ID__c FROM Tower__c WHERE Archived__c = '1' OR Select_Property__r.Archived__c = '1'"/>
复制代码
启发
可以将该技术应用到Raptor项目,来满足日常生产trail环境时sample数据迁移,该技术可将繁琐的数据导入工作(原1人天)缩短到5min。
- 如何定时自动备份SF数据到本地?
- 关于增量备份话题
参考文献
Data Loader Command Line Introduction
Data Loader Command-Line Interface
Run Individual Batch Processes
Encrypt from the Command Line
日常数据备份:Data loader 对某个对象定时备份