Etiket arşivi: oracle 12c yeni özellikler

Oracle 12C Online Datafile Taşımak

Oracle 12C Online Datafile Taşımak

Bu makalede oracle 12C üzerinde online olarak(kesintisiz) datafile taşıması yapacağız,bu özellik sadece 12C veritabanı ile (gelen) kullanılabilen bir özellik, eski versiyonlarda(11G,10G,9i ..) çalışmayacaktır.Disk yetersizliği, diskin değişmesi, ASm’e migration gibi durumlarda datafileları move etmemiz gerekebilir.
Eski versiyonlarda nasıl taşınır bu konuya yazının sonunda kısaca değineceğim ama bunun için detaylı olarak makale yazmayı planlıyorum. Şimdi asıl konumuza dönelim, 12C’de online olarak datafile nasıl taşınır bakalım.

Kullanım amaçları;
– Datafile Rename
– ASM’den ASM’e taşıma
– ASM’den diske taşıma
– Diskten ASM’e taşıma

1. Diskten Diske Datafile Taşımak

Önce Datafilelarımızın lokasyonlarına bakalım.


SQL>Select name, STATUS  from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ ----------
/u01/12CDB/oradata/omertest/system01.dbf                    SYSTEM
/u01/12CDB/oradata/omertest/example01.dbf                   ONLINE
/u01/12CDB/oradata/omertest/sysaux01.dbf                    ONLINE
/u01/12CDB/oradata/omertest/undotbs01.dbf                   ONLINE
/u01/12CDB/oradata/omertest/test1.dbf                       ONLINE
/u01/12CDB/oradata/omertest/test2.dbf                       ONLINE
/u01/12CDB/oradata/omertest/users01.dbf                     ONLINE

7 rows selected.

Test1.dbf adlı datafile’ımızı aynı lokasyonda Rename edelim.(taşıyalım)


SQL> alter database move datafile
  2  '/u01/12CDB/oradata/omertest/test1.dbf '    
  3  to 
  4  '/u01/12CDB/oradata/omertest/omertest1.dbf ';

Database altered.

Datafileları tekrar kontrol edelim..


SQL>Select name, STATUS  from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ ----------
/u01/12CDB/oradata/omertest/system01.dbf                    SYSTEM
/u01/12CDB/oradata/omertest/example01.dbf                   ONLINE
/u01/12CDB/oradata/omertest/sysaux01.dbf                    ONLINE
/u01/12CDB/oradata/omertest/undotbs01.dbf                   ONLINE
/u01/12CDB/oradata/omertest/omertest1.dbf                   ONLINE
/u01/12CDB/oradata/omertest/test2.dbf                       ONLINE
/u01/12CDB/oradata/omertest/users01.dbf                     ONLINE

7 rows selected.

Ve işlem tamamdır, kesinti olmadan online olarak datafile’ı rename ve move edebildik.
Şimdi de ASM ve disk üzerindeki taşımalar için örnekler yapalım..

2. Diskten ASM’e Datafile Taşımak

Test için oluşturduğum iki datafile’ı local diskten +DATA üzerine taşıyalım..


SQL> alter database move datafile
  2  '/u01/12CDB/oradata/omertest/omertest1.dbf'
  3  to
  4  '+DATA/omertest/omertest1.dbf';

Database altered.

SQL> alter database move datafile
  2  '/u01/12CDB/oradata/omertest/test2.dbf'
  3  to 
  4  '+DATA/omertest/omertest2.dbf';

Database altered.

SQL> select name, STATUS  from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ ----------
/u01/12CDB/oradata/prod/system01.dbf                    SYSTEM
/u01/12CDB/oradata/prod/example01.dbf                   ONLINE
/u01/12CDB/oradata/prod/sysaux01.dbf                    ONLINE
/u01/12CDB/oradata/prod/undotbs01.dbf                   ONLINE
+DATA/omertest/omertest1.dbf                                 ONLINE
+DATA/omertest/omertest2.dbf                                 ONLINE
/u01/12CDB/oradata/omertest/users01.dbf                 ONLINE

7 rows selected.

3. ASM’den ASM’e Datafile Taşımak

Şimdi de test için oluşturduğum iki datafile’ı +RECO diskine taşıyalım..


SQL> alter database move datafile
  2  '+DATA/omertest/omertest1.dbf'
  3  to
  4  '+RECO/omertest/omertest1.dbf';

Database altered.

