Oracle 数据库常见操作指南

Oracle 数据库常见操作指南

📋 概述
#

本文档整理了 Oracle 和 MySQL 数据库日常运维中的常见操作和问题解决方案,包括:

  • 数据库对比工具使用
  • 游标超限问题处理
  • 密码过期处理
  • 数据库空间查询
  • 业务进度跟踪

🔧 数据库对比工具
#

工具位置
#

对比工具部署在 117 服务器上。

ORA-01000 错误:超出打开游标的最大数
#

错误信息
#

Caused by: java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数

原因分析
#

  • 数据库对比操作需要打开大量游标
  • 当前游标数设置过小,无法满足对比需求
  • 游标未及时释放导致累积超限

解决步骤
#

步骤 1:查询当前游标配置

-- 查看当前游标最大数
SELECT name, value 
FROM V$PARAMETER 
WHERE name = 'open_cursors';

步骤 2:临时增加游标数

-- 建议设置为 1000 或更大(根据实际需求调整)
ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;

参数说明

  • SCOPE=BOTH:立即生效且写入配置文件
  • SCOPE=MEMORY:仅当前实例生效,重启后失效
  • SCOPE=SPFILE:仅写入配置文件,需重启生效

步骤 3:执行数据库对比

重新运行对比工具进行数据同步。

步骤 4:恢复原始配置

-- 对比完成后,恢复为原始值(如 300)
ALTER SYSTEM SET open_cursors = 300 SCOPE=BOTH;

⚠️ 注意事项
#

  1. 必须按顺序执行操作
  2. 记录原始游标数值
  3. 对比完成后及时恢复配置
  4. 避免长期设置过大的游标数

🔐 数据库密码管理
#

密码过期问题
#

问题描述
#

Oracle 数据库默认密码策略会导致密码定期过期,影响应用连接。

解决方案
#

方法 1:重置密码

-- 修改指定用户密码
ALTER USER 用户名 IDENTIFIED BY 新密码;

-- 示例
ALTER USER QYSL IDENTIFIED BY NewPassword123;

方法 2:解锁被锁定的账户

-- 解锁账户
ALTER USER 用户名 ACCOUNT UNLOCK;

-- 示例
ALTER USER SXGL_INIT ACCOUNT UNLOCK;

方法 3:同时修改密码并解锁

-- 一次性完成密码重置和解锁
ALTER USER 用户名 IDENTIFIED BY 新密码 ACCOUNT UNLOCK;

密码策略管理
#

查看密码策略

-- 查看用户的 Profile
SELECT username, profile 
FROM dba_users 
WHERE username = '用户名';

-- 查看 Profile 的密码策略
SELECT * 
FROM dba_profiles 
WHERE profile = 'DEFAULT' 
  AND resource_type = 'PASSWORD';

修改密码永不过期

-- 修改 Profile 使密码永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

📊 数据库空间查询
#

Oracle 数据库空间占用
#

查询指定用户的空间使用情况
#

SELECT 
  'QYSL' AS 数据库名,
  ROUND(SUM(bytes) / 1024 / 1024, 2) AS "总大小(MB)",
  ROUND(SUM(CASE WHEN segment_type = 'TABLE' THEN bytes ELSE 0 END) / 1024 / 1024, 2) AS "数据大小(MB)",
  ROUND(SUM(CASE WHEN segment_type = 'INDEX' THEN bytes ELSE 0 END) / 1024 / 1024, 2) AS "索引大小(MB)"
FROM 
  dba_segments 
WHERE 
  owner = 'QYSL'  
  AND segment_type IN ('TABLE', 'INDEX');

查询所有用户的空间占用
#

SELECT 
  owner AS 用户名,
  ROUND(SUM(bytes) / 1024 / 1024, 2) AS "总大小(MB)"
FROM 
  dba_segments 
WHERE 
  owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'XDB')
GROUP BY 
  owner
ORDER BY 
  SUM(bytes) DESC;

查询表空间使用情况
#

SELECT 
  tablespace_name AS 表空间名,
  ROUND(SUM(bytes) / 1024 / 1024, 2) AS "已使用(MB)",
  ROUND(MAX(bytes) / 1024 / 1024, 2) AS "最大块(MB)"
FROM 
  dba_free_space
GROUP BY 
  tablespace_name;

MySQL 数据库空间占用
#

查询指定数据库的空间使用情况
#

