SQL Loader - Unix 脚本 - 在 Oracle DB 表中加载多个数据文件

在这里,我将展示 SQL 加载器 + Unix 脚本实用程序的强大功能,其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件。这在处理大量数据以及需要将数据从一个系统移动到另一个系统时非常有用。

它适合涉及大量历史数据的迁移项目。那么就不可能为每个文件运行 SQL 加载程序并等待其加载。因此,最好的选择是让包含 SQL 加载命令的 Unix 程序始终运行。一旦文件夹位置中有任何文件可用,它将从该文件夹位置拾取文件并立即开始处理。

设置

示例程序是我做的。在 Macbook 中。Oracle 的安装与 Windows 机器上的安装有所不同。

如何在 Mac 上安装 Oracle 的详细步骤.

让SQL 开发人员遵守 Java 8。

现在让我们来演示一下这个例子。

在 Oracle DB 表中加载多个数据文件

因为它是 Macbook,所以我必须在 Oracle 虚拟机内完成所有操作。

让我们看看下图 SQL Loader 是如何工作的。

SQL Loader工作示意图

使用案例 

需要使用 Shell 脚本 + SQL 加载器自动化将数百万学生的信息加载到学生表中。该脚本将始终在 Unix 服务器中运行并轮询。Dat 文件,一旦 DAT 文件就位,它将对其进行处理。
另外,如果存在任何不良数据,则需要单独识别它们。

此类示例在需要加载数百万历史记录的迁移项目中非常有用。 

  1.  从旧系统,将定期生成实时源(DAT 文件)并将其发送到新系统服务器。

  2. 在新系统中,服务器文件可用,并将使用自动化 Unix 脚本加载到数据库中。 

  3. 现在让我们运行脚本,该脚本可以在Unix服务器上一直运行。为了实现这一点,整个代码被放入下面的 while 块中。

while true
   [some logic]
done

过程

A.我已复制以下文件夹中的所有文件+文件夹结构。

/home/oracle/Desktop/example-SQLdr

B. 请参阅以下文件(ls -lrth)

rwxr-xr-x. 1 oracle oinstall  147 Jul 23  2022 student.ctl

-rwxr-xr-x. 1 oracle oinstall   53 Jul 23  2022 student_2.dat

-rwxr-xr-x. 1 oracle oinstall  278 Dec  9 12:42 student_1.dat

drwxr-xr-x. 2 oracle oinstall   48 Dec 24 09:46 BAD

-rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.sh

drwxr-xr-x. 2 oracle oinstall   27 Dec 24 11:33 DISCARD

-rw-------. 1 oracle oinstall 3.5K Dec 24 11:33 nohup.out

drwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 11:33 TASKLOG

-rwxr-xr-x. 1 oracle oinstall    0 Dec 24 12:25 all_data_file_list.unx

drwxr-xr-x. 2 oracle oinstall    6 Dec 24 12:29 ARCHIVE

C.如下图,student表中没有数据。

数据表student表

D. 现在使用以下命令运行脚本 nohup.out ./TestSqlLoader.sh 通过这样做,它将始终在 Unix 服务器中运行。

  1. 现在脚本将运行,它将通过 SQL 加载器加载两个 .dat 文件。

  2. 该表应加载两个文件的内容。

查询数据student表

E.现在我再次删除表数据,只是为了证明脚本始终在服务器中运行,我将仅将两个 DAT 文件从 ARCHIVE 放置到当前目录。

删除数据student表

F.再次将这两个数据文件放入当前目录中。

-rwxr-xr-x. 1 oracle oinstall  147 Jul 23  2022 student.ctl

-rwxr-xr-x. 1 oracle oinstall   53 Jul 23  2022 student_2.dat

-rwxr-xr-x. 1 oracle oinstall  278 Dec  9 12:42 student_1.dat

drwxr-xr-x. 2 oracle oinstall   48 Dec 24 09:46 BAD

-rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.sh

drwxr-xr-x. 2 oracle oinstall   27 Dec 24 12:53 DISCARD