SQL> alter database move datafile
  2  '+DATA/omertest/omertest2.dbf'
  3  to 
  4  '+RECO/omertest/omertest2.dbf';

Database altered.

SQL> select name, STATUS  from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ ----------
/u01/12CDB/oradata/prod/system01.dbf                    SYSTEM
/u01/12CDB/oradata/prod/example01.dbf                   ONLINE
/u01/12CDB/oradata/prod/sysaux01.dbf                    ONLINE
/u01/12CDB/oradata/prod/undotbs01.dbf                   ONLINE
+RECO/omertest/omertest1.dbf                            ONLINE
+RECO/omertest/omertest2.dbf                            ONLINE
/u01/12CDB/oradata/omertest/users01.dbf                 ONLINE

7 rows selected.

4. ASM’den Diske Datafile Taşımak

ASM de bulunan test1 datafile’ı disk üzerine taşıyalım.


SQL> alter database move datafile
  2  '+DATA/omertest/omertest1.dbf'
  3  to
  4  '/u01/12CDB/oradata/omertestdata/omertest1.dbf';

Database altered.


SQL> select name, STATUS  from v$datafile;

NAME                                                         STATUS
------------------------------------------------------------ ----------
/u01/12CDB/oradata/prod/system01.dbf                    SYSTEM
/u01/12CDB/oradata/prod/example01.dbf                   ONLINE
/u01/12CDB/oradata/prod/sysaux01.dbf                    ONLINE
/u01/12CDB/oradata/prod/undotbs01.dbf                   ONLINE
/u01/12CDB/oradata/omertestdata/omertest1.dbf           ONLINE
+RECO/omertest/omertest2.dbf                            ONLINE
/u01/12CDB/oradata/omertest/users01.dbf                 ONLINE

7 rows selected.

Notlar:
*Online datafile taşıma oracle 12C ile gelen bir özelliktir, eski versiyonlarda bu özelliği kullanamayız.
*User datafilelartı taşıdığımız gibi system datafile’larını da taşıyabiliriz.
*Bu işlem yoğun kaynak kullanımı yapacağından günün sakin saatlerinde çalıştırmanız önerilir.
*Bu özellik için oracle’a çok teşekkürler 🙂

Oracle 12C öncesi datafile taşımak

12C öncesi datafile’ı kesintisiz taşımak mümkün değil minimum kesintiyle taşınabilir, bu durumda yapılması gereken işlemler kabaca aşağıdaki gibidir. Bu konuyu ayrıca bir makale olarak yazacağım, çünkü; system datafile’ları taşımak biraz daha farklı işlemler gerektiriyor ve instance’ı kapatıp açmanız gerekiyor..

Ama user datafile’lar 11G ve öncesi için aşağıdaki yöntemlerle taşınabilir..

– Seçenek 1
1.Tablespace’i offline yap.(alter tablespace x online)
2.Datafile’ı fiziksel olarak taşı ya da rename et(mv test1.dbf)
3.Controlfile’a datafile’ın yeni yerini bildir.(alter database rename file)
4.Tablespace’i online yap.(alter tablespace online)

-Seçenek 2
RMAN ile datafile’ın yeni kopyasına switch etmek.

Oracle 12C Invisible Column

Oracle 12C invisible column:

Invisible column Oracle 12C ile gelen yeni bir özelliktir.Bir kolonu tablo yaratırken gizli olarak belirtebiliyoruz, veya daha sonradan gizli olarak işaretleyebiliyoruz.Gizlenen kolon describe(desc),select * from table, işlemlerinde görünmeyecektir.Insert işleminde,select listesinde,where kısmında kolonu belirterek kolonu kullanabiliyoruz.Invisible kolon external table,cluster table ve temp table’da desteklenmiyor. Invisible kolon maaş vb önemli bilgilerin doğrudan görünmesini engellemek için faydalı olabilir.

Örnekler için tablo oluşturalım.

Kolonun yanına yazdığımız INVISIBLE keyword’le kolonun invisible olduğunu belirtiyoruz.

CREATE TABLE Calisanlar_Tab(emp_no number(6),
name varchar2(40),
salary number(9) INVISIBLE);

Tablomuzu desc yapalım.Invisible kolon görünmeyecektir.

DESC Calisanlar_Tab;

Name      Null?  Type
----------------------------------------- -------- ----------------------
emp_no           NUMBER
name             VARCHAR2(40)

Kolonu visible yapmak için;

