本文彙整 Oracle 資料庫日常運維核心知識:啟動/關閉模式、資料字典高效查詢技巧、效能監控常用 SQL、使用者連線管理、邏輯備份排程腳本、核心 DDL/DML/DCL 語法與權限管理,適合 DBA 隨手查閱與初學者建立知識骨架。
# 切換到 oracle 作業系統用戶 su - oracle # SQL*Plus 方式啟動(推薦) sqlplus /nolog SQL> connect / as sysdba SQL> startup -- 完整啟動:NOMOUNT → MOUNT → OPEN # 關閉 SQL> shutdown immediate -- 正常關閉,等待交易完成 SQL> shutdown abort -- 強制關閉,下次啟動需執行例項恢復
| 命令 | 階段 | 適用場景 |
|---|---|---|
| STARTUP NOMOUNT | 啟動 Example,讀取參數檔,建立 SGA/背景程序 | 重建控制檔、建立新資料庫 |
| STARTUP MOUNT | 掛載控制檔,驗證資料檔/Redo 位置 | 歸檔模式切換、媒體恢復、資料檔上線/下線、重新定位檔案 |
| STARTUP OPEN | 開啟所有資料檔與 Redo Log | 正常業務存取(預設) |
| STARTUP RESTRICT | 限制模式,僅 RESTRICTED SESSION 權限可連線 | 維護窗口、資料遷移 |
| STARTUP FORCE | 強制關閉後重新啟動 | 無法正常關閉時 |
| STARTUP PFILE=... | 指定參數檔啟動 | 多套參數測試、災難恢復 |
資料字典儲於 SYS 綱要下,透過 DICTIONARY/DICT_COLUMNS 可快速定位所需視圖:
-- 找所有與 INDEX 相關的字典視圖 select * from dictionary where instr(comments, 'index') > 0; -- 查看 USER_INDEXES 欄位含義 select column_name, comments from dict_columns where table_name = 'USER_INDEXES';
| 類別 | 需求 | SQL 範例 |
|---|---|---|
| 使用者 | 預設表空間 | select username, default_tablespace from user_users; |
| 角色權限 | select * from user_role_privs; | |
| 系統權限 | select * from user_sys_privs; | |
| 物件權限 | select * from user_tab_privs; | |
| 當前連線 | select username, sid, serial# from v$session; | |
| 表 | 所有表清單 | select * from user_tables; |
| 依名稱模糊查詢 | select object_name, object_id from user_objects where instr(object_name,'LOG')>0; | |
| 建立時間 | select object_name, created from user_objects where object_name=upper('&table_name'); | |
| 表大小 (MB) | select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name'); | |
| 快取表 | select table_name, cache from user_tables where instr(cache,'Y')>0; | |
| 索引 | 索引清單與類型 | select index_name, index_type, table_name from user_indexes order by table_name; |
| 索引欄位 | select * from user_ind_columns where index_name=upper('&index_name'); | |
| 索引大小 | select sum(bytes)/(1024*1024) from user_segments where segment_name=upper('&index_name'); | |
| 序列 | 當前值 | select * from user_sequences; |
| 視圖 | 視圖定義 SQL | set long 2000; select text from user_views where view_name=upper('&view_name'); |
| 同義詞 | 同義詞清單 | select * from user_synonyms; |
| 約束條件 | 表約束詳情 | select c.constraint_name, c.constraint_type, cc.column_name from user_constraints c, user_cons_columns cc where c.owner=cc.owner and c.constraint_name=cc.constraint_name and c.table_name=upper('&table_name') order by cc.position; |
| 函數/程序 | 原始碼 | select text from all_source where owner=user and name=upper('&plsql_name'); |
-- 表空間大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
-- 表空間使用率
select a.tablespace_name, a.bytes total, b.bytes used, c.bytes free,
round(b.bytes*100/a.bytes,2) pct_used, round(c.bytes*100/a.bytes,2) pct_free
from sys.sm$ts_available a, sys.sm$ts_used b, sys.sm$ts_free c
where a.tablespace_name=b.tablespace_name and a.tablespace_name=c.tablespace_name;
-- 控制檔/Redo Log 位置
select name from v$controlfile;
select member from v$logfile;
-- 資料庫版本
select version from product_component_version where substr(product,1,6)='Oracle';
-- 物件統計
select owner, object_type, status, count(*) from all_objects group by owner, object_type, status;
-- 查看所有 Session select username, sid, serial#, program, machine, logon_time from v$session where username is not null; -- 正常終止 Session alter system kill session 'sid,serial#'; -- 若無效,找 OS Process 並 kill -9 select p.spid from v$session s, v$process p where s.sid=21 and s.paddr=p.addr;
DESC table_name:顯示表結構L:列出緩衝區 SQLc/old/new:修改當前行i:插入新行edit file.sql:呼叫外部編輯器(可在 login.sql 設 DEFINE _EDITOR=vi)@script.sql 或 START script.sql:執行腳本# 完全備份 exp_comp.sh rq=`date +"%m%d"` su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp" # 累積備份 exp_cumu.sh rq=`date +"%m%d"` su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp" # 增量備份 exp_incr.sh rq=`date +"%m%d"` su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp" # root crontab 0 2 1 * * /oracle/exp_comp.sh # 每月 1 日 02:00 完全備份 30 2 * * 0-5 /oracle/exp_incr.sh # 週一至六 02:30 增量備份 45 2 * * 6 /oracle/exp_cumu.sh # 週日 02:45 累積備份
注意:Oracle 11g+ 建議改用 expdp/impdp (Data Pump) 取代傳統 exp/imp,效能與功能更強。
INSERT INTO t(c1,c2) VALUES (v1,v2); 字串用單引號,含單引號寫兩個 ''DELETE FROM t WHERE cond; 大量刪除用 TRUNCATE TABLE t;(DDL,不可回滾,釋放空間)UPDATE t SET c1=v1 WHERE cond; 記得 COMMIT 或 ROLLBACKCOMMIT,避免回滾段暴增CHAR、VARCHAR2、NUMBER(p,s)、DATECREATE TABLE t (id NUMBER PRIMARY KEY, name VARCHAR2(100) DEFAULT 'N/A');ALTER TABLE t ADD (col2 NUMBER); / MODIFY (col2 NUMBER(10)); / DROP COLUMN col2;DROP TABLE t CASCADE CONSTRAINTS;CREATE INDEX idx_t_c1 ON t(c1); / ALTER INDEX idx_t_c1 REBUILD;CREATE VIEW v AS SELECT ...;CREATE SYNONYM s FOR t@dblink;CREATE DATABASE LINK dbl CONNECT TO u IDENTIFIED BY p USING 'tns';OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;UNION(去重)、UNION ALL、MINUS、INTERSECTGROUP BY ... HAVING ...LEFT/RIGHT/FULL JOIN ... ON ...(舊式 (+) 已棄用)ORDER BY c1 ASC, c2 DESCLIKE 'ABC%' / INSTR(col,'ABC')>0CONNECT、RESOURCE、DBAGRANT SELECT, INSERT ON t TO u1, u2;REVOKE SELECT ON t FROM u1;將本文加入書籤,關鍵時刻可作為 Oracle DBA 的「隨身速查手冊」。