21 Mayıs 2013 Salı

SQL KOMUTLAR


SQL KOMUTLAR
DISTINCT: Birbirinin ayni olan satırların listelenmemesi için bu ifade kullanılır
“select distinct uyeadi from uyeler”
BETWEEN: Kosul belirtirken iki deger arasini belirtmek için kullanilir. Örnek:
Yasi 30 ile 40 arasindaki isçilerin kayitlarini listelemek için
“select * from uyeler where yas between 30 and 40¨
LIKE: Eger aradigimiz kayitin bulunmasi için tam bir karsilastirma yapamiyorsak
“select * from uyeler where uyeadi like ’%a’”
IN: Kosul belirtirken kullaniriz. Mesela ismi netrobin, ali veya mehmet olan isçilerin
bilgilerini listelemek için.
“select * from uyeler where uyeadi in (’netrobin’,’ali’,’mehmet’ )”
SUM: Seçilen degerlerin toplamini bulur. Isçilerin aldigi toplam ücreti görmek için
“select sum(ucret ) from uyeler”
MAX, MIN, AVG: Verilen degerin en büyügünü, en küçügünü ve ortalamasini bulur.
MAX en büyük degeri, MIN en küçük degeri, AVG ise seçilen degerlerin ortalmasini bulur.
“select MAX(UCRET ), MIN(UCRET ), AVG(UCRET ) from uyeler where tarih>’01.01.1999’”
ORDER BY ASC: Tablodan seçtigimiz kayitlari alfabetik siralamak için kullanilir.
“select * from uyeler order by asc”
ORDER BY DESC: Tablodan seçtigimiz kayitlari son kayıt sırasına göre siralamak için kullanilir.
“select * from uyeler order by desc”
GROUP BY: Genelde istatistik amaçlar için kullanilir. Mesela hangi tarihte kaç isçinin ise
alindigini bulmak için.
ALIAS: Genelde tablonun veya kolonun adını başka bir şeymiş gibi değişirebiliriz.
Uyeler tablosundaki uyeadi kolonunun adını isim yaptık yani isim olarak çağırabiliriz.
“SELECT uyeadi AS isim FROM uyeler”
JOIN: Bazen iki yada daha fazla tablodan veri cekmemiz gerekebilir, bu gibi durumlarda bu
methodu kullanırız.
Birbiri ile ilişkilendirilmiş iki tablomuz var biri uyeler diğeride detaylar olsun.
İki tablodanda aynı anda sorgulama veya veri çekeceğiz. Uyeler tablosunda id=1 ise detaylar
tablosundaki karşılğı ise uyeno=1 olarak yapıyoruz.
“SELECT * FROM uyeler,detaylar WHERE uyeler.id=detaylar.uyeno”
INNER JOIN OLARAK
“SELECT * FROM uyeler INNER JOİN detaylar ON uyeler.id=detaylar.uyeno”
LEFT JOIN OLARAK
“SELECT * FROM uyeler LEFT JOİN detaylar ON uyeler.id=detaylar.uyeno”
UNION ve UNION ALL : Join methoduna benzer ama sadece aynı kolonlara sahip tabloları
birbirine bağlar. Uyeler ve Detylar tablosundaki uyeadlarını sorgular.
Select uyeadi from uyeler UNION Select uyeadi from detaylar”
Sadece UNION kullanırsak iki tabloa aynı isimler olsa bile tekrarlar.
UNION ALL kullanırsak iki tabloda aynı isimler olsa bile sadece tekini sorgular.
“Select uyeadi from uyeler UNION ALL Select uyeadi from detaylar”
SQL FONKSİYONLARI
sql kendi içinde bir cok fonksiyonu barındırır, bunlar sayım ve hesaplama için kullanılabilir.
Fonksiyon sözdizimi kuruluşu;
SELECT fonksiyon(kolon ) FROM tablo
Fonksiyon tipleri;
sql fonksiyonları birkaç temel tip ve kategoriye sahiptir. Temel fonksiyon tipleri:
++ Aggregate (birleşik degerli ) fonksiyonlar
++ Scalar (tekil degerli ) fonksiyonlar
Aggregate (birleşik degerli ) fonksiyonlar
Bu tip fonksiyonlar birçok deger ile çalışır ama sonucu tek bir degerdir.
Bu fonksiyonların MS Access e uygun olanları:
AVG(kolon ): girilen kolondaki sayıların aritmetik ortalama degerini geri yollar
COUNT(kolon ): Boş degerler haric, girilen kolondaki satır sayısını yollar
COUNT(* ): Verilen tablodaki satır sayısını yollar
FIRST(kolon ): girilen kolondaki ilk degeri yollar
LAST(kolon ): girilen kolondaki son degeri yollar
MAX(kolon ): girilen kolondaki en yuksek degeri yollar
MIN(kolon ): girilen kolondaki en dusuk degeri yollar
STDEV(kolon ): girilen kolondaki basit istatiksel standard sapma degerini yollar
STDEVP(kolon ): girilen kolondaki nüfus istatiksel standard sapma degerini yollar
SUM(kolon ): girilen kolondaki sayıların toplamını yollar
Bu fonksiyonların sql Server a uygun olanları:
AVG(kolon ): girilen kolondaki sayıların aritmetik ortalama degerini geri yollar
BINARY_CHECKSUM: tablonun verilen satırındaki ikilik tabandaki checksum degerini yollar
CHECKSUM: tablonun verilen satırındaki checksum degerini yollar
CHECKSUM_AGG: boş degerler haricindeki verilerin checksum degerini yollar
COUNT(kolon ): Boş degerler haric, girilen kolondaki satır sayısını yollar
COUNT(* ): Verilen tablodaki satır sayısını yollar
COUNT(DISTINCT kolon ): Verilen tablodaki satır sayısını yollar, fakat cift veri bulunan satırları bir defa sayar
FIRST(kolon ): girilen kolondaki ilk degeri yollar
LAST(kolon ): girilen kolondaki son degeri yollar
MAX(kolon ): girilen kolondaki en yuksek degeri yollar
MIN(kolon ): girilen kolondaki en dusuk degeri yollar
STDEV(kolon ): girilen kolondaki basit istatiksel standard sapma degerini yollar
STDEVP(kolon ): girilen kolondaki nüfus istatiksel standard sapma degerini yollar
SUM(kolon ): girilen kolondaki sayıların toplamını yollar
Scalar (tekil degerli ) fonksiyonlar
Girilen degere gore bir deger ile calısır ve sonuc olarak bir deger yollar.
Bu fonksiyonların MS Access e uygun olanları:
UCASE(c ): bolgedeki karakterlerin hepsini buyuk yapar
LCASE(c ): bolgedeki karakterlerin hepsini kucuk yapar
MID(c,start[,end] ): yazı alanından karakterleri calıstırır
INSTR(c ): yazı alanından karakterleri gosterir
LEFT(c,karakterNumarasi ): text alanının girilen sayıya kadar olan kısmını yollar (soldan sayar )
RIGHT(c,number_of_char ): text alanının girilen sayıya kadar olan kısmını yollar (sagdan sayar )
ROUND(c,hassasiyet ): sayı alanını verilen hassasiyete gore yuvarlar
MOD(x,y ): bolme işleminde kalanı gosterir (mod işlemi yapar )
NOW( ): o anki sistem zamanını gosterir
FORMAT(c,format ): alanın gosterim biçimini degiştirir
DATEDIFF(d,birinciTarih,ikinciTarih ): tarih hesaplarını yapmak için kullanılır