SELECT 
  TABLE_SCHEMA AS '数据库名',
  ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)',
  ROUND(SUM(DATA_LENGTH) / 1024 / 1024, 2) AS '数据大小(MB)',
  ROUND(SUM(INDEX_LENGTH) / 1024 / 1024, 2) AS '索引大小(MB)'
FROM 
  information_schema.TABLES 
WHERE 
  TABLE_SCHEMA = '数据库名' 
GROUP BY 
  TABLE_SCHEMA;

查询所有数据库的空间占用
#

SELECT 
  TABLE_SCHEMA AS '数据库名',
  ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)',
  COUNT(TABLE_NAME) AS '表数量'
FROM 
  information_schema.TABLES 
WHERE 
  TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY 
  TABLE_SCHEMA
ORDER BY 
  SUM(DATA_LENGTH + INDEX_LENGTH) DESC;

查询指定数据库中各表的大小
#

SELECT 
  TABLE_NAME AS '表名',
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)',
  ROUND(DATA_LENGTH / 1024 / 1024, 2) AS '数据大小(MB)',
  ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS '索引大小(MB)',
  TABLE_ROWS AS '行数'
FROM 
  information_schema.TABLES 
WHERE 
  TABLE_SCHEMA = '数据库名'
ORDER BY 
  (DATA_LENGTH + INDEX_LENGTH) DESC;

字段说明
#

字段说明
总大小(MB)表和索引占用的总空间
数据大小(MB)表数据占用的空间
索引大小(MB)索引占用的空间
ROUND(..., 2)结果保留两位小数

使用场景
#

  • ✅ 监控数据库空间使用情况
  • ✅ 评估数据增长趋势
  • ✅ 优化存储空间分配
  • ✅ 识别需要归档的大表
  • ✅ 容量规划和预警

📈 业务进度跟踪
#

链条数据库进度查询
#

查询表ENTERPRISE_BIZ_ITEMNODE

此表用于跟踪链条数据库中的业务流程进度状态。

常用查询示例
#

-- 查询指定业务的进度
SELECT 
  item_id AS 业务ID,
  node_name AS 节点名称,
  status AS 状态,
  create_time AS 创建时间,
  update_time AS 更新时间
FROM 
  ENTERPRISE_BIZ_ITEMNODE
WHERE 
  item_id = '业务ID'
ORDER BY 
  create_time;

🗺️ 区域办件量统计
#

各区域按年度办件量汇总
#

适用场景:统计指定业务在各区县/旗的每年办理总量,并按行政区划固定顺序排列,便于横向对比分析。

涉及表ENTERPRISE_BUSINESS_INDEX

完整查询语句
#

-- 各区域办件量统计
SELECT
    REGION_NAME AS 区划名称,
    TO_CHAR(ACCEPT_TIME, 'YYYY') AS 办理年度,
    COUNT(*) AS 办件总量
FROM
    ENTERPRISE_BUSINESS_INDEX
WHERE
    APPLY_SUBJECT LIKE '%业务名称%'
    -- 日期区间筛选
    AND ACCEPT_TIME >= DATE '2019-01-01'
    AND ACCEPT_TIME < DATE '2027-01-01'
    -- 排除无效空数据
    AND ACCEPT_TIME IS NOT NULL
    AND REGION_NAME IS NOT NULL
    AND APPLY_SUBJECT IS NOT NULL
GROUP BY
    REGION_NAME,
    TO_CHAR(ACCEPT_TIME, 'YYYY')
-- 按照指定区县顺序固定排序,同区划按年度升序
ORDER BY
    CASE REGION_NAME
        WHEN '集宁区' THEN 1
        WHEN '丰镇市' THEN 2
        WHEN '察右前旗' THEN 3
        WHEN '察右中旗' THEN 4
        WHEN '察哈尔右翼后旗' THEN 5
        WHEN '四子王旗' THEN 6
        WHEN '卓资县' THEN 7
        WHEN '凉城县' THEN 8
        WHEN '兴和县' THEN 9
        WHEN '商都县' THEN 10
        WHEN '化德县' THEN 11
        WHEN '乌兰察布市' THEN 12
        ELSE 99
    END ASC,
    办理年度 ASC;

字段说明
#

字段说明
REGION_NAME区划名称,对应各旗县市区
ACCEPT_TIME业务受理时间,用于年度分组和日期筛选
APPLY_SUBJECT业务名称,使用 LIKE 模糊匹配目标业务
COUNT(*)该区划该年度的办件总数