-rw-------. 1 oracle oinstall 4.3K Dec 24 12:53 nohup.out

drwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 12:53 TASKLOG

-rwxr-xr-x. 1 oracle oinstall    0 Dec 24 13:02 all_data_file_list.unx

drwxr-xr-x. 2 oracle oinstall    6 Dec 24 13:03 ARCHIVE

G.再次看到 Student 表已加载所有数据。

Student 表已加载所有数据

H.该脚本始终在服务器上运行

[oracle@localhost example-sqldr]$ ps -ef|grep Test
oracle   30203     1  0 12:53?        00:00:00 /bin/bash ./TestSqlLoader.sh
oracle   31284 31227  0 13:06 pts/1    00:00:00 grep --color=auto Test

完整源代码供参考

#!/bin/bash

bad_ext='.bad'
dis_ext='.dis'
data_ext='.dat'
log_ext='.log'
log_folder='TASKLOG'
arch_loc="ARCHIVE"
bad_loc="BAD"
discard_loc="DISCARD"
now=$(date +"%Y.%m.%d-%H.%M.%S")
log_file_name="$log_folder/TestSQLLoader_$now$log_ext"

while true;
do
 ls -a *.dat 2>/dev/null > all_data_file_list.unx
	for i in `cat all_data_file_list.unx`
		do
		#echo "The data file name is :-- $i"
		data_file_name=`basename $i .dat`	
		echo "Before executing the sql loader command ||Starting of the script" > $log_file_name 
		
	sqlldr userid=hr/oracle@orcl control=student.ctl errors=15000 log=$i$log_ext bindsize=512000000 readsize=500000 DATA=$data_file_name$data_ext BAD=$data_file_name$bad_ext DISCARD=$data_file_name$dis_ext

	mv $data_file_name$data_ext $arch_loc 2>/dev/null
	mv $data_file_name$bad_ext $bad_loc 2>/dev/null
	mv $data_file_name$dis_ext $discard_loc 2>/dev/null
	mv $data_file_name$data_ext$log_ext $log_folder 2>/dev/null

	echo "After Executing the sql loader command||File moved successfully" >>  $log_file_name
		
		done

## halt the procesing for 2 mins

sleep 1m

done

CTL 文件如下:

OPTIONS (SKIP=1)
LOAD DATA
APPEND
INTO TABLE student
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
id,
name,
dept_id
)

SQL 加载器规范

  1. 控制 --> .ctl 文件的名称。

  2. errors=15000(SQL Loader 允许的最大错误数)

  3. log=$i$log_ext(日志文件的名称)

  4. bindsize=512000000(绑定数组的最大大小)

  5. readsize=500000(最大大小)

  6. DATA=$data_file_name$data_ext(数据文件的名称和位置)

  7. BAD=$data_file_name$bad_ext(坏文件的名称和位置)

  8. DISCARD=$data_file_name$dis_ext(数据文件的名称和位置)丢弃文件)

综上所述,这种方式可以通过SQL加载器+Unix脚本自动化的方式加载数百万条记录,以上参数可以根据需要设置。如果您喜欢这篇文章,请告诉我。文章来源地址https://www.toymoban.com/diary/sql/641.html

到此这篇关于SQL Loader - Unix 脚本 - 在 Oracle DB 表中加载多个数据文件的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/sql/641.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
Flutter vs Native:哪个对于您的移动应用程序最好?
上一篇 2023年12月29日 16:57
下一篇 2023年12月30日 14:27