SQL ALTER TABLE KOMUTU


Bazen mevcut tablomuzda değişiklik yapmamız gerekir. Var olan tabloya bir alan eklemek, var olan alanın adını, tipi ,boyutunu vs. değiştirmek gibi. Bu tür tablo düzenleme işlemleri için SQL’in “ALTER” komutunu kullanıyoruz. Bu makalemizde,SQL Alter komutu ile yapabileceğimiz işlemleri tek tek inceleyeceğiz. Öncelikle örnek olarak kullanabileceğimiz bir tablo oluşturuyoruz.Tablomuzun adı Personel.

Create scripti:

CREATE TABLE Personel
(
Id int,
Adi vharchar(50),
Soyadi vharchar(50),
DogumTarihi DateTime
)

Tabloya yeni kolon eklemek:

Mevcut tablomuza yeni bir alan eklemek için kullanılan genel ifade:
Click here to find out more!
ALTER TABLE Tablo_adı
ADD Alan_adı Alan_türü
Örnek olarak Personel tablomuza Doğum yeri için bir alan açalım:
Alter Table Personel
Add DogumYeri vharchar(50)
Eklediğimiz alana ait özellikleri daha da özelleştirebiliriz. Mesela Cinsiyet adında, tipi bit olan bir alan ekleyelim, boş olamasın, ve default değeri False olsun
Alter Table Personel
Add Cinsiyet Bit Not Null Default ((0))

