SQL> alter table t_part exchange partition t1 with table ml_test;
alter table t_part exchange partition t1 with table ml_test
ORA-14097: ALTER TABLE EXCHANGE PARTITION 中的列类型或大小不匹配
3.以下更能证明这是结构一致的交换,而非字段的交换 SQL> select * from ml_test1;
ID ID2 MENG LIANG
---- ---- ---- -----
1 2 me li
SQL> select * from t_part1;
ID ID2 LIANG MENG
---- ---- ----- ----
SQL> alter table t_part1 exchange partition t1 with table ml_test1;
Table altered
SQL> select * from t_part1;
ID ID2 LIANG MENG
---- ---- ----- ----
1 2 me li
unused 测试
SQL> desc ml_test;
Name Type Nullable Default Comments
---- --------- -------- ------- --------
ID NUMBER(3) Y
SQL> desc t_part
Name Type Nullable Default Comments
---- --------- -------- ------- --------
ID NUMBER(3) Y
SQL> alter table t_part exchange partition t1 with table ml_test;
alter table t_part exchange partition t1 with table ml_test
ORA-14097: ALTER TABLE EXCHANGE PARTITION 中的列类型或大小不匹配对于以上问题是,为什么结构一样,交换还是报错呢?
那是因为ml_test 是drop column, 而t_part 是 ALTER TABLE t_part DROP UNUSED name1; 设置为UNUSED,其实只是不可见,并没有彻底删除,此时没有释放存储空间,如果是compress 表,那么此时不参与压缩与解压,io操作。
怎么处理呢? 请看下面步骤:
SQL> ALTER TABLE t_part DROP UNUSED COLUMNS;
Table altered
Executed in 0.062 seconds
SQL> alter table t_part exchange partition t1 with table ml_test;
Table altered
Executed in 0.032 seconds
SQL>
ALTER TABLE ml_xx SET UNUSED COLUMN GlobalFlag;
ALTER TABLE ml_xx DROP UNUSED COLUMNS;
现网实战:
--刷新试图
CALL dbms_mview.refresh('user_Partitions', 'C');
--删除分区
BEGIN
FOR cur IN (
select
table_name, partition_name
from user_Partitions
WHERE
partition_name <> 'Pxxxxxxxx'
AND table_name='CS_xxxxxxx_ML'
ORDER BY table_name, partition_name
) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE xxxx.' || cur.table_name || ' DROP PARTITION ' || cur.partition_name;
END LOOP;
END;
--创建分区
DECLARE
v_sql VARCHAR2(1000);
v_date1 VARCHAR2(20);
v_date2 VARCHAR2(20);
v_date DATE;
v_count NUMBER(3);
BEGIN
v_count:=1;
v_date1:=to_char(SYSDATE,'yyyymmddhh24');
v_date2:=to_char(SYSDATE,'yyyy-mm-dd hh24');
WHILE v_count<=23 LOOP
v_sql:='';
v_date:=TRUNC(to_date('2011-07-23 00:00:00','yyyy-mm-dd hh24:mi:ss'),'hh24')+v_count/24;
v_date1:=to_char(v_date,'yyyymmddhh24');
v_date2:=to_char(v_date,'yyyy-mm-dd hh24');
v_sql:='ALTER TABLE CS_XXXX_ML ADD PARTITION P' ||v_date1 ||' VALUES LESS THAN (to_date('''||v_date2||':00:00'',''yyyy-mm-dd hh24:mi:ss'')) TABLESPACE tablespace_namexxxx;';
dbms_output.put_line(v_sql);
-- dbms_output.put_line(to_char(v_date,'yyyymmdd hh24:mi:ss'));
-- EXECUTE IMMEDIATE v_sql;
v_count:=v_count+1;
END LOOP;
END;
---交换空间
DECLARE
v_sql1 VARCHAR2(1000);
v_sql2 VARCHAR2(1000);
v_date1 VARCHAR2(20);
v_date2 VARCHAR2(20);
v_date DATE;
v_count NUMBER(3);
BEGIN
v_count:=1;
v_date1:=to_char(SYSDATE,'yyyymmddhh24');
v_date2:=to_char(SYSDATE,'yyyy-mm-dd hh24');
WHILE v_count<=23 LOOP
v_sql1:='';
v_sql2:='';
v_date:=TRUNC(to_date('2011-07-23 00:00:00','yyyy-mm-dd hh24:mi:ss'),'hh24')+v_count/24;
v_date1:=to_char(v_date,'yyyymmddhh24');
v_date2:=to_char(v_date,'yyyy-mm-dd hh24');
v_sql1:='alter table CS_XXXX exchange partition P' ||v_date1 ||' with table CS_XXXX_tmp INCLUDING INDEXES without VALIDATION UPDATE INDEXES ;';
dbms_output.put_line(v_sql1);
v_sql2:='alter table CS_XXXX_ml exchange partition P' ||v_date1 ||' with table CS_XXXX_tmp INCLUDING INDEXES without VALIDATION UPDATE INDEXES ;';
dbms_output.put_line(v_sql2);
-- dbms_output.put_line(to_char(v_date,'yyyymmdd hh24:mi:ss'));
-- EXECUTE IMMEDIATE v_sql;
v_count:=v_count+1;
END LOOP;