用戶與權限管理
創建用戶標準流程
-- 1. 創建表空間(建議分離數據/索引/臨時)
CREATE TABLESPACE app_data
DATAFILE '/u01/app/oracle/oradata/app_data01.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
CREATE TEMPORARY TABLESPACE app_temp
TEMPFILE '/u01/app/oracle/oradata/app_temp01.dbf' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE 5G;
-- 2. 創建用戶並指定默認表空間
CREATE USER app_user IDENTIFIED BY "ComplexPass#2024"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE app_temp
QUOTA UNLIMITED ON app_data;
-- 3. 授予最小權限集
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE TO app_user;
-- 生產環境嚴禁 GRANT DBA TO app_user;
常用用戶操作
| 操作 | 命令 |
| 修改密碼 | ALTER USER app_user IDENTIFIED BY "NewPass#2024"; |
| 鎖定/解鎖 | ALTER USER app_user ACCOUNT LOCK / UNLOCK; |
| 修改默認表空間 | ALTER USER app_user DEFAULT TABLESPACE new_tbs; |
| 刪除用戶(級聯) | DROP USER app_user CASCADE; |
| 查看所有用戶 | SELECT username, account_status, default_tablespace FROM dba_users; |
| 查看用戶權限 | SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER'; |
| 切換用戶登錄 | CONN app_user/"ComplexPass#2024"; |
表空間空間監控核心查詢
表空間總容量
SELECT tablespace_name "表空間",
ROUND(SUM(bytes)/1024/1024, 2) "總容量_MB"
FROM dba_data_files
GROUP BY tablespace_name
ORDER BY 2 DESC;
表空間使用率詳細版(含自動擴展考量)
SELECT
a.tablespace_name "表空間",
ROUND(a.max_bytes/1024/1024, 2) "最大容量_MB",
ROUND(a.bytes/1024/1024, 2) "當前容量_MB",
ROUND((a.bytes - b.free_bytes)/1024/1024, 2) "已用_MB",
ROUND(b.free_bytes/1024/1024, 2) "可用_MB",
ROUND((a.bytes - b.free_bytes) / a.max_bytes * 100, 2) "使用率_%"
FROM (
SELECT tablespace_name,
SUM(bytes) bytes,
SUM(DECODE(autoextensible, 'YES', maxbytes, bytes)) max_bytes
FROM dba_data_files
GROUP BY tablespace_name
) a,
(
SELECT tablespace_name, SUM(bytes) free_bytes
FROM dba_free_space
GROUP BY tablespace_name
) b
WHERE a.tablespace_name = b.tablespace_name(+)
ORDER BY 6 DESC;
臨時表空間使用情況
SELECT tablespace_name,
ROUND(tablespace_size/1024/1024, 2) "總量_MB",
ROUND(allocated_space/1024/1024, 2) "已分配_MB",
ROUND(free_space/1024/1024, 2) "空閒_MB"
FROM dba_temp_free_space;
鎖衝突處理標準流程
查詢阻塞鏈
-- 1. 找到阻塞會話 (BLOCKER)
SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.logon_time,
s.sql_id, sq.sql_text
FROM v$session s, v$sql sq
WHERE s.sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL)
AND s.sql_id = sq.sql_id(+);
-- 2. 找到被阻塞會話 (WAITER)
SELECT w.sid, w.serial#, w.username, w.event, w.seconds_in_wait,
w.sql_id, sq.sql_text
FROM v$session w, v$sql sq
WHERE w.blocking_session IS NOT NULL
AND w.sql_id = sq.sql_id(+);
生成 Kill 腳本
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session
WHERE sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL);
執行 Kill 並驗證
-- 執行生成的語句
ALTER SYSTEM KILL SESSION '136,18257' IMMEDIATE;
-- 驗證鎖釋放
SELECT * FROM v$lock WHERE block = 1;
常見維護操作集錦
表空間擴容
-- 數據文件擴容
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/app_data01.dbf' RESIZE 500M;
-- 添加數據文件
ALTER TABLESPACE app_data ADD DATAFILE
'/u01/app/oracle/oradata/app_data02.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
表空間離線/刪除
-- 離線 (需先確保無活躍事務)
ALTER TABLESPACE app_data OFFLINE NORMAL;
-- 刪除 (含數據文件)
DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
參數文件操作
-- SPFILE 創建/備份
CREATE SPFILE FROM PFILE;
CREATE PFILE='/tmp/init_backup.ora' FROM SPFILE;
-- 參數修改 (SCOPE=SPFILE 需重啟生效,MEMORY 即時生效)
ALTER SYSTEM SET db_cache_size = 2G SCOPE=SPFILE;
ALTER SYSTEM SET shared_pool_size = 1G SCOPE=BOTH;
日志切換與歸檔
-- 強制日志切換
ALTER SYSTEM SWITCH LOGFILE;
-- 檢查歸檔模式
ARCHIVE LOG LIST;
-- 手動歸檔當前日志
ALTER SYSTEM ARCHIVE LOG CURRENT;
性能診斷快速入口
| 現象 | 入口 SQL/視圖 |
| 會話等待 | SELECT * FROM v$session_wait WHERE sid = :sid; |
| 長時間運行 SQL | SELECT * FROM v$sql WHERE elapsed_time/1e6 > 60 ORDER BY elapsed_time DESC; |
| 全表掃描 | SELECT * FROM v$sql_plan WHERE operation = 'TABLE ACCESS' AND options = 'FULL'; |
| 索引未使用 | EXPLAIN PLAN FOR ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); |
| 緩存命中率 | SELECT name, value FROM v$sysstat WHERE name IN ('db block gets','consistent gets','physical reads'); |
腳本化巡檢建議
將上述核心查詢封裝為 daily_check.sql,配合 crontab 定時執行,結果輸出 HTML/CSV 郵件推送,關鍵指標(表空間使用率>80%、鎖等待>5min、緩存命中率<90%)觸發告警。