Tabloya birden çok kolon eklemek:

Mevcut tablomuza tek seferde birden çok alan eklemek için genel ifade:
ALTER TABLE Tablo_adı
ADD (Alan_adı1 Alan_türü1, Alan_adı2 Alan_türü2, …)
Örnek olarak Personel tablomuza Tc Kimlik numarası ve SSK numarası için bir alan açalım:
Alter Table Personel
Add ( TCKimlikNo int not null, SSKNo int null)

Tabloya Primary Key eklemek:

Mevcut tablomuza bulunan bir alanı primary key yapmak için kullanılan genel ifade:
ALTER TABLE Tablo_adı
ADD PRIMARY KEY (Alan_adı)
Örnek olarak Personel tablomuza bulunan Id alanını Primary key yapalım:
Alter Table Personel
Add Primary Key (Id)
Mevcut tablomuza yeni bir alan ekleyip, primary key yapmak için kullanılan genel ifade:
ALTER TABLE Tablo_adı
ADD Alan_adı Not Null PRIMARY KEY
Örnek olarak Personel tablomuza ID2 adında bir alan ekleyip, Primary key yapalım:
Alter Table Personel
Add ID2 int Not Null IDENTITY(1,1) Primary Key
Tablodaki alanın Primary Key özelliğini silmek: Mevcut tablomuza bulunan primary key alanın bu özelliğini kaldırmak için kullanılan genel ifade:
ALTER TABLE Tablo_adı DROP CONSTRAINT Alan_adı
Örnek olarak Personel tablomuza bulunan Id alanının Primary key özelliğini kaldıralım:
Alter Table Personel Drop Constraint Id

Tablodaki kolonun adını değiştirmek:

Mevcut tablomuzdaki bir alanın adını değiştirmek için kullanılan genel ifade:

Oracle için:

ALTER TABLE Tablo_adı
CHANGE alan_adı_eski to alan_adı_yeni
Örnek olarak Personel tablomuza eklediğimiz “TCKimlikNo” alanının adını TcNo yapalım:
Alter Table Personel Change TCKimlikNo to TcNo

MySql için:

ALTER TABLE Tablo_adı RENAME COLUMN alan_adı_eski to alan_adı_yeni
Örnek olarak Personel tablomuza eklediğimiz “TCKimlikNo” alanının adını TcNo yapalım:
Alter Table Personel Rename Column TCKimlikNo to TcNo

Sql server için:

EXEC sp_rename ' Tablo_adı.[alan_adı_eski]', alan_adı_yeni, 'COLUMN'
Örnek olarak Personel tablomuza eklediğimiz “TCKimlikNo” alanının adını TcNo yapalım:
EXEC sp_rename Personel.[TCKimlikNo], TcNo ,'COLUMN'

Tablodaki kolona ait bilgileri değiştirmek:

Mevcut tablomuzda var olan bir alanın bilgilerini değiştirmek için kullanılşan genel ifade:
ALTER TABLE Tablo_adı ALTER COLUMN alan_adı alan_türü
Örnek olarak Personel tablomuza yukarda eklediğimiz SSK numarasının tipini varchar olarak değiştirelim:
Click here to find out more!
Alter Table Personel Alter Column SSKNo Varchar(20)
Bu komutu kullanarak alana ait ‘Allow Null’, yani boş bırakma özelliğini de değiştirebilirz. Örnek olarak doldurulması zorunlu yaptığımız TCKimlik Numarası nullable yapalım:
Alter Table Personel Alter Column TcNo int null

