这篇文章合并两类常用操作:一类用于排查已有 Oracle 数据库,另一类用于初始化新的业务用户。示例中的 Schema、表名、文件路径和密码都需要按实际环境替换。
如果数据库采用 CDB/PDB 架构,应先连接到目标 PDB,再创建本地用户和表空间。
常用诊断查询
查询指定表的索引
下面的 SQL 会列出索引类型、唯一性、状态、表空间以及索引列顺序:
SELECT i.owner AS schema_name,
i.index_name,
i.index_type,
i.uniqueness,
i.status,
c.column_name,
c.column_position,
i.tablespace_name
FROM dba_indexes i
JOIN dba_ind_columns c
ON i.owner = c.index_owner
AND i.index_name = c.index_name
WHERE i.table_name = 'CHANNEL_FUND_JRN'
AND i.owner = 'PAY_FUND_CHANNEL'
ORDER BY i.index_name, c.column_position;
DBA_INDEXES 和 DBA_IND_COLUMNS 需要相应的数据字典权限。普通用户没有权限时,可以根据可见范围改用 ALL_INDEXES、ALL_IND_COLUMNS 或 USER_INDEXES、USER_IND_COLUMNS。
查询共享 SQL 区中的高消耗语句
SELECT sql_id,
sql_text,
executions,
ROUND(elapsed_time / 1000000, 2) AS "总耗时(秒)",
ROUND(cpu_time / 1000000, 2) AS "CPU时间(秒)",
ROUND((cpu_time / elapsed_time) * 100, 2) AS "CPU占比(%)",
ROUND(elapsed_time / DECODE(executions, 0, 1, executions) / 1000000, 4) AS "单次执行耗时(秒)",
ROUND(cpu_time / DECODE(executions, 0, 1, executions) / 1000000, 4) AS "单次CPU时间(秒)"
FROM v$sqlarea
WHERE elapsed_time > 0
ORDER BY cpu_time DESC;
V$SQLAREA 中的数据来自共享池,不等同于完整的历史审计记录。实例重启、游标淘汰或共享池刷新后,数据会发生变化;需要长期趋势时应使用 AWR/ASH 等能力。
查询数据库字符集
SELECT parameter, value
FROM v$nls_parameters
WHERE parameter = 'NLS_CHARACTERSET';
创建表空间和用户
下面以业务 Schema WEB3 为例,将表数据和索引分别放入两个表空间。
创建数据与索引表空间
CREATE TABLESPACE WEB3_DATA
DATAFILE '/path/to/oradata/WEB3_DATA01.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE WEB3_INDEX
DATAFILE '/path/to/oradata/WEB3_INDEX01.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
生产环境不应直接照搬 MAXSIZE UNLIMITED,应结合磁盘容量、告警和扩容策略设置合理上限。
创建用户并分配配额
CREATE USER WEB3 IDENTIFIED BY "change_me"
DEFAULT TABLESPACE WEB3_DATA
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON WEB3_DATA
QUOTA UNLIMITED ON WEB3_INDEX;
示例密码仅为占位符。实际环境应使用密码管理系统生成和保存高强度密码,避免把真实凭据提交到代码仓库。
授予最小必要权限
GRANT CREATE SESSION TO WEB3;
GRANT CREATE TABLE TO WEB3;
GRANT CREATE VIEW TO WEB3;
用户可以在自己拥有的表上创建索引,不需要额外授予 CREATE ANY INDEX。只授予业务确实需要的权限,不要为了省事直接授予 DBA。
验证用户和表空间
CREATE TABLE WEB3.A (
id NUMBER
) TABLESPACE WEB3_DATA;
CREATE INDEX WEB3.IDX_A_ID
ON WEB3.A(id)
TABLESPACE WEB3_INDEX;
INSERT INTO WEB3.A(id) VALUES (1);
COMMIT;
SELECT * FROM WEB3.A;
验证完成后,可以根据需要删除测试表:
DROP TABLE WEB3.A PURGE;