一、oracle导入单个sqly文件
公司以前都是用dmp操作数据导入导出,最近从别的地方人家给是sql文件数据库文件,不得不学习一下如何导入大文件的sql,好应对各种突发情况。
1.1、首先得会使用sqlplus连接远程数据库
sqlplus 用户名/密码@远程数据库ip:端口/实例名
1.2、连接成功之后使用导入sql文件命令
sql>@E:\areadata.sql;
sql>@/opt/oracle/area.sql;
1.3、若中文会出现乱码问题,或者报错。例如:
ERROR:
ORA-01756: quoted string not properly terminated
此时,需要排查数据库服务器的字符集和client的字符集
1.4、解决中文乱码报错
1.4.1 排查数据库服务器字符集:
sql>select userenv('language') from dual;
---AMERICAN_AMERICA.ZHS16GBK【此处的字符集是这个】
1.4.2 排查client字符集
<1> 在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
<2> 在linux下,修改bash_profile文件
$ vi .bash_profile
NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'; export NLS_LANG
这个也可能跟sql文件有关,大家可以试试设置client字符集,多试两个应该就可以了。
另外有些文件里面可能会出现一些空格之类的字符,到了sqlplus里面就会变成 ,例如下面的等待输入,往往会影响导入的时间: sql>Enter value for nbsp;
所以需要在执行sql>@E:\areadata.sql时先设置一下关闭替代变量功能 sql>set define off; 这样子就不会出现导入时等待的情况了,大大提高了导入文件的效率。
二、Oracle下命令行批量执行sql文件
有些场景下需要执行一批sql文件,sql文件非常大的时候,PL/SQL Developer无法直接执行,需要在sqlplus命令行下执行,而手工一个一个执行会很麻烦。我们可以把这些sql文件构造成一个sql文件,然后通过sqlplus命令行执行。sqlplus命令可以通过“@sql文件全路径名”执行sql文件。
2.1、第一步:创建总的sql文件
2.1.1、使用相对路径名方法
进入SQL文件目录,若用两个@@写成相对路径名这是需要进入到存放批量sql的文件夹下面,,所谓相对路径指的是相对于总sql文件。 我所有的sql文件是放在/home/oracle/sch目录下的,在此目录下创建个总sql文件如下:
$ vi /home/oracle/sch/list.sql
spool exLog.log
prompt Start-------------------------------------------
@@BAS.sql;
@@BSC.sql;
@@DA.sql;
@@DE.sql;
prompt end----------------------------------------------
spool off
参数说明:
A、spool 用于执行写日志信息,与spool off组合使用,如果没有spool off则不会将日志写入文件中。
B、prompt是输出信息命令。
C、@@后面添加对应的sql文件名,以分号结束。
2.1.2 使用全路径名方法
在sql文件中以“@sql文件全路径名”的方式列出所有要执行的sql文件,创建一个总sql文件 例如:创建list.sql,里面列出要执行的SQL文件名
$ vi /home/oracle/list.txt
spool exLog1.log
prompt Start-------------------------------------------
@/home/oracle/sch/BAS.sql;
@/home/oracle/sch/BSC.sql;
@/home/oracle/sch/DA.sql;
@/home/oracle/sch/DE.sql;
prompt end----------------------------------------------
spool off
2.2、第二步:登录sqlplus命令行,执行sql文件
调用sqlplus,进行登录和执行list.sql文件
2.2.1 相对路径进入sql文件所在目录
$ cd /home/oracle/sch
$ sqlplus username/pwd@ip/fits @list.sql
2.2.2 全路径随便哪个目录下执行命令即可执行
$ sqlplus username/pwd@ip/fits @/home/oracle/list.txt
如果是oracle服务为本机的,则可以不用ip。这个和登录sqlplus是一样的。
2.3、打印日志参数说明:
<1> spool on (开启) <2> spool c:\xx.txt (将内容保存到c:\xx.txt) <3> 执行SQL脚本 <4> spool off (关闭)