Tablodaki bir kolonu silmek:

Mevcut tablomuzda var olan bir alanı silmek için kullanılan genel ifade:
ALTER TABLE Tablo_adı DROP COLUMN alan_adı
Örnek olarak Personel tablomuza yukarda eklediğimiz SSK numarası alanını silelim:
Alter Table Personel Drop Column SSKNo
Tablomuzda bulunan bir alanı sildiğimizde, o alandaki bütün datalar silinir. Eğer sildiğimiz alan composite primary key ise, hem o alan silinir hem de tabloda yinelenen kayıtlar silinir.

Tablodaki bir kolona index eklemek /indexi kaldırmak: Mevcut tablomuzda var olan bir alana index eklemek için kullanılan genel ifade:

ALTER TABLE Tablo_adı ADD INDEX Index_Adı (alan_adı)
Örnek olarak Personel tablomuzda bulunan ‘Adi’ alanını indexleyelim:
Alter Table Personel Add index Index1 (Adi)
Mevcut tablomuzda var olan bir indexi silmek için kullanılan genel ifade:
ALTER TABLE Tablo_adı DROP INDEX Index_Adı
Örnek olarak Personel tablomuzda bulunan ‘Adi’ alanının indexini silelim:
Alter Table Personel Drop index Index1
Tablodaki bir kolona Constraint eklemek / Constrainti kaldırmak:
Mevcut tablomuzda var olan bir alana Constraint eklemek için kullanılan genel ifade:
ALTER TABLE Tablo_adı ADD CONSTRAINT constraint_Adi UNIQUE (alan_adı)
Örnek olarak Personel tablomuzda bulunan ‘TCNo’ alanına Constraint ekleyelim:
Alter Table Personel Add constraint constraint1 Unique (TCNo)
Mevcut tablomuzda var olan bir Constraint i silmek için kullanılan genel ifade:
ALTER TABLE Tablo_adı DROP CONSTRAINT constraint_Adi
Örnek olarak Personel tablomuzda bulunan ‘TCNo’ alanının constraintini silelim:
Alter Table Personel Drop constraint constraint1

Tablonun adını değiştirmek:

Mevcut tablomuzun adını değiştirmek için kullanılan genel ifade:
ALTER TABLE Tablo_adı_eski RENAMA TO Tablo_adı_yeni

20 Mayıs 2013 Pazartesi

C# Excel Sayfa (Sheet) içeriği görüntüleme

Excel dosya içerigi görüntüleme programı



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.OleDb;
namespace Get_Excel_Sheet_Names
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ///


        /// For opening the dialog box to select the file
        ///

        ///
        ///
        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            DialogResult dlgResult = dlg.ShowDialog();
            if (dlgResult == DialogResult.OK)
            {
                txtPath.Text = dlg.FileName;
            }
            comboBox1.DataSource = GetSheetNames(txtPath.Text);
        }
        ///


        /// Here we are reading the sheet and loading the sheet name in ddl
        ///

        ///
        ///
        public static List GetSheetNames(string path)
        {
            List sheets = new List();
            string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", path);
            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
            DbConnection connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
            connection.Open();
            DataTable tbl = connection.GetSchema("Tables");
            connection.Close();
            foreach (DataRow row in tbl.Rows)
            {
                string sheetName = (string)row["TABLE_NAME"];
                if (sheetName.EndsWith("$"))
                {
                    sheetName = sheetName.Substring(0, sheetName.Length - 1);
                }
                sheets.Add(sheetName);
            }
            return sheets;
        }
        ///



        /// For loading the selected sheet data
        ///

        ///
        ///
        private void btnLoadData_Click_1(object sender, EventArgs e)
        {
            if (System.IO.File.Exists(txtPath.Text))
            {
                string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", txtPath.Text);
                string query = String.Format("select * from [{0}$]", comboBox1.SelectedItem);
                OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
                DataSet dataSet = new DataSet();
                dataAdapter.Fill(dataSet);
                dataGridView1.DataSource = dataSet.Tables[0];
            }
            else
            {
                MessageBox.Show("No File is Selected");
            }
        }
    }
}




