❶ linux oracle 运行不了sqlldr 怎么办windos下连接该数据库能行,部署到linux下就不行
看看$oracle_home/bin 是否加到里你的环境变量path中,再确认sqlldr这个可执行文件是否存在
❷ LINUX中执行SQLLDR报错
1.?提高linux中默认同时打开的最大文件数量(默认是1024)
最便捷的方法是在/etc/profile文件中加内入ulimit?-n?最大开容启数量
但是这种方法无法从根本上查出什么原因导致java打开了这么多的文件
2.?java端调查开启文件多的原因
?Linux下查看进程打开了哪些文件
?lsof?-p??进程id????->??打开的具体文件
?lsof?-p??进程id|wc?-l???->??打开文件的数量
通过调查发现,java开了很多TYPE为FIFO(Linux中的管道)的文件,因此联想到有可能是java代码中的流没有正常关闭或者释放导致的。
而且Java在Linux下执行命令的时候需要用到Process类,这个类在使用后需要destroy()掉,否者也会导致文件数开启的过多
❸ linuxoraclesql结果导入csv
Oracle数据库导入csv文件,
当csv文件较小时,
可以使用数据库管理工具,
比如DBevaer导入到数据库,
当csv文件很大时,
可以使用Oracle提供的sqlldr命令行工具腔春,
能够快速导入大量数据。
在数据库之间进行数据迁移时,
特别是不同类型的数据库,
使用csv文件团圆州是一种很好的选择。
2.sqlldr用法
下面介绍sqlldr用法,
有一个USER_INFO.csv文件,
需要导入到数据库中USER_INFO表,
而且有1.5亿条数据,
要求导入耗时尽量小。
这里先介绍基本的导入方式,
然后介绍direct导入方式,
最后介绍parallel导入方式。
3.获取csv文件
USER_INFO.csv文件内容如下,
这里仅选取了三条测试数据:
MSISDN,PROVINCE_CODE,CREATE_TIME
8617512570551,30,2019-10-31 17:16:09
8613063310680,33,2019-10-31 17:16:12
8613295281345,80,2019-10-31 17:16:14
4.创建USER_INFO表
CREATE TABLE "USER_INFO" (
"MSISDN" VARCHAR2(16),
"PROVINCE_CODE" VARCHAR2(4),
"CREATE_TIME" DATE,
CONSTRAINT "PK_USER_INFO_MSISDN" PRIMARY KEY ("MSISDN")
) TABLESPACE "USERS";
COMMENT ON COLUMN "USER_INFO"."MSISDN" IS '用户手机号';
COMMENT ON COLUMN "USER_INFO"."PROVINCE_CODE" IS '省份编码';
COMMENT ON COLUMN "USER_INFO"."CREATE_TIME" IS '用户创建时间';
注意表中字段要和csv文件对应。
5.创塌蔽建ctl文件
创建名为loaddata_USER_INFO.ctl的控制文件:
options(skip=1,BINDSIZE=20971520, ROWS=10000, READSIZE=20971520, ERRORS=999999999)
load data
in
❹ linux如何安装sqlldr
如果机器上安装了oracle服务器,在用户的.bashrc文件中配置oracle的安装目录,在PATH路径里面加上$ORACLE_HOME/bin就可以了,source一下
❺ 如何提高linux下使用sqlldr导入大量csv文件效率
1. 创建CTL文件
load data
infile fwqs.txt
append into table tblname
fields terminated by ","
(id,fld1,fld2)
2. 创建BAT文件
sqlldr userid=username/password@connstr control='did.ctl'
运行BAT文件即可,CTL中使用TXT,CSV等文件都可以
❻ linux下我要使用oracle的sqlload向数据库中导入数据。
例如将scott用户下所有表,导入到test用户下
1 exp scott/tiger file=scott.dmp owner=scott
2 (1) 如果test用户下有scott的表,哪些需要先删除在导入大旦和
conn test/test
select 'drop table '||table_name||' purge;' from user_tables;
imp test/test file=scott.dmp fromuser=scott touser=test
(2) 如果test用户迟纤下没有scott用户的表,可以直接滚盯导入
imp test/test file=scott.dmp fromuser=scott touser=test
❼ LINUX的crontab执行SQL报错,解决给50分
环悔或拦境变量没团铅设置碧胡
crontab执行改一下,比如
* * * * * . ~/.bash_profile; your_scripts
❽ java怎么在linux环境下调用sqlldr的命令
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestLinux {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// ./szrpp_files/clPath
//写控制文件.ctl
String fileRoute = "/home/test/";//文件地址路径
String fileName = "test2015.txt";//数据文件名
String tableName = "test_table";//表名
String fieldName = "(name,userpwd,sex)";//要写入表的字段
String ctlfileName = "ctltest.ctl";//控制文件名
stlFileWriter(fileRoute,fileName,tableName,fieldName,ctlfileName);
//要执行的DOS命令
String user = "scott";
String psw = "123";
String Database = "//127.0.0.1:1521/ORCL";
String logfileName = "logtext.log";
Executive(user,psw,Database,fileRoute,ctlfileName,logfileName);
}
/**
* * 写控制文件.ctl
* @param fileRoute 数据文件地址路径
* @param fileName 数据文件名
* @param tableName 表名
* @param fieldName 要写入表的字段
* @param ctlfileName 控制文件名
*/
public static void stlFileWriter(String fileRoute,String fileName,String tableName,String fieldName,String ctlfileName)
{
FileWriter fw = null;
String strctl = "OPTIONS (skip=0)" +
" LOAD DATA INFILE '"+fileRoute+""+fileName+"'" +
" APPEND INTO TABLE "+tableName+"" +
" FIELDS TERMINATED BY ','" +
" OPTIONALLY ENCLOSED BY \"'\"" +
" TRAILING NULLCOLS "+fieldName+"";
try {
fw = new FileWriter(fileRoute+""+ctlfileName);
fw.write(strctl);
}
catch (IOException e)
{
e.printStackTrace();
}
finally {
try
{
fw.flush();
fw.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* 调用系统DOS命令
* @param user
* @param psw
* @param Database
* @param fileRoute 文件路径
* @param ctlfileName 控制文件名
* @param logfileName 日志文件名
*/
public static void Executive(String user,String psw,String Database,String fileRoute,String ctlfileName,String logfileName)
{
InputStream ins = null;
//要执行的DOS命令
String dos="sqlldr "+user+"/"+psw+"@"+Database+" control="+fileRoute+""+ctlfileName+" log="+fileRoute+""+logfileName;
//Linux环境下注释掉不需要CMD 直接执行DOS就可以
//String[] cmd = new String[]
//{ "cmd.exe", "/C", dos }; // Windows环境 命令
try
{
Process process = Runtime.getRuntime().exec(dos);
ins = process.getInputStream(); // 获取执行cmd命令后的信息
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String line = null;
while ((line = reader.readLine()) != null)
{
String msg = new String(line.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(msg); // 输出
}
int exitValue = process.waitFor();
if(exitValue==0)
{
System.out.println("返回值:" + exitValue+"\n数据导入成功");
}else
{
System.out.println("返回值:" + exitValue+"\n数据导入失败");
}
process.getOutputStream().close(); // 关闭
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
❾ 为什么linux运行sqlldr会报没有那个文件或目录
一般文件名都还是写成sqlldr。你只要用find / -name搜索下就知道了。 。
或者用rpm -qa |grep sqlldr查看安装信息
❿ 在linux下安装sqlldr命令
从Oracle服务器上拷贝相应的sqlldr 执行程序 。
1> scp /usr/local/oracle/sqlldr
2> mkdir -p /usr/local/稿知oracle/rdbms/mesg cd /usr/local/手敬燃oracle/rdbms/mesg/ scp ./ulus.msb
进入etc/profile修改环境变量
vim etc/profile 按i编辑 esc+q/q!强退 esc+wq保存编辑并退出
export ORACLE_HOME=/usr/local/oracle
export TNS_ADMIN=$ORACLE_HOME
export LD_LIBRARY_PATH =$ORACLE_HOME:/usr/local/oracle/lib:${ LD_LIBRARY_PATH }
export SQLPATH=$ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME
其中lib文件夹因为有sqlldr后来的报错:sqlldr: error while loading shared libraries: libclntsh.so.11.1: cannot open
所以整个毕虚lib都从oracle服务器上下下来了,这总不会错了吧
之后sqlldr发现权限问题
chmod a+x /usr/local/oracle/sqlldr
然后差不多了
source etc/profile
sqlldr命令有在正常提示信息了