Bugra Canbakal's Oracle Blog

  • Home
  • Contact
  • SITE MAP
You are here: Home / Oracle / Oracle Table Redefinition

Oracle Table Redefinition

09:44 AM By Bugra Canbakal Leave a Comment

1.AMAÇ VE KAPSAM

Redefinition production ortamlarda veritabaninda kesinti yaratmadan tablo’nun storage parametrelerini degiştirmek,farkli bir tablespace taşimak veya yeni kolonlar eklemek,silmek ve degiştirmek için kullanilabilir.
Aşağıdaki çalışmamda bir tabloyu partition’li hale getirip 2009,2010,2011 yıllarına ayit partition’larını exadatanin özelliği olan “archive high” compress’liyecem,2012 yılının aylarınıda OLTP compress yapicam.Bu esnada veritabanı operasyonel olarak çalişmaya devam edicek.
Kisaca redefinition nasil çalıştığını anlatayım: yeni tablonuzu redefinitiona tanımladığınızda redef. bu tablonuzu materialized view çeviriyor ve datayı bu mv’un içine aktarıyor bu esnada orjinal tablonuzda da materialized view log olusturup tablonuza gelen insert,delete ve update işlemlerini kayit altina aliyor.

2.UYGULAMA

2.1. Tablonuz redefinition yapıp yapmamaya uygun olup olmadığımızı aşağıdaki sorgularla görebiliriz.

PK üstünden redefinition yapmak için.

Oracle PL/SQL
1
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MVS', 'ISLEM_LOG',1);

ROWNUM üstünden redefinition yapmak için.

Oracle PL/SQL
1
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MVS', 'ISLEM_LOG',2);

2.2. Tablonuz büyükse parallelliği açmanızı öneririm.

Oracle PL/SQL
1
2
SQL> alter session force parallel dml parallel 32;
SQL> alter session force parallel query parallel 32;

2.3.  Yeni tablomuzu orjinal tablodan farklı olarak partition ve compress özelliği ekleyerek oluşturuyoruz.

