首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle DBA 必備:啟動關閉、資料字典、常用查詢、備份腳本全攻略

     編輯:Oracle 教學

Oracle DBA 必備:啟動關閉、資料字典、常用查詢、備份腳本全攻略

本文彙整 Oracle 資料庫日常運維核心知識:啟動/關閉模式、資料字典高效查詢技巧、效能監控常用 SQL、使用者連線管理、邏輯備份排程腳本、核心 DDL/DML/DCL 語法與權限管理,適合 DBA 隨手查閱與初學者建立知識骨架。

一、資料庫啟動與關閉模式完解

單機環境(Oracle 9i/10g/11g/12c/19c 通用)

# 切換到 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;
視圖視圖定義 SQLset 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');

三、資料庫級監控常用 SQL

-- 表空間大小
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;

五、SQL*Plus 實用技巧

  • DESC table_name:顯示表結構
  • L:列出緩衝區 SQL
  • c/old/new:修改當前行
  • i:插入新行
  • edit file.sql:呼叫外部編輯器(可在 login.sql 設 DEFINE _EDITOR=vi)
  • @script.sql 或 START script.sql:執行腳本

六、邏輯備份 Shell 腳本(排程範例)

# 完全備份 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,效能與功能更強。

七、核心 SQL 語法速查

DML

  • 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 或 ROLLBACK
  • 大量 DML 建議分批 COMMIT,避免回滾段暴增

DDL

  • 常用型別:CHAR、VARCHAR2、NUMBER(p,s)、DATE
  • CREATE 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;
  • DB Link:CREATE DATABASE LINK dbl CONNECT TO u IDENTIFIED BY p USING 'tns';

查詢進階

  • 分頁(12c+):OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
  • 集合運算:UNION(去重)、UNION ALL、MINUS、INTERSECT
  • 分組:GROUP BY ... HAVING ...
  • 外連結:LEFT/RIGHT/FULL JOIN ... ON ...(舊式 (+) 已棄用)
  • 排序:ORDER BY c1 ASC, c2 DESC
  • 模糊:LIKE 'ABC%' / INSTR(col,'ABC')>0

權限管理 (DCL)

  • 系統角色:CONNECT、RESOURCE、DBA
  • 物件權限:GRANT SELECT, INSERT ON t TO u1, u2;
  • 回收:REVOKE SELECT ON t FROM u1;

將本文加入書籤,關鍵時刻可作為 Oracle DBA 的「隨身速查手冊」。

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