使用sqlldr向oracle数据库导入数据的问题与总结

背景

  最近做的一个项目需要统一多个系统之间的数据,为此需要写个脚本实现将数据导入到数据库的需求,并启动linux的定时任务确保每天都可以导入新数据。
  完整需求是数仓会在每日的固定时间生成多张表的数据,上游负责将数据推送到指定的应用服务器路径下,本次应用服务器地址为xxx.xxx.xxx.123,而数据库在xxx.xxx.xxx.125。

实现步骤

  1. 安装客户端

      在oracle官网上下载对应版本的客户端安装包,在此需要注意的是客户端安装包有很多种,而我们只需要下载名称里有basicinstant的和sqlplus的两个包即可,前一个提供了基本的客户端功能,sqlplus则是方便测试是否安装成功。在使用sqlldr之前必须先将客户端安装成功。
      安装完成后需要编写tnsnames.ora文件,具体方式为在安装目录下创建network/admin目录,然后在该目录下编写tnsnames.ora文件,这个文件的模板网上有很多,照着写便可以,该文件主要是配置oracle服务器的地址、端口号和数据库名称。
      接下来便是最重要的一步了,大多数的错误都是因为这一步没做好,当文件编写完成后需要修改该用户的配置文件~/.bash_profile,该文件用来配置环境变量,本次使用sqlldr需要配置的环境变量主要有客户端安装路径ORACLE_HOME、tns文件路径TNS_ADMIN、客户端使用的编码NLS_LANG、链接库LD_LIRBARY_PATH,具体配置网上都可以搜到。
      环境变量配置好之后便可以运行sqlldr 用户名/密码@数据库名,如果输入前变成 >SQL标志则客户端配置成功。

  2. 安装sqlldr

      在linux版的客户端中并没有sqlldr应用程序,因此需要到oracle的服务器端去拷贝sqlldr,它位于oracle安装目录下的bin目录中,将其拷贝到客户端的根目录里,此时运行sqlldr会报错:message not found 2100,该错误是客户端还缺少文件,在客户端目录下简历rdbms/mesg目录并赋予可访问权限,然后在服务器的相同目录下拷贝ulus.msg和ulus.msb文件放进去,此时运行slqldr则会打印出帮助信息。

  3. 编写ctl文件

      在网上搜ctl文件会有一堆的模板,随便选一个照着表结构进行编写即可,ctl文件有两种加载数据格式,一种是数据位于ctl文件内,此时infile后加*,将数据放于ctl文件末尾即可,另一种是位于ctl文件外,此时用infile指定路径。在选择 插入数据的方式时有APPEND、INSERT、REPLACE等多种方式,根据自己的需求决定即可,如果数据和客户端的编码不相符则需要通过CHARACTERSET 编码 指定加载数据时的编码,在编写列名时默认为字符串类型,如果数据库为date型,则需要在字段后加Data “日期格式”,如果为数字型则需要加INTEGER EXTERNAL、浮点FLOAT EXTERNAL、小数DECIMAL。当数据中的字段多余时可使用filler过滤,此方式只能用于数据文件不是定长的情况,如果数据文件为定长的则需要使用position的方式。

  4. 编写定时脚本

      为了以防万一需要在脚本中将之前配置的环境变量都加入到脚本中,在脚本中加入sqlldr 用户名/密码@数据库名 control=ctl文件名全路径,然后将其加入到linux的定时任务中执行即可,每执行一次都会生成一个日志文件,其中包含有sqlldr运行的详细信息,如果末尾出现达到逻辑提交点。。。则表明执行成功。

你可能感兴趣的:(数据库)