验证对于interval分区,如果提前扩展一下,遇到了几个小问题,一路下来记录到小本本里。
红色的都是坑。
获取ddl
--输出信息采用缩排或换行格式化
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', TRUE);
--实际效果没那么美好 还是有个别单词被断开,换行
--确保每个语句都带分号
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
--关闭表索引、外键等关联(后面单独生成)
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER', FALSE);
--关闭存储、表空间属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', FALSE);
--关闭创建表的PCTFREE、NOCOMPRESS等属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', FALSE);
set pages 0 long 99999999
exec dbms_metadata.set_transform_param(
dbms_metadata.SESSION_TRANSFORM,'EXPORT',true);
SELECT DBMS_METADATA.GET_DDL('TABLE','TAB1','USER1') FROM DUAL;
创建测试表
CREATE TABLE c1
( "D_RECORD_ID" NUMBER(19,0) NOT NULL ENABL
e,
"D_RYMDHM" DATE,
"D_UPDATE_TIME" DATE,
"D_DATETIME" DATE,
"D_DATA_ID" VARCHAR2(30 BYTE),
"V_REPORT" VARCHAR2(4000 BYTE)
)
PARTITION BY RANGE ("D_DATETIME") INTERVAL (
NUMTODSInTERVAL(1,'HOUR'))
(PARTITION "OCEA_CHN_BUSHIP_REP_P" VALuES LESS THAN (TO_DATE('1940-01-01 00:0:00', 'YYYY-MM-DD HH24:MI:SS')));
查看信息
SELECT TABLE_NAME, count(*) part_count
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME in (select table_name
from dba_part_tables
where owner = 'A'
AND INTERVAL like '%HOUR%')
group by table_name
order by 2;
SELECT * FROM User_Part_Tables where table_name='C1';
SELECT * FROM user_TAB_PARTITIONS where table_name='C1';
这时应该只能看到一个分区信息。
必须enable 一下否则会报错
ora-14402
alter table c1 enable row movement;
必须增加一条数据后才能执行下面语句,
否则不会创建分区的
insert into c1 (D_RECORD_ID,D_DATETIME)values (1,sysdate);
commit;
declare v_key date;
begin
select sysdate into v_key from dual;
for x in 1 ..3 loop
update c1 set D_DATETIME=v_key where rownum=1;
rollback;
v_key:=v_key+numtodsinterval(1,'hour');
dbms_output.put_line(v_key);
end loop;
end;
/
确认分区被扩展了:
SELECT TABLE_NAME, count(*) part_count
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME in (select table_name
from dba_part_tables
where owner = 'A'
AND INTERVAL like '%HOUR%')
group by table_name
order by 2;
SELECT * FROM User_Part_Tables where table_name='C1';
SELECT * FROM user_TAB_PARTITIONS where table_name='C1';
表c1这时就有了4个分区了,tmd。
统计近期告警日志中,哪些间隔分区表扩展过多少次:
tail -20000 a1.log |fgrep "INTERVAL" |awk '{print $2}' |awk -F: '{print $1 }' |sort |uniq -c|sort -rn|head
这个方法比数据字典要全,RAC环境要看看其他节点的告警日志结果。
阅读(3063) | 评论(0) | 转发(0) |