暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

数据库国产化改造源库提取数据脚本

原创 飞天 2026-03-18
246

为支撑 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;

补充说明

  1. 脚本适配性:以上脚本基于 Oracle 标准数据字典编写,执行需 DBA 权限;若仅统计当前用户,可将DBA_前缀替换为USER_,并移除owner过滤条件。
  2. 国产化适配建议:统计结果需结合目标国产数据库的特性,重点关注分区表、自定义类型 / 包、触发器的兼容性差异,为迁移工作量评估提供量化依据。
  3. 扩展统计:如需细化到具体用户、表空间的统计,可在 WHERE 子句中增加TABLESPACE_NAMEOWNER等筛选条件,进一步精准化迁移范围。

源库为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数据目录估算

补充说明:

  • 所有查询均排除系统库(mysqlinformation_schemaperformance_schemasys),只统计用户数据库。
  • 所有统计均基于 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论