Oracle使用超大SQL腳本文件恢復數(shù)據(jù)問題記錄
在以前獲取的Oracle數(shù)據(jù)庫備份一般都是dmp文件,創(chuàng)建表空間和用戶就直接使用imp或者impdp導入即可。
這一次遇到的情況比較特殊,對方提供數(shù)據(jù)時給我的是使用SQLPlus導出的SQL腳本文件,是Linux系統(tǒng)中導出的,因為很難讓對方再次提供數(shù)據(jù),因此只有用這個來導入數(shù)據(jù)。導入速度慢不說,還挺麻煩,不過沒辦法,問題總得解決。
在這個過程中遇到兩大問題:
1. SQL腳本文件太大(超過1G),Windows上看不了內(nèi)容,不知道怎么導入到數(shù)據(jù)庫中。
一般SQLPlus執(zhí)行SQL腳本文件倒是容易,登錄到SQLPlus,然后在界面中輸入"@SQL文件名",回車就可以執(zhí)行。
但是這一次是進行數(shù)據(jù)恢復,對方導出的SQLPlus中應(yīng)該是有表空間和用戶信息的,如果預(yù)先創(chuàng)建對應(yīng)的表空間和用戶等信息,在SQLPLus中執(zhí)行SQL腳本恢復數(shù)據(jù)就會遇到錯誤。
2. SQL腳本的文件編碼問題導致使用sqlplus執(zhí)行時報錯。
錯誤提示為“ORA-01756:引號內(nèi)的字符串沒有正確結(jié)束”,在網(wǎng)上查了,是sql腳本的字符編碼和Oracle的字符編碼不一樣導致的。
我的Oracle是安裝在windows系統(tǒng),用的是GBK編碼,但SQL腳本文件的字符集是UTF-8,需要將SQL腳本文件轉(zhuǎn)換成GBK字符編碼才行。
小的SQL腳本使用Notepad++或notepad2文本編輯器打開,改下編碼保存即可。大的SQL腳本可以用UltraEdit應(yīng)該可以轉(zhuǎn)換字符編碼。不過UltraEdit收費,我沒買。所以在網(wǎng)上找了方案,可以用powershell來轉(zhuǎn)換字符編碼。1.6G的SQL腳本文件,花了一個來小時才轉(zhuǎn)換完成。
下面是解決此問題的步驟:
1. 首先查看下SQL腳本的內(nèi)容,獲取下關(guān)鍵的表空間和用戶等信息:
在Windows中可以使用在命令行提示符中輸入“type SQL文件名”來查看腳本內(nèi)容,輸出create table和create index腳本段后就可以使用Ctrl+C組合鍵退出讀取進程。
在輸出內(nèi)容中找到表空間信息,以及授權(quán)語句中的用戶名等。
2. 根據(jù)步驟1中獲取到的表空間和用戶信息,創(chuàng)建對應(yīng)的表空間和用戶。
3. 使用PowerShell將SQL腳本文件轉(zhuǎn)換為當前系統(tǒng)默認的字符編碼:
Windows 7 系統(tǒng)中可以在開始菜單中的“搜索程序和文件”輸入框中輸入powershell,找到PowerShell的命令行界面。
使用cd命令切換到腳本文件所在目錄:“cd 路徑”
然后執(zhí)行下面的來轉(zhuǎn)換字符編碼:
Get-Content -path .\aa.sql|Out-File .\aa-output.sql -Encoding "default"
轉(zhuǎn)換過程可以按F5刷新看下輸出文件的大小變化(powershell中沒提示轉(zhuǎn)換進度),過一段時間不再變化就應(yīng)該是完成了,在powershell的窗口中按回車鍵,如果powershell界面光標閃爍,可以輸入新的命令了,就能確認轉(zhuǎn)換過程完成了。
4. 使用sqlplus登錄Oracle,然后在輸入”@SQL腳本文件名“命令執(zhí)行,等待執(zhí)行完成即可。
注:sqlplus中使用SQL腳本導入上百萬數(shù)據(jù)真慢,沒注意看了,轉(zhuǎn)個字符編碼花了一個小時,導入數(shù)據(jù)花了一兩個小時。

浙公網(wǎng)安備 33010602011771號