Foreach döngüsü

Foreach döngüsü genellikle bir dizinin tüm elemanlarına erişmek için kullanılır.
Temel yapı aşağıdaki gibidir;



 foreach("değişken" in "dizi, string vb.")
 {
  //İşlemler
 }



------------------------
    int toplam = 0;
    int[] sayilar = new int[5];
    sayilar[0] = 5;
    sayilar[1] = 5;
    sayilar[2] = 5;
    sayilar[3] = 5;
    sayilar[4] = 5;

    foreach (int x in sayilar)

    {
     toplam += x;
    }

    MesageBox.Show("Toplam Sayı"+toplam);

------------------------
Diğer Örnek :
Foreach döngüsü sadece dizilerle kullanılacak diye bir kural yoktur, mesela bir string değişkenin içindeki harfleri teker teker alabiliriz.Mesela istediğiniz bir stringi yukarıdan aşağıya yazdıralım


string umut = "Umut Coşkun";

    foreach (char x in umut)

    {
     MesageBox.Show(x);
    }


Diğer Örnek :
          //Butona basıldıgı anda form üzerinde tüm butonların arkaplanlarını kırmızı listboxlarınkini kırmızı yapan kod

            foreach (Control nesne in this.Controls)

            {
                
                if (nesne is Button)
                 { nesne.BackColor = Color.AntiqueWhite;}
                if( nesne is listBox)
                { nesne.BackColor = Color.Red;}
            }

Diğer Örnek :
 //listbox içerisindeki seçili her bir ogeyi diğer listboxa eklenmesi 


private void button4_Click(object sender, EventArgs e)
        {
           
            string text = "";
            foreach (var item in listBox1.SelectedItems)
            {

                text += item.ToString();

            }
            listBox2.Items.Add(text);
            //textBox1.Item = text;
        }




C# Jump Deyimleri ( break, Continue, goto, Jump deyimleri, )



Jump Deyimleri

Döngüler ve karar deyimleri görevlerini yerine getirirken, bazen çikis yapmaya gereksinim duyulur. C#'da goto, break ve continue deyimleri atlama deyimleri olarak bilinir.

Goto deyimi program içinde belirtilen bir etikete atlamayi saglar. Ancak yapisal programlama açisinda kullanimi önerilmez.

Örnek:
 ..
 atla:
 ..
 goto atla;

Break ve continue deyimi

Break En yakin bloktan çikisi saglar. Continue deyimi ise yeni bir döngüye baslar.

int sayac = 1;

while (true) {

            Console.WriteLine(sayac);

            sayac++;

            if (sayac <= 10)

                        continue;

            else

                        break;

}

Flashback


select * from tmp_veri as of timestamp sysdate-2/1440 where batchno=1000 and seqno=0

Oracle 11g Recovery Manager (Rman) Teknolojisi


Oracle 11g Recovery Manager (Rman) Teknolojisi 

