I hate the Oracle
Oracle 算是老牌的資料庫, 但實在是滿令人挫折的,
如果是習慣在 terminal 下操作的使用者, 光 accepted 那個 licence,
就讓我覺得自己是一個愚蠢的使用者, 官方的文件又難以快速查詢到想要的,
Oracle 版本又很多, 對應不同的 OS 環境又有各種奇奇怪怪的設定方式,
光是確認 ORACLE_SID 就浪費了不少時間,
config 文件也是用特規的方式去撰寫, 不是 .ymal
也不是 .conf
而是 .ora
,to_date()
也不走 ISO 規範, 硬要跟別人不一樣…
基於各種麻煩的問題, 我真的不喜歡 Oracle
Env
- CentOS 7 (CentOS Linux release 7.6.1810 (Core))
- Oracle 19c (Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production)
Difficult setting
安裝教學, 這篇算是我找到比較適合我的教學, 我的安裝記錄如下
# 建立資料夾 |
Uncomfortable licence
如果想下載官方的 rpm 就要想辦法通過 licence…
acceped and click download
get accepted licence url link
wget
wget https://download.oracle.com/otn/linux/oracle19c/190000/oracle-databas-ee-19c-1.0-1.x86_64.rpm?AuthParam=some-param
Change the oracle user in CentOS
如果跟我一樣是手動安裝, 那可能會需要設定一下 oracle 的 passwd
# 設定 oracle 這個 user 的密碼
sudo passwd oracle
# 切換 oracle 才能調整 oracle 相關 config
su oracle
# 登入 sqlplus
sqlplus / as sysdba
# 設定 oracle 這個 user 的密碼 |
Sqlplus command not found
如果發生了 sqlplus command not found 是因為缺少環境變數, 確認 env
# 確認你的環境變數是否有 ORACLE_BASE, ORACLE_HOME, ORACLE_SID |
如果沒有 ORACLE_BASE
, ORACLE_HOME
, ORACLE_SID
就手動設定一下吧,
但我沒辦法保證每個人的環境都跟我的一樣, 在設定時請手動確認一下路徑是不是跟我一樣
# 如果沒有就手動設定吧
echo "export ORACLE_BASE=/opt/oracle" >> ~/.bash_profile
echo "export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1" >> ~/.bash_profile
# 這個設定花很多力氣才找到
echo "export ORACLE_SID=ORCLCDB" >> ~/.bash_profile
source ~/.bash_profile
# 如果沒有就手動設定吧 |
ORA-01034: ORACLE NOT AVAILABLE
這個問題是因為 Oracle 環境變數沒有設定好, 因為我找不到 ORACLE_SID
# 我也知道可以用 echo, 但就是沒有啊 |
然後 教學 說可以進去資料庫 select, 事實上是 ORACLE_SID 沒設定好, 你也無法用 sqlplus 去做登入, 後來找到可以在 tnsnames.ora
找到 ORACLE_SID
# my path is /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora |
The .ora config file
為了找 ORACLE_SID 翻遍所有文件, 才在某個文件的小小角落翻到
Change the value of ORACLE_SID to your new value in your .profile, .cshrc, .login, oratab, and tnsnames.ora files.
說明 ORACLE_SID 寫在 .profile, .cshrc, .login, oratab, tnsnames.ora, 只想罵髒話
# ORCLCDB 就是預設的 SID |
Unknow Charset
亂碼問題, 必須先找到 CHARSET
SQL> select userenv('language') from dual; |
再把這個愚蠢的 CHARSET 設定到 ENV
echo "export NLS_LANG='TRADITIONAL CHINESE_TAIWAN.AL32UTF8'" >> ~/.bash_profile |
ORA-12541: TNS:no listener
先檢查 CentOS 的防火牆, 記得把 1521 打開
# add port 1521 to firewall |
調整 listener.ora 監聽全部打開, 修改 HOST 為 0.0.0.0
, 讓遠端的 Client 也可以連線
# 修改 HOST 為 0.0.0.0 |
透過 lsnrctl 重新啟動 listener
# lsnrctl 工具 |
Insert Records : ORA-01843
ORA-01843
的錯誤代碼說明是 不是有效的月份, 原因是 to_date()
造成的
SQL> Insert into EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE,HIRE_DATE,MANAGER_ID,JOB_TITLE) values (107,'Summer','Payne','summer.payne@example.com','515.123.8181',to_date('07-JUN-16','DD-MON-RR'),106,'Public Accountant'); |
資料庫就你最特別, 完全不照 ISO 的 Datetime 格式, 硬要自己訂一套, 還要吃 ENV 的 NLS_DATE_LANGUAGE
SQL> Insert into EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE,HIRE_DATE,MANAGER_ID,JOB_TITLE) values (107,'Summer','Payne','summer.payne@example.com','515.123.8181',to_date('07-JUN-16','DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN'),106,'Public Accountant'); |
Creaet user : ORA-00900
ORA-00900
的錯誤代碼說明是 SQL 敘述句無效, 但實際上這樣的錯誤代碼說明有說跟沒說一樣…
原因是某些操作的權限不足, 像 SHOW USER
, 就只能在 Server 上操作
SQL> SHOW USER; |