Exchange Partition Hatası ORA-14097 ve Çözümü

Veri Ambarı (DWH) işlerinde son tablolar genelde Exchange Partition ile dolar. Eğer kod Exchange Partition adımında hata alıyorsa, genelde sorun data’dadır veya metadata’da farklılık vardır. Data kaynaklı sorunu daha önce BURADA paylaşmıştım. Bu başlıkta Metadata kaynaklı sorunu paylaşacağım. Hatta burada birden fazla olasılık var. Ben önce sütun veri tipi kaynaklı olanı, sonra drop column kaynaklı olan durumu paylaşacağım.

Öncelikle hatayı simüle etmek için kendim BU LINK‘teki kodları çalıştırıp, tbl_customer_hist ve tbl_customer_hist_exc tablolarını dummy data ile ürettim. Exchange olacak ara tabloya Sütun Tabloyu elimden geldiğince kapsamlı yaptım çünkü farklı konuları aktarmak için de bu tabloları kullanacağım.

BU LINK‘teki test kodlarını sırayla çalıştırınca en alttaki kodda şu hata ile karşılaşacaksınız:

ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

Vaka 1 için Çözüm: Bu hata ile karşılaşınca ilk yapılması gereken şey, sırayla ile iki tablonun yani ana tablonun, exchange olacak ara tablonun sütunlarının adedinin aynı olup olmadığını kontrol etmektir. Fark var ise, ilgili eksik sütunlar, tabloya eklenmelidir. Aynı ise sütunların sırası ID alana göre aynı mı buna bakmak gerekir. Sırası farklı ise, ara tablo tekrar ana tablo gibi oluşturulmalıdır. Diğer olasılık veri tipinin farklı olması durumudur. Ben bu başlıkta bu durumu simüle ettim.

Yukarda 2 tablonun sütun sayısının, sırasının ve veri tipinin sırasının kontrol edilmesinden bahsetmiştim. Aşağıdaki görselde sütun sayısı az olduğu için bu işlemi gözle yapacağım:

Sütun adedi, veri tipine göre gözle kontrol edilir

Sütun adedinin çok olması durumu için, minus ve ters minus’lı bir kod yazdım. Kodda dba_tab_columns a select atıyorum. İlgini koda BURAYA tıklayarak ulaşabilirsiniz.

Eğer veri tipi aynı, hassasiyeti farklı ise, küçük büyük olana denk hale getirilir.

ALTER TABLE tbl_customer_hist MODIFY c_name varchar2(22 CHAR);

ALTER TABLE tbl_customer_hist
  EXCHANGE PARTITION FOR (TO_DATE('20220201','YYYYMMDD'))
  WITH TABLE tbl_customer_hist_exc;
--Table altered

Vaka 2: Eğer sütun adedi, sırası, veri tipleri aynı ise ve hala exchange partition adımında hata alınıyor ise, sorun tablolardan birinde add column+ drop column yapılmış olması olabilir. Exadata konfigürasyonunda, sütun drop olunca, sütun unused olarak işaretleniyor. Drop olmuyor.

ALTER TABLE tbl_customer_hist_exc ADD dummy_sutun NUMBER;
ALTER TABLE tbl_customer_hist_exc drop COLUMN dummy_sutun;
--add+drop column yapılıyor. Dıştan görüntü aynı gibi gözükse de exchange'de hata alıyor.

ALTER TABLE tbl_customer_hist
  EXCHANGE PARTITION FOR (TO_DATE('20220201','YYYYMMDD'))
  WITH TABLE tbl_customer_hist_exc;
--ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

Aşağıdaki şekilde kontrol edebilirsiniz:

SELECT * 
  FROM dba_unused_col_tabs 
 WHERE 1=1 AND table_name IN ( 'TBL_CUSTOMER_HIST','TBL_CUSTOMER_HIST_EXC');
dba_unused_col_tabs sorgu sonucu

Vaka 2 Çözüm: Eğer sorun ara tabloda ise, tablo drop create yapılabilir ( eğer 2 tabloda daha evvelden, add+drop column yapılmadı ise). Veya DROP UNUSED COLUMNS ile drop olmuş sütunlar komple drop edilmiş olur.

ALTER TABLE tbl_customer_hist_exc NOCOMPRESS;
ALTER TABLE tbl_customer_hist_exc DROP UNUSED COLUMNS;
ALTER TABLE tbl_customer_hist_exc MOVE PARALLEL 4 NOLOGGING;

ALTER TABLE tbl_customer_hist
  EXCHANGE PARTITION FOR (TO_DATE('20220201','YYYYMMDD'))
  WITH TABLE tbl_customer_hist_exc;
--Table altered  

Kodların tamamına BURAYA TIKLAYARAK ulaşabilirsiniz.

Leave a Reply