Oracle使用超大SQL脚本文件恢复数据问题记录

在以前获取的Oracle数据库备份一般都是dmp文件,创建表空间和用户就直接使用imp或者impdp导入即可。

这一次遇到的情况比较特殊,对方提供数据时给我的是使用SQLPlus导出的SQL脚本文件,是Linux系统中导出的,因为很难让对方再次提供数据,因此只有用这个来导入数据。导入速度慢不说,还挺麻烦,不过没办法,问题总得解决。

在这个过程中遇到两大问题:

1. SQL脚本文件太大(超过1G),Windows上看不了内容,不知道怎么导入到数据库中。

一般SQLPlus执行SQL脚本文件倒是容易,登录到SQLPlus,然后在界面中输入"@SQL文件名",回车就可以执行。

但是这一次是进行数据恢复,对方导出的SQLPlus中应该是有表空间和用户信息的,如果预先创建对应的表空间和用户等信息,在SQLPLus中执行SQL脚本恢复数据就会遇到错误。

2. SQL脚本的文件编码问题导致使用sqlplus执行时报错。

错误提示为“ORA-01756:引号内的字符串没有正确结束”,在网上查了,是sql脚本的字符编码和Oracle的字符编码不一样导致的。

我的Oracle是安装在windows系统,用的是GBK编码,但SQL脚本文件的字符集是UTF-8,需要将SQL脚本文件转换成GBK字符编码才行。

小的SQL脚本使用Notepad++或notepad2文本编辑器打开,改下编码保存即可。大的SQL脚本可以用UltraEdit应该可以转换字符编码。不过UltraEdit收费,我没买。所以在网上找了方案,可以用powershell来转换字符编码。1.6G的SQL脚本文件,花了一个来小时才转换完成。

下面是解决此问题的步骤:

1. 首先查看下SQL脚本的内容,获取下关键的表空间和用户等信息:

在Windows中可以使用在命令行提示符中输入“type SQL文件名”来查看脚本内容,输出create table和create index脚本段后就可以使用Ctrl+C组合键退出读取进程。

在输出内容中找到表空间信息,以及授权语句中的用户名等。

2. 根据步骤1中获取到的表空间和用户信息,创建对应的表空间和用户。

3. 使用PowerShell将SQL脚本文件转换为当前系统默认的字符编码:

Windows 7 系统中可以在开始菜单中的“搜索程序和文件”输入框中输入powershell,找到PowerShell的命令行界面。

使用cd命令切换到脚本文件所在目录:“cd 路径”

然后执行下面的来转换字符编码:

Get-Content -path .\aa.sql|Out-File .\aa-output.sql -Encoding "default"

转换过程可以按F5刷新看下输出文件的大小变化(powershell中没提示转换进度),过一段时间不再变化就应该是完成了,在powershell的窗口中按回车键,如果powershell界面光标闪烁,可以输入新的命令了,就能确认转换过程完成了。

4. 使用sqlplus登录Oracle,然后在输入”@SQL脚本文件名“命令执行,等待执行完成即可。

注:sqlplus中使用SQL脚本导入上百万数据真慢,没注意看了,转个字符编码花了一个小时,导入数据花了一两个小时。

时间: 2024-12-17 01:44:55

Oracle使用超大SQL脚本文件恢复数据问题记录的相关文章

oracle下如何执行一个本地的.sql脚本文件

分析: 我们通常在开发过程中会遇到很多程序修改或者批量修改数据的时候,会选择脚本的文件的形式通过命令来执行,那么怎么用plsql或者sqlplus执行sql脚本文件呢? 说明: 如果说现在在c盘盘符下放置了一个我们需要执行的create.sql脚本文件,如果说用sqlplus去执行这个脚本文件: 1.进入到运行命令窗口. 2.登录sqlplus connect username/[email protected]; 3.提示数据库连接成功后,执行脚本文件 @'c:\create.sql';或者

InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报错. 一般来说,数据库脚本只保证通过官方客户端测试即可,同时维护一份供IS执行的脚本费时费力.因此,考虑安装程序对两数据库的支持通过官方客户端实现. MySQL   function InstallMySQLComponent(szComponent) NUMBER nResult; STRING

java程序执行SQL脚本文件

首先引入ibatis-common-2.jar包 import com.ibatis.common.jdbc.ScriptRunner; import com.ibatis.common.resources.Resources; jpetstore测试代码如下: package com.ibatis.jpetstore.test; import java.sql.DriverManager; import java.util.Properties; import com.ibatis.commo

Java执行SQL脚本文件到数据库

方式一:直接读取SQL脚本文件的内容,然后传递到SQL中. 代码:RunSqlService: @Autowired private RunSqlDao runSqlDao; /** * 读取文件内容到SQL中执行 * @param sqlPath SQL文件的路径:如:D:/TestProject/web/sql/脚本.Sql */ public void runSqlByReadFileContent(String sqlPath) throws Exception { try { Stri

Java执行上传的sql脚本文件

开始通过java执行cmd的方式调用sqlplus执行sql文件,但是后来发现一旦进入sqlplus,脚本执行完后就会一直等待而不关闭.后为了方便改成调用ant的SQLExec类提供的实现进行sql脚本的执行.原始代码如下,我是通过前端上传sql脚本文件后台服务端进行执行:     SQLExec sqlExec = new SQLExec();     //设置数据库参数     sqlExec.setDriver("oracle.jdbc.driver.OracleDriver")

创建包含sql命令的sql脚本文件

sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下: 1.创建包含sql命令的sql脚本文件 文件中包含一些列的sql语句,每条语句最后以;结尾,文件内容示例如下: --创建表,使用“--”进行注释 create table 表名称 (                      Guid Varchar(38) not null primary key,     Tit

MySQL执行外部sql脚本文件命令报错:unknown command '\'

由于编码不一致导致的 虽然大部分导出是没有问题的 但是数据表中存储包含一些脚本(富文本内容)会出现该问题,强制指定编码即可解决. mysql导入时指定编码: mysql -u root -p --default-character-set=utf8 或者在导出时后显式指定编码就不存在这个问题了: mysqldump -uroot -p --default-character-set=utf8 mydb > E://xxxx.sql MySQL执行外部sql脚本文件命令报错:unknown com

解决sql脚本文件太大无法打开的问题

as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务->生成脚本-> 下一步->高级,选择数据库版本和编写脚本数据类型为架构和数据,可以保留数据. 继续下一步完成. 最终得到一个巨大的sql脚本文件 ->接下来首先要在低版本数据库中新建一个目标数据库,然后运行sql脚本文件即可 一般的sql文件我们都是直接在SqlServer的查询窗口直接执行的,但是这个巨大的sql文件实在是太大了,SqlServer甚至是记事本都无

Delphi 7 在程序中直接执行SQL脚本文件

Delphi 7 在程序中直接执行SQL脚本文件 在处理MSDE一些操作中.需要执行一些SQL脚本.有的是从SQLServer 2000中生成的SQL为后缀的脚本.在MSDE中没有企业管理器,操作都是在程序中完成的.所以用以下函数来执行SQL脚本. //执行一个SQL角本文件,文件只能是ANSI编码的.//如果文件是UNICODE编码的话,则会乱码.var  s:string;  sqltext : string;  sqlfile : TextFile;begin  if OpenDialog