Oracle Recovery Manager(RMAN) teknolojisi, veritabanının gerek bütünsel gerekse tablespace bazlı olarak yedeğinin alınması ve felaket anında yedekten belirli zaman dilimine yada SCN numarasına dönülmesi şeklinde özetlenebilir.  Oracle 11g veritabanı sürümü ile RMAN teknolojisine pek çok yenilik eklenmiştir. Data Recover Tavsiyecisi(Advisor), muhtemel oluşabilecek hataları analiz etme ve en azından bir tane tamir seçeneğini sunması ile oluşabilecek herhangi bir uygulama hatasından once problemleri teşhis eder ve böylece veritabanının kesintisiz çalışması ve bütünlüğünün bozulmaması için üst düzey bir koruma saplar. Bu amaçla ise RMAN’ın list failure, change failure, advise failure ve repair failure gibi Oracle 11g ile yeni gelen tamir komutları kullanılır.  RMAN, flashback alanı dolu olduğu takdirde arşivlenlenmiş redo günlüklerini kullanır. Duplicate komutu ile de kopya veritabanı veya fiziksel standby veritabanı, yedek dosyalarına gerek kalmaksızın oluşturulabilir.
RMAN teknolojisi, üretim veritabanında yedekleme esnasında performans kaybının olmaması amacıyla recovery katalog metodunu kullanır. RMAN işlemleri sırasında kullanılmak üzere başka bir sunucu üzerinde(veya aynı sunucuda) oluşturulan bir veritabanı, recovery katalog rolüne sahip olur.  RMAN recovery kataloğu, recovery verisini, kendi ayarlarını ve hedef veritabanı şemasını içermektedir. Hedef veritabanının kontrol dosyası bu veriyi, scriptleri saklamak, hedef veritabanı kontrol dosyasının kopyasını sağlayabilmek amacıyla kullanır ve bu sebeple RMAN işlemlerinde recovery kataloğu kullanmak tavsiye edilir.
RMAN Teknolojisinin Geleneksel Yedekleme Teknolojileri Karşı Avantajları
  • ·         Kullanılmayan blokların atlanması: Bir tabloda daha onceden yazılı olmayan bloklar (High Water Mark(HWM) üstünde kalan bloklar gibi) yedeklenmez. Geleneksel yedeklemede hangi bloğun kullanıldığı bilinmediğinden bu atlama işi olamaz.
  • ·         Yedeğin sıkıştırılması(Compression): Oracle’a özgü binary sıkıştırma metodu kullanarak, Oracle data blokları üzerinde bulunan farklı veri tipleri için maksimum sıkıştırma yapılarak backup cihazı üzerinde boş alan ayrılabilir. (“RMAN> configure device type disk backup type to compressed backupset” komutu ile aktive edilir)
  • ·         Veritabanı yedeklerini açma: alter tablespace …. begin/end backup cümleleri kullanmaya gerek kalmadan tablespace yedeklemesi kolayca yapılabilir.
  • ·         Gerçek artalan(incremental) yedekleme: Geri kurtarma esnasındaki süreyi kısaltmak için en son yedekten sonraki değişmeyen yedekler yedek setine yazılmaz. Böylece, CPU süresi, I/O süresi ve disk alanında performans sağlanır. RMAN, geri yükleme ve kurtarma işlemlerinde artalan güncelli yedekleri kullanır.
  • ·         Blok seviyesinde geri kurtarma: Downtime süresini düşürmek için Oracle blok seviyesinde geri kurtarmayı destekler. Bir tablespace, sadece bozulmuş blokların onarma işlemi seviyesinde kapalı kalmaz.
  • ·         Çoklu I/O kanalları: Yedekleme ve geri kurtarma işlemlerinde Oracle birden fazla I/O kanalları açabilir, böylece disk üzerindeki işlemler hızlanmış olur. (“RMAN> configure device type disk parallelism backup type backupset” komutu ile aktive edilir)
  • ·         Platform bağımsız: RMAN her türlü donanım ve işletim sistemi üzerinde aynı komutlarla kullanılır.
  • ·         Kataloglama: Tüm RMAN kayıtları hedef bir veritabanı kontrol dosyası içinde kayıt edilir. Manuel takibe gore avantaj sağlar.
  • ·         Şifreli Yedekleme: Oracle 11g sürümü ile yedekleri şifreli olarak saklama imkanı vardır.
Ambar Veritabanının Oluşturulması
Ambar veritabanı olarak RMAN yedeklerinin tutulacağı bir veritabanı oluşturulmalıdır. Bu veritabanı recovery kataloğu olarak kullanılacaktır. Şimdi sırasıyla recovery catalog oluşturma işlemine başlayalım.
  1. 1.       Recovery Catalog olarak kullanılacak hedef veritabanına bağlanılır. Örneğimizde ambar veritabanının ORACLE SID’si “katalog” şeklindedir. Üretim veritabanımızın SID’si ise “orcl” dir.