使用说明
#

1. 替换业务名称

'%业务名称%' 中的 业务名称 替换为实际要统计的业务,例如:

APPLY_SUBJECT LIKE '%食品经营许可%'

2. 调整日期区间

根据实际统计需求修改起止日期:

-- 仅统计 2023-2025 年
AND ACCEPT_TIME >= DATE '2023-01-01'
AND ACCEPT_TIME < DATE '2026-01-01'

3. 修改排序区划

CASE REGION_NAME 中的区划顺序可按需调整,未在列表中的区划统一排在末尾(ELSE 99)。

4. 扩展统计维度

如需同时统计多个业务,可去掉 APPLY_SUBJECT 过滤条件,并将其加入 GROUP BY

SELECT
    REGION_NAME AS 区划名称,
    APPLY_SUBJECT AS 业务名称,
    TO_CHAR(ACCEPT_TIME, 'YYYY') AS 办理年度,
    COUNT(*) AS 办件总量
FROM
    ENTERPRISE_BUSINESS_INDEX
WHERE
    ACCEPT_TIME >= DATE '2019-01-01'
    AND ACCEPT_TIME < DATE '2027-01-01'
    AND ACCEPT_TIME IS NOT NULL
    AND REGION_NAME IS NOT NULL
    AND APPLY_SUBJECT IS NOT NULL
GROUP BY
    REGION_NAME,
    APPLY_SUBJECT,
    TO_CHAR(ACCEPT_TIME, 'YYYY')
ORDER BY
    CASE REGION_NAME
        WHEN '集宁区' THEN 1
        WHEN '丰镇市' THEN 2
        WHEN '察右前旗' THEN 3
        WHEN '察右中旗' THEN 4
        WHEN '察哈尔右翼后旗' THEN 5
        WHEN '四子王旗' THEN 6
        WHEN '卓资县' THEN 7
        WHEN '凉城县' THEN 8
        WHEN '兴和县' THEN 9
        WHEN '商都县' THEN 10
        WHEN '化德县' THEN 11
        WHEN '乌兰察布市' THEN 12
        ELSE 99
    END ASC,
    业务名称 ASC,
    办理年度 ASC;

使用场景
#

  • ✅ 统计各旗县某项业务每年的办理量
  • ✅ 生成区域年度对比报表
  • ✅ 排查各区域业务受理差异
  • ✅ 为政务服务考核提供数据支撑

📊 一件事业务统计
#

统计多分类一件事业务总量
#

适用场景:按业务类型分类统计各类"一件事"业务的总办件量,便于了解不同一件事业务的办理情况。

涉及表ENTERPRISE_BUSINESS_INDEX

完整查询语句
#

-- 统计多分类一件事业务总量
SELECT
    CASE
        WHEN FORM_NAME LIKE '%健康%' THEN '健康证一件事'
        WHEN FORM_NAME LIKE '%道路%' THEN '出租车换证一件事'
        WHEN FORM_NAME LIKE '%水电%' THEN '房产交易与水电暖气过户一件事'
        WHEN FORM_NAME LIKE '%公租%' THEN '公租房承租资格确认一件事'
        WHEN FORM_NAME LIKE '%公共%' THEN '公共场所卫生许可一件事'
        WHEN FORM_NAME LIKE '%创业%' THEN '创业担保贷款一件事'
    END AS 业务分类,
    COUNT(*) AS 总数量
FROM
    ENTERPRISE_BUSINESS_INDEX
WHERE
    (FORM_NAME LIKE '%健康%'
    OR FORM_NAME LIKE '%道路%'
    OR FORM_NAME LIKE '%水电%'
    OR FORM_NAME LIKE '%公租%'
    OR FORM_NAME LIKE '%公共%'
    OR FORM_NAME LIKE '%创业%')
    
    AND ACCEPT_TIME >= DATE '2019-01-01'
    AND ACCEPT_TIME < DATE '2027-01-01'
    AND ACCEPT_TIME IS NOT NULL
    AND REGION_NAME IS NOT NULL
    AND FORM_NAME IS NOT NULL
GROUP BY
    CASE
        WHEN FORM_NAME LIKE '%健康%' THEN '健康证一件事'
        WHEN FORM_NAME LIKE '%道路%' THEN '出租车换证一件事'
        WHEN FORM_NAME LIKE '%水电%' THEN '房产交易与水电暖气过户一件事'
        WHEN FORM_NAME LIKE '%公租%' THEN '公租房承租资格确认一件事'
        WHEN FORM_NAME LIKE '%公共%' THEN '公共场所卫生许可一件事'
        WHEN FORM_NAME LIKE '%创业%' THEN '创业担保贷款一件事'
    END
