为什么在ADB-S中执行dbms_stats.gather_table_stats统计SSB表时报ORA-20000
报错根因
ADB-S(Oracle自治数据库共享版)中的SSB是Oracle官方预置的只读示例Schema,默认ADMIN用户没有该Schema下对象的分析权限,因此直接调用dbms_stats.gather_table_stats针对SSB下的表操作会触发权限不足报错。
方案1:复制SSB表到自定义Schema后执行统计信息收集
该方案可以完全匹配你原本的操作逻辑,成功触发统计信息收集任务生成CPU负载,操作步骤如下:
- 创建自定义业务Schema并授权
-- 替换<自定义密码>为你设置的符合ADB-S密码规则的密码 CREATE USER MY_SSB IDENTIFIED BY "<自定义密码>"; GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO MY_SSB;
- 复制SSB下需要用到的表到自定义Schema
-- 复制CUSTOMER表,其他SSB表可按需复制 CREATE TABLE MY_SSB.CUSTOMER AS SELECT * FROM SSB.CUSTOMER; -- 示例:复制其他SSB表 -- CREATE TABLE MY_SSB.LINEORDER AS SELECT * FROM SSB.LINEORDER; -- CREATE TABLE MY_SSB.DATES AS SELECT * FROM SSB.DATES;
- 执行统计信息收集操作
-- 收集单表统计信息 EXEC dbms_stats.gather_table_stats('MY_SSB','CUSTOMER'); -- 如需更高CPU负载,可收集整个Schema的统计信息 -- EXEC dbms_stats.gather_schema_stats('MY_SSB');
方案2:直接运行CPU密集型SQL生成负载
如果你不需要依赖SSB的表结构,可以直接运行运算类SQL快速生成CPU负载,示例语句如下:
-- 循环执行密集运算,可调整循环次数控制负载大小和持续时间 DECLARE v_num NUMBER := 0; BEGIN FOR i IN 1..10000000 LOOP v_num := v_num + SQRT(i) * MOD(i,1000); END LOOP; END; /
内容的提问来源于stack exchange,提问作者Thomas Baby
相关产品推荐
相关产品推荐