$  sqlplus sys/***@katalog as sysdba

  1. 2.       Ardından RMAN tablespace içindeki recovery katalog ve RMAN kullanıcısı oluşturulur. Ardından bu RMAN kullanıcısına haklar verilir.

SQL> create tablespace rman datafile ‘/u01/app/oracle/oradata/katalog/rman01.dbf’
         size 125m autoextend on next 50m maxsize 500m;
SQL> create user rman identified by ****
          default tablespace rman
          quota unlimited on rman;
SQL> grant recovery_catalog_owner to rman;

  1. 3.       Artık ambar veritabanında RMAN kullanıcı yer almaktadır. RMAN’I çalıştırıp kataloğa bağlanabilir ve create catalogkomutu ile ambarı tanımlayabiliriz.

$ rman catalog rman/rman@katalog
RMAN> create catalog;

  1. 4.       Şimdi “orcl” adlı üretim veritabanımızı, RMAN ambarındaki “katalog” adlı hedef veritabanına kayıt etmemiz gerekecek. Bu işlem hedef veritabanı şeması ve hedef veritabanı tekil kimlik numarası(DBID) gibi bilgileri kayıt etmeye yarar. Hedef veritabanı bir sefer kayıt edilmelidir, takip eden tüm RMAN oturumu bağlantılarında, artık ambardaki doğru metadata referans olarak kullanılacaktır.

$ rman target sys/***@orcl catalog rman@katalog
RMAN> register database;

Full Yedekleme İşlemi

Örneğimizde flashback recovery alanına tüm veritabanı dosyalarının ve SPFILE’ın backupsetlerini kullanacağız.Compressed seçeneği opsiyoneldir ve yedeği sıkıştırarak almaya yarar.

RMAN> backup as [compressed] backupset database spfile;

Yedeklerin hedef veritabanı kontrol dosyası ve RMAN ambarı içinde kataloglandığını görmek için list komutunu kullanabiliriz.

RMAN> list backup by backup;

Sadece tablespace’lerin yedeğini almak için ise;

RMAN> backup as backupset tablespace ;

Sadece data dosyalarını yedeklemek içi ise;

RMAN> backup as backupset datafile ‘’;

Sadece kontrol dosyası ve SPFILE yedeklemek için;

RMAN> backup current controlfile spfile;

Artalan(Incremental) Yedekleme İşlemi

Artalan yedeklemenin en büyük avantajı geri yükleme esnasında zaman kaybının azalması şeklinde özetlenebilir. En son alınan yedek sonrasında, değişen blok içindeki veriler yedeklenir. İki tür artalan yedekleme vardır.
  • ·         Level 0: Bu seviyedeki artalan(incremental) yedeklemede, yedek en son full yedek sonrasından alınır
  • ·         Level 1: Bu seviyedeki artalan(differential) yedeklemede, yedek en son alınan incremental(Level 0) yedekten, aksi takdirde en son full yedek sonrasından alınır.
Yedekleme için saklama aralığı(retention period) olarak tanımlanan zamandan ilerde arşivlenmiş yedeği bulunmayan data dosyalarını listelemek için aşağıdaki komutu çalıştırmak yeterlidir;
                 RMAN> report need backup;
Eğer bu rapor sonucu herhangi bir yada daha fazla data dosyası listelenirse, bunların incremental yedeğini almak için aşağıdaki komut çalıştırılır;
                 RMAN> backup incremental level 0 database;

Artalan Yedeklerde Blok Değişikliğinin İzlenmesi

Artalan yedeklerde en büyük sorun, çok büyük veritabanlarında en son yedek sonrasında hangi blokların değiştiğini hesaplamasında yaşanan zaman ve performans kaybıdır. Oracle bunun önüne geçmek için değişiklik izleme numarası ile hangi blokların değişikliğe uğradığını kolayca izler ve artalan yedeklemede bu izleme numaralarını kullanarak zaman kaybının önüne geçilir. Blok değişikliği izlemesinin veritabanında etkinleştirilmesi için aşağıdaki SQL cümlesi çalıştırılmalıdır.

                 SQL> alter database enable block change tracking
                           using  file ‘+DATA’;

Yedeklerin geçerliliğinin gözden geçirilmesi ve tasdik edilmesi

Yedek alınan dosyaların zaman içinde bozulup bozulmadığını gözlemlemek için backup validate database [archivelog all]komutu kullanılır. Archivelog all takısı, arşivlenmiş redo log dosyalarınında sağlamlığını test eder. Geri yükleme esnasında bu komut checkup amaçlı kullanılmalıdır.

Geri Kurtarma(Recovery) İşlemleri

RMAN ile blokları, veri dosyalarını, tablespaceleri ve hatta tüm veritabanını dahi geri kurtarabiliriz.

  • ·         Blok Media Recovery: Bir veya birden fazla data bloğunu kurtarabilmek için RMAN, veri dosyası içinden veri dosyası numarası ve blok numarasını bilmek zorundadır. insert veya select durumlarında dahi bozuk bloklar tespit edilebilir. V$DATABASE_BLOCK_CORRUPTION görünümünede sorgu çekilirse veritabanındaki bozuk bloklar adresleri ile listelenir. Aşağıda örnek bir hata mesajı yer almaktadır.

                      ORA-01578: ORACLE data block corrupted (file # 8, block # 374)
                      ORA-01110: data file 6: ‘/u01/app/oracle/oradata/orcl/deneme02.dbf’
Bu bozuk bloğu kurtarmak için aşağıdaki komutu çalıştırmak yeterli olacaktır.

                                  RMAN> recover datafile 8 block 374;
  • ·         Kontrol dosyasını geri kurtarma: Kontrol dosyasının kopyalarından birisi kaybolduğunda veya bozulduğunda ise aşağıdaki işlemler uygulanmalıdır. Aşağıdaki örnekte “katalog” adlı ambar veritabanımızı kullanmaktayız.

                                  SQL> startup mount;
                                   ……
                                  RMAN> restore controlfile;
  • ·         Tablespace geri kurtarma: Eğer bir tablespace’e ait veri dosyalarını içeren fiziksel disk bozulursa, veritabanının çalışmasını kesintiye uğratmadan bu tablespace’in geri kurtarma işlemini yapabiliriz.

                  RMAN> sql ‘alter tablespace offline immediate;
                  RMAN> restore tablespace ;
                  RMAN> recover tablespace ;
                  RMAN> sql ‘alter tablespace online;
  • ·         Veri dosyasını geri kurtarma: V$DATAFILE_HEADER sorgusunu kullanarak belirlenen kayıp yada bozuk veri dosyaları bu dosyanın ait olduğu tablespace ONLINE durumda iken bile geri kurtarılır.             

                RMAN> restore datafile  ;
                RMAN> recover datafile  ;
  • ·         Tüm veritabanını geri kurtarma: Tüm veritabanının geri kurtarılması durumunda aşağıdaki adımlar uygulanır.

                RMAN> startup mount;
                RMAN> restore database;
                RMAN> recover database;
                RMAN> alter database open;
  • ·         Zaman bazlı geri kurtarma:  Bu metotta veritabanında sorun meydana gelmeden önceki zaman dilimine veya SCN numarasına geri yükleme ve kurtarma işlemidir. Oracle 11g sürümü ile RMAN içinden list failure komutu ile veritabanında oluşan bir hata listelenir, böylece uyarı günlükleri veya izleme günlüklerinden potansiyel hata aramak zahmetinden kurtulunur. advise failure komutu ilede listelenen potansiyel hataya ne önlem alınacağının tavsiye raporudur ve veritabanı yöneticisine sadece Oracle 11g Veri Kurtarma Tavsiyecisinin oluşturduğu otomatik tamir scriptlerini çalıştırmak kalır

                RMAN> list failure;
                RMAN> advise failure; 
                RMAN> repair failure;          
  • ·         Arşiv redo günlük dosyalarını kullanarak geri kurtarma: Belirli bir zaman dilimine geri dönme ihtiyacı olduğunda Flashback Database özelliğinin yanısıra kayıtlı mevcut arşivlenmiş redo günlük dosyalarıda kullanılabilir.