文章目錄
- 場景
- 環境
- 正文
-
- 一、前提
- 二、上傳SQL檔案到伺服器
- 三、使用SQLplus指令登入
- 四、導入SQL檔案
- 五、結果
- 踩坑記錄
-
- 登入異常
- SQL執行完畢,檢視不了資料
- SQL執行完畢,檢視資料,顯示亂碼
-
- 一、檢視服務端編碼
- 二、檢視環境變量 NLS_LANG 的設定
- 三、檢視檔案編碼是否和服務端一緻
- 總結
- 備注
-
- 檢視資料庫目前字元集參數設定
- 檢視資料庫可用字元集參數設定
- NLS_LANG參數組成
- 随緣求贊
場景
因項目需要,需要将生産環境的資料導出一份到測試環境。其中,有幾個表的資料量比較大,其中一個表的資料量大概在80萬左右。如果直接使用
Navicat
工具進行導入,測試導入3萬條,花了大概半小時。時間太慢,需要使用更好的方式進行導入。
環境
軟體 | 版本 |
---|---|
Oracle | 12.1.0.2.0 |
Centos | 7 |
正文
接下來,就是整個處理過程。
一、前提
可以登入資料庫伺服器,有管理者權限或者資料庫賬戶
二、上傳SQL檔案到伺服器
需要将
SQL
檔案上傳到
Oracle
伺服器,這樣使用
SQLplus
用戶端的時候,就可以直接指定本地檔案了。
三、使用SQLplus指令登入
登入方式有多種,這裡推薦直接使用
sqlplus
指令登入,然後輸入賬号密碼。如果是直接在指令輸入賬号密碼的話,使用
history
指令就可以拿到具體的賬戶密碼。這樣就存在密碼洩露的危險。
如圖,就是我進行登入的結果截圖:
四、導入SQL檔案
正常登陸進去的時候,然後就直接執行腳本,指令形式如下:
# 如果沒有設定,執行一條就會輸出結果,看起來很累贅
set feedback off
set define off
# 指定路徑
@/home/test/test.sql
# 執行完畢之後,記得送出。不然是不生效的
commit;
五、結果
執行完畢之後,一個722071條資料的
SQL
檔案,執行了大概10分鐘就跑完了。 這個效率比之前導入3萬條就花了30分鐘的速度快多了。
踩坑記錄
看到這裡,如果中途沒有踩坑,那麼就perfect了。
但是,如果中途踩坑了,可以接着往下看,我記錄了在這個過程中踩到的坑,希望可以減少各位看官寶貴的時間。
登入異常
如果登入進去,文法沒有錯,但是就是登入不了,問題提示截圖如下:
看到這個
ORA-12547
的标志
這裡可以做一步測試,測試管理者賬戶是否可以登入。像我這裡,是可以登入的。
如果有哪位的情況和我一樣,那就是權限問題了。
我們可以到Oracle安裝目錄的
bin
目錄,檢視權限,如圖:
這裡的權限需要進行更新,可以執行以下指令:
chmod 6751 oracle
結果如下:
更新完畢之後,退出SQLplus,重新登入進去。一般情況,是沒有問題了。如圖:
SQL執行完畢,檢視不了資料
如果是這個問題,請確定進行了
commit
。
因為用戶端不像
datastudio
或者
Navicat
自動幫你
commit
的,需要顯示執行
commit
語句。
SQL執行完畢,檢視資料,顯示亂碼
解決的關鍵是要把服務端的字元集跟用戶端的字元集統一起來。Oracle用戶端通過
NLS_LANG
環境變量來确定用戶端使用的字元集。是以,一般排查以下三個方面:
一、檢視服務端編碼
在
sqlplus
輸入以下指令:
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
結果如下:
二、檢視環境變量 NLS_LANG 的設定
執行指令
env | grep NLS
,結果如下:
啊哈,這裡竟然沒有這個環境變量。
是以,這裡有問題。友善快捷的方式便是直接設定環境變量,如下:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
想一勞永逸的話,就得設定環境變量檔案
如下:
vi .bash_profile
# 檔案追加以下内容:
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_LANG
# 儲存之後,使 bash_profile 設定生效
source .bash_profile
三、檢視檔案編碼是否和服務端一緻
部落客這邊的
SQL
檔案編碼為
GB2312
,而服務端的編碼是
UTF-8
,是以需要将檔案編碼轉換為
UTF-8
。
一般經過上面三步,就可以解決導入檔案亂碼的問題。
總結
日常工作中,經常會遇到各種各樣的問題。學會解決問題并記錄解決步驟,對自己的能力是很有幫助的!
備注
記錄一些執行
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:
- 控制用戶端應用程式使用的字元集
随緣求贊
如果我的文章對大家産生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的讨論,可以留言;
如果想繼續檢視我以後的文章,可以點選關注
可以掃描以下二維碼,關注我的公衆号:楓夜之求索閣,檢視我最新的分享!