这篇文章合并两类常用操作:一类用于排查已有 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_INDEXESDBA_IND_COLUMNS 需要相应的数据字典权限。普通用户没有权限时,可以根据可见范围改用 ALL_INDEXESALL_IND_COLUMNSUSER_INDEXESUSER_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;