Oracle PL/SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
SQL> CREATE TABLE MVS.ISLEM_LOG_OLD
(
  LOG_ID               VARCHAR2(40 BYTE)        NOT NULL,
  LOG_YAPAN            VARCHAR2(40 BYTE),
  LOG_YAPILAN          VARCHAR2(40 BYTE),
  LOG_ISLEM_KATEGORI   VARCHAR2(25 BYTE),
  LOG_ISLEM            VARCHAR2(255 BYTE),
  LOG_ISLEM_SONUC      CHAR(1 BYTE),
  LOG_ACIKLAMA         VARCHAR2(1000 BYTE),
  LOG_SON_ISLEM_DAMGA  VARCHAR2(20 BYTE),
  LOG_IP               VARCHAR2(15 BYTE)
)
TABLESPACE AHBS_DATA_TS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOLOGGING
PARTITION BY RANGE (LOG_SON_ISLEM_DAMGA)
(  
  PARTITION ISLEMLOG_2009 VALUES LESS THAN ('20100101000000000')
    LOGGING
    COMPRESS FOR ARCHIVE HIGH  
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_2010 VALUES LESS THAN ('20110101000000000')
    LOGGING
    COMPRESS FOR  ARCHIVE HIGH
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_2011 VALUES LESS THAN ('20120101000000000')
    LOGGING
    COMPRESS FOR ARCHIVE HIGH
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201201 VALUES LESS THAN ('20120201000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201202 VALUES LESS THAN ('20120301000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201203 VALUES LESS THAN ('20120401000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201204 VALUES LESS THAN ('20120501000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201205 VALUES LESS THAN ('20120601000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201206 VALUES LESS THAN ('20120701000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
  PARTITION ISLEMLOG_201207 VALUES LESS THAN ('20120801000000000')
    LOGGING
    COMPRESS FOR OLTP
    TABLESPACE LOG_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
               ),  
)
COMPRESS FOR OLTP  
NOCACHE
NOPARALLEL
MONITORING;

2.4. Artık redefinition işlemine başlayabiliriz.Start_redef_table tanımları sırasıyla şu şekilde (‘schema_ismi’,’orjinal_tablo’,’yeni_tablo’,’orjinal_tablo_kolon1 yeni_tablo_kolon1,orjinal_tablo_kolon2 yeni_tablo_kolon2, …..) diye gitmekte.Bu işlem bittiğinde var olan datalar yeni tablonuza aktarılmış olacak,aktarılmamış olanlarda materilized view log da saklanıcaklar.Eğer tablonuzda Pk bulunmuyorsa ROWNUM üstünden redef işinizi tamamlamanız gerekir.

PK üstünden redefinition başlatmak için.

Oracle PL/SQL
1
SQL> exec dbms_redefinition.start_redef_table('MVS','ISLEM_LOG','ISLEM_LOG_OLD','LOG_ID LOG_ID, LOG_YAPAN LOG_YAPAN, LOG_YAPILAN LOG_YAPILAN,LOG_ISLEM_KATEGORI LOG_ISLEM_KATEGORI,LOG_ISLEM LOG_ISLEM,LOG_ISLEM_SONUC LOG_ISLEM_SONUC,LOG_ACIKLAMA LOG_ACIKLAMA,LOG_SON_ISLEM_DAMGA LOG_SON_ISLEM_DAMGA,LOG_IP LOG_IP');

ROWNUM üstünden redefinition başlatmak için.

Oracle PL/SQL
1
SQL> exec dbms_redefinition.start_redef_table('MVS','ISLEM_LOG','ISLEM_LOG_OLD','LOG_ID LOG_ID, LOG_YAPAN LOG_YAPAN, LOG_YAPILAN LOG_YAPILAN,LOG_ISLEM_KATEGORI LOG_ISLEM_KATEGORI,LOG_ISLEM LOG_ISLEM,LOG_ISLEM_SONUC LOG_ISLEM_SONUC,LOG_ACIKLAMA LOG_ACIKLAMA,LOG_SON_ISLEM_DAMGA LOG_SON_ISLEM_DAMGA,LOG_IP LOG_IP',2);

2.5. Data taşıma işlemini bitirdiğimize göre orjinal tablodaki index,trigger,cons. ve grant gibi özellikleride yeni tablomuza taşıyabiliriz.Bu işlemi aşağıdaki gibi yada manuel olarak yapabilirsiniz.

Oracle PL/SQL
1
2
3
4
5
6
SQL> DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('MVS','ISLEM_LOG','ISLEM_LOG_OLD',DBMS_REDEFINITION.CONS_ORIG_PARAMS,TRUE, TRUE, TRUE, FALSE, num_errors, TRUE);
END;
/

2.6. Redefinition işlemini uzun tutup bitirmemeniz gereken durumlar oluşabiliyor eğer aradaki süre çok açılırsa son adım olan finish_redef_table uzun sürebiliyor bu tarz durumlarda sync işlemini yapmanızda yarar var.

Oracle PL/SQL
1
2
3
4
SQL> BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MVS','ISLEM_LOG','ISLEM_LOG_OLD');
END;
/

2.7. Redef. işlemini artık bitirebiliriz. Bu komuttan sonra orjinal tablonuzla yeni tablonuz rename yapıp birbirlerinin yerine geçiceklerdir.

Oracle PL/SQL
1
2
3
4
SQL> BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('MVS','ISLEM_LOG','ISLEM_LOG_OLD');
END;
/

2.8. Redefinition işlemini iptal etmek için aşağıdaki komutu kullanabilirsiniz.

Oracle PL/SQL
1
SQL> exec DBMS_REDEFINITION.ABORT_REDEF_TABLE('MVS', 'ISLEM_LOG', 'ISLEM_LOG_OLD')

Share this:

  • LinkedIn
  • Twitter

Konuyla ilgili diğer yazılar

  • Vmware Redhat üstüne Oracle kurulumu
  • Virtual Indexes
  • SQLPLUS da search tab ve yukarı aşağı tuşlarının kullanıma açılması
  • Restore işleminde datafile pathlerinin yerinin değiştirilmesi
  • Oracle veritabanını başka bir alana taşıma

Filed Under: Oracle Tagged With: oracle, redefinition, table redefinition

Leave a Reply Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

About Me



Language:

  • English
  • Turkish

Categories

  • Oracle
    • RAC – Real Application Cluster
    • RMAN
    • Single Node
    • Standby – Dataguard
  • OS
    • Linux

Blogroll

  • Emre Baransel
  • Gökhan Atıl
  • H. Tonguc Yılmaz
  • Kamil Türkyılmaz
  • Tanel Poder
  • Turkce Oracle
  • Turkish Oracle User Group
  • Uwe Hesse
  • Zekeriya Beşiroğlu

Archives

  • April 2014
  • March 2014
  • August 2013
  • June 2013
  • March 2013
  • January 2013
  • December 2012
  • November 2012
  • July 2012
  • June 2012
  • May 2012
  • January 2012
  • November 2011
  • October 2011
  • August 2011
  • July 2011
  • June 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • June 2010
OCP
Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use.
To find out more, including how to control cookies, see here: Cookie Policy

[footer_backtotop]

Copyright © 2010-2014 Bugra Canbakal. All rights reserved.