ORDER BY 业务分类;

字段说明
#

字段说明
FORM_NAME表单名称,用于匹配不同类型的一件事业务
业务分类通过 CASE WHEN 将表单名称映射为具体的一件事类型
总数量该类型一件事业务的总办件量
ACCEPT_TIME业务受理时间,用于日期筛选

业务分类说明
#

匹配关键字业务分类名称
%健康%健康证一件事
%道路%出租车换证一件事
%水电%房产交易与水电暖气过户一件事
%公租%公租房承租资格确认一件事
%公共%公共场所卫生许可一件事
%创业%创业担保贷款一件事

使用说明
#

1. 调整日期区间

根据实际统计需求修改起止日期:

-- 仅统计 2023-2025 年
AND ACCEPT_TIME >= DATE '2023-01-01'
AND ACCEPT_TIME < DATE '2026-01-01'

2. 新增业务类型

如需统计更多一件事类型,在 CASE WHENWHERE 条件中添加:

-- 在 CASE WHEN 中添加
WHEN FORM_NAME LIKE '%餐饮%' THEN '餐饮开店一件事'

-- 在 WHERE 条件中添加
OR FORM_NAME LIKE '%餐饮%'

3. 添加年度维度

如需按年度统计各一件事业务量:

SELECT
    CASE
        WHEN FORM_NAME LIKE '%健康%' THEN '健康证一件事'
        WHEN FORM_NAME LIKE '%道路%' THEN '出租车换证一件事'
        WHEN FORM_NAME LIKE '%水电%' THEN '房产交易与水电暖气过户一件事'
        WHEN FORM_NAME LIKE '%公租%' THEN '公租房承租资格确认一件事'
        WHEN FORM_NAME LIKE '%公共%' THEN '公共场所卫生许可一件事'
        WHEN FORM_NAME LIKE '%创业%' THEN '创业担保贷款一件事'
    END AS 业务分类,
    TO_CHAR(ACCEPT_TIME, 'YYYY') AS 办理年度,
    COUNT(*) AS 总数量
FROM
    ENTERPRISE_BUSINESS_INDEX
WHERE
    (FORM_NAME LIKE '%健康%'
    OR FORM_NAME LIKE '%道路%'
    OR FORM_NAME LIKE '%水电%'
    OR FORM_NAME LIKE '%公租%'
    OR FORM_NAME LIKE '%公共%'
    OR FORM_NAME LIKE '%创业%')
    AND ACCEPT_TIME >= DATE '2019-01-01'
    AND ACCEPT_TIME < DATE '2027-01-01'
    AND ACCEPT_TIME IS NOT NULL
    AND REGION_NAME IS NOT NULL
    AND FORM_NAME IS NOT NULL
GROUP BY
    CASE
        WHEN FORM_NAME LIKE '%健康%' THEN '健康证一件事'
        WHEN FORM_NAME LIKE '%道路%' THEN '出租车换证一件事'
        WHEN FORM_NAME LIKE '%水电%' THEN '房产交易与水电暖气过户一件事'
        WHEN FORM_NAME LIKE '%公租%' THEN '公租房承租资格确认一件事'
        WHEN FORM_NAME LIKE '%公共%' THEN '公共场所卫生许可一件事'
        WHEN FORM_NAME LIKE '%创业%' THEN '创业担保贷款一件事'
    END,
    TO_CHAR(ACCEPT_TIME, 'YYYY')
ORDER BY 
    业务分类 ASC,
    办理年度 ASC;

使用场景
#

  • ✅ 统计各类一件事业务的总办件量
  • ✅ 对比不同一件事业务的受欢迎程度
  • ✅ 分析一件事改革实施效果
  • ✅ 为政务服务优化提供数据支撑
  • ✅ 生成一件事业务统计报表

📚 相关资源
#


🔄 更新日志
#

  • 2026-04-01:新增一件事业务统计 SQL
  • 2026-02-27:新增 MySQL 空间查询、优化文档结构
  • 2024-06-01:初始版本,包含基础操作
Weidong's Blok 伟东
Weidong’s Blok 伟东
欢迎访问我的技术博客,记录工具、踩坑、系统运维经验。