ALTER TABLE Calisanlar_Tab MODIFY(salary VISIBLE);

Kolonu invisible yapmak için;

ALTER TABLE Calisanlar_Tab MODIFY(salary INVISIBLE);

Tablomuza veri girişi yapalım;

insert into Calisanlar_Tab values (1,'Berna Duru');
1 row created.

İnvisible kolona veri girişi yapalım.

insert into Calisanlar_Tab(emp_no,name,salary) values (1,'Berna Duru',1500);
1 row created.

Invisible kolonları görmek için;

SELECT TABLE_NAME,  COLUMN_NAME, HIDDEN_COLUMN
  FROM USER_TAB_COLS WHERE HIDDEN_COLUMN='YES';

View oluştururken invisible kolon oluşturmak isterseniz;

Create or replace view Calisanlar_vw(emp_no,salary INVISIBLE)
as select emp_no, salary from Calisanlar_Tab;
View created.

Tablodaki tüm kolonları invisible yapmak isterseniz, maalesef en az bir tane visible kolon olmasını istiyor ve aşağıdaki hatayı veriyor..

ERROR at line 1:
ORA-54039: table must have at least one column that is not invisible

Umarım faydalı olur.

 

Oracle 12C Identity kolon

Oracle 12C identity column:

Bu makalemizde oracle 12C ile gelen identity kolonunu inceleyeceğiz,12C öncesi versiyonlarda kolon için sequence veya trigger ile artan sıralı değerler üretiyorduk,12C versiyonu ile artık otomatik olarak kolon kendisini artırabilecek.Aslında biraz geç geldiğini düşünüyorum,diğer bir çok veritabanında olmasına rağmen oracle’da yoktu.(SQL server identity vb) Performansı trigger ve sequence’e göre daha iyi.
En çok da yazılımcıların işine yarayacak , trigger ve sequence’le uğraşmayacaklar..

12C’de tablo oluştururken kolonun identity kolon oldugunu belirtiyoruz, ve tablomuza insert ederken bir değer göndermemize gerek kalmıyor.

Örnek yapalım..

CREATE TABLE person_info_tab (
kisi_id NUMBER GENERATED ALWAYS AS IDENTITY,
ad VARCHAR2(50),
soyad VARCHAR2(50));

Tablomuzu oluşturduk, veri girişi yapalım.

INSERT INTO person_info_tab (isim,soyad)  VALUES ('Ali','AKÇAY');

kisi_id kolonuna veri girmedik select çekip sonuca bakalım.

SELECT * FROM person_info_tab;
kisi_id   ad     soyad
1         Ali    AKÇAY

Eğer identity kolonuna veri insert etmek isterseniz aşağıdaki hatayı alırsınız.

INSERT INTO person_info_tab (kisi_di,isim,soyad) VALUES (1,'Ali','AKÇAY');

Hata:ORA-32795: cannot insert into a generated always identity column

Identity kolonuna veri girişine izin verilmiyor,oracle otomatik kendisi artırıyor.

12C öncesi versiyonlarda Sequence ile id üretmek:

12C öncesi versiyonlarda nasıldı, nasıl çözüyorduk ? Onu da örnekleyelim..

Tablomuzu oluşturalım.

CREATE TABLE person_info_tab (
kisi_id NUMBER,
ad VARCHAR2(50),
soyad VARCHAR2(50) );

Sıra numarası üretecek sequence’i olusturalım.

CREATE SEQUENCE kisi_id_seq start with 1 increment by 1 nocycle;

Tablomuza veri girerken kisi_id kolonuna sequence’in değerini gönderelim.

INSERT INTO person_info_tab
(kisi_di,isim,soyad)
VALUES
(kisi_id_seq.nextval,'Ali','AKÇAY');

ya da trigger ile bu atamayı da yapabiliriz.Trigger her insertte sequenceden çekeceği son değeri tabloya insert edecektir.

CREATE OR REPLACE TRIGGER kisi_id_trg
BEFORE INSERT ON person_info_tab
FOR EACH ROW
BEGIN
SELECT kisi_id_seq.nextval INTO :new.kisi_id FROM dual;
END kisi_id_trg;

Umarım faydalı olur..

Sequence için daha detaylı bilgi:

http://omeracar.com.tr/sequence-nedir-nasil-kullanilir/

trigger için daha detaylı bilgi :

http://omeracar.com.tr/oracle-trigger-ve-ornekler/