天天看點

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

文章目錄

  • 場景
  • 環境
  • 正文
    • 一、前提
    • 二、上傳SQL檔案到伺服器
    • 三、使用SQLplus指令登入
    • 四、導入SQL檔案
    • 五、結果
  • 踩坑記錄
    • 登入異常
    • SQL執行完畢,檢視不了資料
    • SQL執行完畢,檢視資料,顯示亂碼
      • 一、檢視服務端編碼
      • 二、檢視環境變量 NLS_LANG 的設定
      • 三、檢視檔案編碼是否和服務端一緻
  • 總結
  • 備注
    • 檢視資料庫目前字元集參數設定
    • 檢視資料庫可用字元集參數設定
    • NLS_LANG參數組成
  • 随緣求贊

場景

因項目需要,需要将生産環境的資料導出一份到測試環境。其中,有幾個表的資料量比較大,其中一個表的資料量大概在80萬左右。如果直接使用

Navicat

工具進行導入,測試導入3萬條,花了大概半小時。時間太慢,需要使用更好的方式進行導入。

環境

軟體 版本
Oracle 12.1.0.2.0
Centos 7

正文

接下來,就是整個處理過程。

一、前提

可以登入資料庫伺服器,有管理者權限或者資料庫賬戶

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

二、上傳SQL檔案到伺服器

需要将

SQL

檔案上傳到

Oracle

伺服器,這樣使用

SQLplus

用戶端的時候,就可以直接指定本地檔案了。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

三、使用SQLplus指令登入

登入方式有多種,這裡推薦直接使用

sqlplus

指令登入,然後輸入賬号密碼。如果是直接在指令輸入賬号密碼的話,使用

history

指令就可以拿到具體的賬戶密碼。這樣就存在密碼洩露的危險。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

如圖,就是我進行登入的結果截圖:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

四、導入SQL檔案

正常登陸進去的時候,然後就直接執行腳本,指令形式如下:

# 如果沒有設定,執行一條就會輸出結果,看起來很累贅
set feedback off
set define off
# 指定路徑
@/home/test/test.sql
# 執行完畢之後,記得送出。不然是不生效的
commit;
           

五、結果

執行完畢之後,一個722071條資料的

SQL

檔案,執行了大概10分鐘就跑完了。 這個效率比之前導入3萬條就花了30分鐘的速度快多了。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

踩坑記錄

看到這裡,如果中途沒有踩坑,那麼就perfect了。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

但是,如果中途踩坑了,可以接着往下看,我記錄了在這個過程中踩到的坑,希望可以減少各位看官寶貴的時間。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

登入異常

如果登入進去,文法沒有錯,但是就是登入不了,問題提示截圖如下:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

看到這個

ORA-12547

的标志

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

這裡可以做一步測試,測試管理者賬戶是否可以登入。像我這裡,是可以登入的。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

如果有哪位的情況和我一樣,那就是權限問題了。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

我們可以到Oracle安裝目錄的

bin

目錄,檢視權限,如圖:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

這裡的權限需要進行更新,可以執行以下指令:

chmod 6751 oracle
           

結果如下:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

更新完畢之後,退出SQLplus,重新登入進去。一般情況,是沒有問題了。如圖:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

SQL執行完畢,檢視不了資料

如果是這個問題,請確定進行了

commit

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

因為用戶端不像

datastudio

或者

Navicat

自動幫你

commit

的,需要顯示執行

commit

語句。

SQL執行完畢,檢視資料,顯示亂碼

解決的關鍵是要把服務端的字元集跟用戶端的字元集統一起來。Oracle用戶端通過

NLS_LANG

環境變量來确定用戶端使用的字元集。是以,一般排查以下三個方面:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

一、檢視服務端編碼

sqlplus

輸入以下指令:

select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
           

結果如下:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

二、檢視環境變量 NLS_LANG 的設定

執行指令

env | grep NLS

,結果如下:

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

啊哈,這裡竟然沒有這個環境變量。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

是以,這裡有問題。友善快捷的方式便是直接設定環境變量,如下:

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
           

想一勞永逸的話,就得設定環境變量檔案

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

如下:

vi .bash_profile
# 檔案追加以下内容:
NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
export NLS_LANG

# 儲存之後,使 bash_profile 設定生效
source .bash_profile
           

三、檢視檔案編碼是否和服務端一緻

部落客這邊的

SQL

檔案編碼為

GB2312

,而服務端的編碼是

UTF-8

,是以需要将檔案編碼轉換為

UTF-8

一般經過上面三步,就可以解決導入檔案亂碼的問題。

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

總結

日常工作中,經常會遇到各種各樣的問題。學會解決問題并記錄解決步驟,對自己的能力是很有幫助的!

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊

備注

記錄一些執行

sql

,友善後期查詢:

檢視資料庫目前字元集參數設定

SELECT * FROM v$nls_parameters;
# 或
select * from nls_database_parameters
# 或
select userenv('language') from dual;
           

檢視資料庫可用字元集參數設定

SELECT * FROM v$nls_valid_values;
           

NLS_LANG參數組成

NLS_LANG=<Language>_<Territory>.<Clients Characterset>
           

NLS_LANG 各部分含義如下:

  • LANGUAGE指定:
    • Oracle消息使用的語言
    • 日期中月份和日顯示
  • TERRITORY指定
    • 貨币和數字格式
    • 地區和計算星期及日期的習慣
  • CHARACTERSET:
    • 控制用戶端應用程式使用的字元集

随緣求贊

如果我的文章對大家産生了幫忙,可以在文章底部點個贊或者收藏;

如果有好的讨論,可以留言;

如果想繼續檢視我以後的文章,可以點選關注

可以掃描以下二維碼,關注我的公衆号:楓夜之求索閣,檢視我最新的分享!

Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊
Oracle學習系列:将較大的SQL檔案導入資料庫的操作步驟(含踩坑記錄)場景環境正文踩坑記錄總結備注随緣求贊