相关文章

  • DB(一):数据库概述、SQL概述、Oracle数据类型

    包括Oracle、DB2、SQL Server、MySQL数据库概述;数据定义语言DDL、数据操作语言DML、事务控制语言TCL、数据查询语言DQL、数据控制语言DCL语言介绍;NUMBER 、CHAR、VARCHAR2、DATE数据库类型;CHAR和VARCHAR2的存储编码、CHAR和VARCHAR2的最大长度、LONG和CLOB类型。 1、DB和DBMS (1)、数据库(

    2024年02月09日
    浏览(82)
  • Oracle脚本分享:db_auto_add_logfile

    在Oracle数据库中,有时候需要根据实际情况调整redo log的大小,增加redo log的日志组的数量,或者增加日志组成员,以及redo log的size大小不合适时,需要调整redo log的大小(删除redo log,重新添加redo log),一般情况下,都是手工写脚本,如果多台数据库实例,就必须写很多脚本,

    2024年02月05日
    浏览(75)
  • 【已解决】MySQL(Navicat)中如何一次性执行多个sql脚本文件

    目录 问题现象: 问题分析: 思路: 解决方法:         1、运行cmd命令窗口         2、执行文本文件内容合并命令 总结:         1、使用文本文件内容合并命令,将多个sql脚本文件的内容合并到一个新的sql文件中去。         2、然后在Navicat中打开对应数据库,运行

    2024年03月20日
    浏览(159)
  • 技术选型指南:Oracle、SQL Server还是DB2?

    Oracle vs SQL Server vs DB2 - 选哪个好? 在企业级数据管理领域,常用的几个选择有Oracle、SQL Server和DB2。 首先,我们从以下几个方面做一下对比: 1. 性能和稳定性: Oracle: Oracle就像是那种精密的瑞士手表,对于大型企业级应用来讲,它处理复杂的、规模庞大的事务就像切黄油一样

    2024年02月20日
    浏览(60)
  • Oracle常用运维SQL--用户管理、数据导入、导出的实用脚本

    Oracle常用运维SQL–用户管理、数据导入、导出的项目实用脚本

    2024年02月16日
    浏览(62)
  • oracle如何定期备份数据库sql文件

    Oracle数据库可以使用以下方法定期备份数据库的SQL文件: 使用Oracle的备份和恢复工具RMAN(Recovery Manager)进行备份。RMAN提供了全面而高效的数据库备份和恢复功能。您可以使用RMAN备份数据库的SQL文件,并将其存储在指定的位置。可以使用RMAN备份的命令来备份数据库,例如:

    2024年01月25日
    浏览(81)
  • postgresql|数据库|批量执行SQL脚本文件的shell脚本

    对于数据库的维护而言,肯定是有SQL脚本的执行,例如,某个项目需要更新,那么,可能会有很多的SQL脚本需要执行,SQL脚本可能会包含有建表,插入数据,索引建立,约束建立,主外键建立等等内容。 那么,几个SQL脚本可能无所谓,navicat或者psql命令行 简简单单的就导入了

    2024年02月01日
    浏览(73)
  • Oracle 数据库全表扫描的4种优化方法(DB)

    全表扫描的工作是扫描高水位一下所有的数据块。 这里就有一个问题,什么是高水位线。高水位的标志存在表头。 该数据块以后都是崭新未格式化的数据块,高水位的目的有二。它是全表扫描的 终点,并行插入的起点! 优化全表扫描的办法有四,核心就是降低高水位! 一

    2024年04月18日
    浏览(55)
  • Db2的时间转换(字符串,时间戳,Unix时间戳)

    Ubuntu 22.04 Db2 11.5.0 参见 https://www.ibm.com/docs/en/db2/11.5?topic=list-datetime-values Db2有3种时间类型: DATE :例如 03/20/2023 ,当前日期的special register为 CURRENT DATE TIME :例如 21:23:23 ,当前时间的special register为 CURRENT TIME TIMESTAMP :例如 2023-03-20-21.23.49.513704 ,当前时间戳的special register为

    2024年02月08日
    浏览(59)
  • ORACLE中impdp导入多个文件的方法

    1、多个文件导入dumpfile=expdp_full_qytcdb_20240412_%U.dmp,%U代表01、02、03这些 impdp sys/123456@192.168.1.200:1521/Oracle directory=jy dumpfile=expdp_full_20250412_%U.dmp logfile=impdp_$(date +%Y%m%d).log table_exists_action=skip  full=y parallel=8; 2、手动书写 impdp sys/123456@192.168.1.200:1521/Oracle directory=jy dumpfile=expdp_full_2

    2024年04月18日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包