为支撑 Oracle /MySQL 数据库国产化迁移工作,需提取数据库中核心对象数量及数据量规模等相关数据。以下提供面向国产化迁移场景的统计脚本,聚焦业务核心对象(过滤系统用户),确保统计结果贴合迁移评估需求。
源库为Oracle
1. 存储过程/函数数量统计
统计说明:聚焦业务用户下的存储过程和自定义函数,排除系统用户(SYS、SYSTEM、SCOTT、DBSNMP)及停用账户,反映需迁移的可编程逻辑规模。
SELECT COUNT(*)
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION')
and owner in (select username from dba_users where account_status='OPEN' AND username NOT IN ('SYS','SYSTEM','SCOTT','DBSNMP') );
2. 触发器数量统计
统计说明:统计业务用户下的触发器总量,触发器作为数据变更的核心逻辑,是国产化迁移中需重点适配的对象。
SELECT COUNT(*)
FROM DBA_OBJECTS
WHERE OBJECT_TYPE = 'TRIGGER'
and owner in (select username from dba_users where account_status='OPEN' AND username NOT IN ('SYS','SYSTEM','SCOTT','DBSNMP') );
3. 自定义类型/包数量统计
统计说明:自定义类型和包是 Oracle 特有封装形式,国产化迁移需区分规范(specification)和实现(BODY),按需统计以评估适配工作量。
-- 仅统计TYPE和PACKAGE的规范
SELECT COUNT(*)
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('TYPE', 'PACKAGE')
and owner in (select username from dba_users where account_status='OPEN' AND username NOT IN ('SYS','SYSTEM','SCOTT','DBSNMP') );
-- 包含BODY的统计
SELECT COUNT(*)
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('TYPE', 'TYPE BODY', 'PACKAGE', 'PACKAGE BODY')
and owner in (select username from dba_users where account_status='OPEN' AND username NOT IN ('SYS','SYSTEM','SCOTT','DBSNMP') );
4. 分区表数量统计
统计说明:分区表涉及数据存储结构设计,国产化数据库对分区表的支持程度差异较大,需精准统计以评估结构适配工作量。
SELECT COUNT(*)
FROM DBA_TABLES
WHERE PARTITIONED = 'YES'
and owner in (select username from dba_users where account_status='OPEN' AND username NOT IN ('SYS','SYSTEM','SCOTT','DBSNMP') );
5.数据量规模统计
统计说明:数据量大小是国产化迁移存储规划、迁移时长评估的核心依据,需区分 “分配空间”(物理文件预留)和 “实际占用空间”(业务数据真实规模)。
--数据文件分配的空间大小
SELECT SUM(bytes)/1024/1024/1024 AS allocated_space FROM dba_data_files;
--数据库对象占用空间大小
SELECT SUM(bytes)/1024/1024/1024 AS used_space FROM dba_segments;
补充说明
- 脚本适配性:以上脚本基于 Oracle 标准数据字典编写,执行需 DBA 权限;若仅统计当前用户,可将
DBA_前缀替换为USER_,并移除owner过滤条件。 - 国产化适配建议:统计结果需结合目标国产数据库的特性,重点关注分区表、自定义类型 / 包、触发器的兼容性差异,为迁移工作量评估提供量化依据。
- 扩展统计:如需细化到具体用户、表空间的统计,可在 WHERE 子句中增加
TABLESPACE_NAME、OWNER等筛选条件,进一步精准化迁移范围。
源库为MySQL
1. 存储过程个数
SELECT COUNT(*) AS procedure_count
FROM information_schema.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
AND ROUTINE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
2. 函数个数
SELECT COUNT(*) AS function_count
FROM information_schema.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND ROUTINE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
3. 分区表个数(按表去重)
SELECT COUNT(DISTINCT TABLE_SCHEMA, TABLE_NAME) AS partitioned_table_count
FROM information_schema.PARTITIONS
WHERE PARTITION_NAME IS NOT NULL
AND TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
4. 触发器个数
SELECT COUNT(*) AS trigger_count
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
5. 数据量大小
--所有用户表的数据长度 + 索引长度,单位:GB
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS total_size_gb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
--或者可以通过datadir数据目录估算
补充说明:
- 所有查询均排除系统库(
mysql、information_schema、performance_schema、sys),只统计用户数据库。 - 所有统计均基于
information_schema,对大实例查询可能稍慢。 - 分区表个数通过
PARTITIONS表中非空PARTITION_NAME去重得到,准确反映使用了分区的表数量。 - 若需要统计特定数据库,可将
TABLE_SCHEMA NOT IN (...)替换为TABLE_SCHEMA = 'your_db'。 - 数据大小以 GB 为单位,可根据需要调整除数或保留小数位数。
关于作者
网名:飞天,墨天轮2024年度、2025年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、YCP、HCIP-openGauss、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgreSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




