首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 經典 10 問 (四):編輯器、隨機數、Linux 監控、用戶對象、錯誤、DB Link、字符集、表空間、INTERNAL、Java 進程

     編輯:Oracle 資料庫相關知識

前言:第 4 期 10 題——運維與開發的交叉地帶

涵蓋 SQL*Plus 客製化、隨機數生成、OS 級效能指令、字典視圖查詢、錯誤追蹤、DB Link、字符集診斷、表空間資訊、內部用戶認證、Java 進程干擾——這些是 DBA 日常「查、改、監、修」的核心技能點。

Q31: SQL*Plus 如何自定義編輯器?

-- 臨時生效 (當前 Session)
DEFINE _EDITOR = "C:\Program Files\Notepad++\notepad++.exe"  -- Windows
DEFINE _EDITOR = "vim"  -- Linux/Unix

-- 永久生效: 編輯 $ORACLE_HOME/sqlplus/admin/glogin.sql
-- 在檔案中加入:
DEFINE _EDITOR = "vim"
-- 之後輸入 EDIT 即啟動 vim 編輯緩衝區 SQL

注意:路徑含空格必須雙引號;Linux 建議 vim/nano,Windows 推薦 Notepad++/VS Code (需配置 code --wait)。

Q32: Oracle 產生隨機數函數?

-- 1. DBMS_RANDOM 套件 (標準、功能豐富)
-- 整數隨機數
SELECT DBMS_RANDOM.RANDOM FROM dual;  -- -2^31 ~ 2^31-1
-- 0~1 實數
SELECT DBMS_RANDOM.VALUE FROM dual;
-- 指定範圍實數
SELECT DBMS_RANDOM.VALUE(100, 200) FROM dual;
-- 指定範圍整數
SELECT TRUNC(DBMS_RANDOM.VALUE(1, 101)) FROM dual;  -- 1~100
-- 隨機字串 (字母數字, 長度 10)
SELECT DBMS_RANDOM.STRING('X', 10) FROM dual;  -- 'X'=大寫字母+數字, 'U'=大寫, 'L'=小寫, 'A'=大小寫混合, 'P'=可列印字元

-- 2. 12c+ 標準 SQL 函數 (無需 PL/SQL 上下文切換)
SELECT ORA_HASH('seed', 1000) FROM dual;  -- 雜湊值 0~1000
-- 真正隨機需結合 SYSTIMESTAMP
SELECT DBMS_RANDOM.VALUE * 1000 FROM dual;

效能:DBMS_RANDOM 為 PL/SQL 呼叫,大量行 (百萬級) 建議在 PL/SQL 迴圈批量生成或使用 DBMS_RANDOM.SEED 固定種子以便重現。

Q33: Linux 下查詢磁碟/CPU 競爭狀態命令?

資源命令關鍵指標解讀
磁碟 I/Oiostat -xmt 5 或 sar -d 5 10%util (忙碌%), await (平均等待 ms), svctm (服務時間), %iowait%util > 80% 或 await > 20ms → I/O 瓶頸
CPUsar -u 5 10 或 mpstat -P ALL 5 或 top -H%user, %system, %iowait, %idle, runq-sz (運行隊列)runq-sz > CPU 核心數 → CPU 飽和; %iowait 高 → I/O 等待非 CPU 問題
記憶體vmstat 5 10 或 free -hsi/so (swap in/out), wa (wait%), run queue (r)si/so 持續 > 0 → 物理記憶體不足
網路sar -n DEV 5 10rxKB/s, txKB/s, rxerr/s, txerr/s錯誤率高 → 網卡/線纜/交換機故障

修正:原文 sar -r 為記憶體統計,非 CPU。CPU 用 sar -u。

Q34: 查詢當前用戶/所有對象?

-- 當前用戶對象
SELECT object_name, object_type, status, created, last_ddl_time
FROM user_objects
ORDER BY object_type, object_name;

-- 所有用戶對象 (需 DBA 權限)
SELECT owner, object_name, object_type, status
FROM dba_objects
WHERE owner NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP','APPQOSSYS')
ORDER BY owner, object_type, object_name;

-- 區段資訊 (含大小、表空間)
SELECT owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 AS size_mb
FROM dba_segments
WHERE owner = 'APP_USER'
ORDER BY bytes DESC;

Q35: 如何獲取編譯錯誤資訊?

-- 當前用戶程式單元錯誤
SELECT name, type, sequence, line, text, attribute, message_number
FROM user_errors
ORDER BY name, type, sequence, line;

-- 所有用戶錯誤
SELECT owner, name, type, line, text
FROM dba_errors
WHERE owner = 'APP_USER';

-- 快速編譯失效物件
BEGIN
  FOR r IN (SELECT object_name, object_type FROM user_objects WHERE status = 'INVALID') LOOP
    EXECUTE IMMEDIATE 'ALTER ' || r.object_type || ' ' || r.object_name || ' COMPILE';
  END LOOP;
END;
/

Q36: 如何查看 DB Link 連線狀態?

-- 定義的 DB Links
SELECT owner, db_link, username, host, created
FROM dba_db_links;

-- 測試連通性
SELECT * FROM dual@remote_db_link;  -- 成功返回 1 行
-- 或
SELECT SYSDATE FROM dual@remote_db_link;

-- 使用中的 DB Link Session (V$DBLINK 需 11g+)
SELECT * FROM v$dblink;

Q37: 查看資料庫/Session 字符集狀態?

-- 資料庫字符集 (儲存編碼)
SELECT parameter, value FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

-- 實例參數 (Session 預設)
SELECT parameter, value FROM v$nls_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET','NLS_LANGUAGE','NLS_TERRITORY');

-- 當前 Session 字符集 (受 NLS_LANG 影響)
SELECT userenv('language') FROM dual;
-- 輸出: AMERICAN_AMERICA.ZHS16GBK

亂碼診斷三步曲:1) 資料庫字符集 2) 客戶端 NLS_LANG 3) 應用/驅動程式字符集 —— 三者必須一致或相容 (子集→超集)。

Q38: 查詢表空間資訊?

-- 資料檔詳細
SELECT file_name, tablespace_name, bytes/1024/1024 AS size_mb,
       autoextensible, maxbytes/1024/1024 AS max_mb, online_status
FROM dba_data_files
ORDER BY tablespace_name, file_id;

-- 表空間使用率彙總 (含臨時/Undo)
SELECT tablespace_name, 
       ROUND(SUM(bytes)/1024/1024,2) total_mb,
       ROUND(SUM(CASE WHEN autoextensible='YES' THEN maxbytes ELSE bytes END)/1024/1024,2) max_mb
FROM dba_data_files
GROUP BY tablespace_name;

Q39: ORACLE INTERNAL 用戶需要口令?

INTERNAL 為 8i 前等同 SYS AS SYSDBA 的特殊連接方式。9i+ 已移除 INTERNAL,統一用 SYS AS SYSDBA。

若遇 ORA-01031: insufficient privileges 以 SYS 登入,檢查 SQLNET.ORA:

# 移除或註釋 NTS 驗證,強制密碼檔認證
# SQLNET.AUTHENTICATION_SERVICES = (NTS)
SQLNET.AUTHENTICATION_SERVICES = (NONE)  -- 僅密碼檔

並確認 $ORACLE_HOME/dbs/orapwSID 密碼檔存在、REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE。

Q40: 出現 JAVA.EXE 進程如何處理?

Oracle 8i/9i 安裝 JVM 後,OracleHTTPServer (iAS/Apache) 可能啟動 java.exe 進程處理 JSP/Servlet。

現象:大量 java.exe 佔用記憶體/CPU,非資料庫核心進程。

解法:

  1. 若不使用 Oracle HTTP Server / JSP / Servlet:停用並設為手動啟動。
    • Windows 服務: OracleOraHome90HTTPServer (Home 名稱含版本) → 啟動類型 = 手動。
    • 或移除 iAS 元件重新安裝僅保留 Database Server。
  2. 若需使用:調整 JVM 堆大小 (-Xms -Xmx)、限制線程池、監控 GC 日誌。

關鍵:資料庫本身不依賴 java.exe (除非啟用 Java Stored Procedure / XML DB / Spatial),純 OLTP 可安全停用。

總結

第 4 期 10 題聚焦「工具配置、OS 監控、字典查詢、認證機制、元件隔離」。建議將每題轉化為可執行的「單頁操作卡」:命令、預期輸出、異常判斷、升級處理,印製或電子化隨身攜帶,現場故障「查卡、跑命令、定根因、出報告」一氣呵成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved