BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > MySQL Veritabanı > Yedekleme (Backup)

Yedekleme (Backup)

Sistem veya donanım ile ilgili bir sorun yaşadığınızda veya verilerin yanlışlıkla silindiği durumlarda verileri yeniden yüklemek amacıyla, veritabanlarını önceden yedeklemek çok önemli bir işlemdir. Ayrıca, MySQL sürümlerini güncellerken veya başka bir sisteme aktarırken karşılaşacağınız sorunları gidermek için yedekleme dosyalarını kullanabilirsiniz.

Yedekleme ve kurtarma türleri

1. Fiziksel (Direk) ve mantıksal yedekleme

Fiziksel yedekleme veritabanı içeriklerinin yer aldığı dizin ve dosyaları direk olarak kopyalar. Bu yedekleme türü, bir problem meydana geldiğinde, boyutu yüksek ve önemli veritabanlarının hızlı bir şekilde geri yüklenmesi gerektiğinde kullanılır.

Mantıksal yedekleme, mantıksal veritabanı yapısını (CREATE DATABASE, CREATE TABLE komutları ile oluşturulan) ve içeriğini (INSERT komutu ile oluşturulan) belirleyen bilgiyi kaydeder. Bu yedekleme türü, boyutu küçük verilerin yer aldığı veritabanlarında kullanılması daha uygundur.

Fiziksel yedekleme yönteminin temel özellikleri:

* Fiziksel yedekleme veritabanının bulunduğu dizin ve dosyaların birebir kopyasını içerir. MySQL veri dizininin tamamını veya bir kısmının bir kopyasıdır.

* Fiziksel yedekleme yöntemleri direk kopyalama dışında herhangi bir işlem gerektirmediğinden mantıksal yedekelemeye göre daha hızlı çalışırlar.

* Elde edilen çıktı mantıksal yedeklemeden ile edilenden daha basittir.

* Yedekleme ve yeniden yüklemede işlem gören içerik veri dizininin tamamından tek dosya seviyesine kadar farklılık gösterebilir. InnoDB tabloların her biri farklı tek bir dosyada yer alırken, her bir MyISAM tablosu tek başına bir dizi dosyadan oluşur.

* Veritabanlarına ek olarak, yedekleme kütük veya konfigürasyon gibi dosyaları da içerebilir.

* MEMORY tablolarının içeriği disk üzerinde yer almadığından bu tablolarda yer alan veriler yedeklenemez.

* Yedekleme aynı veya benzer özelliklerde donanım içeren bilgisayarlara aktarılabilir.

* Yedekleme MySQL Sunucu çalışmıyorken yapılmalıdır. Eğer sunucu çalışıyorsa, sunucunun yedekleme esnasında veritabanını değiştirmemesi için gerekli kilitleme işlemleri yapılmalıdır.

Yedeklenen verileri yüklemek için:

* MySQL Enterprise Backup programı yedeklenen InnoDB ve diğer tabloları yeniden yükler.

* ndb_restore programı yedeklenen NDB tabloları yeniden yükler.

* Sistem veya mysqlhotcopy programı yoluyla kopyalanan dosyalar sistem komutları orjinal yerlerine kopyalanır.

Mantıksal yedekleme yönteminin temel özellikleri:

* Yedekleme işlemi MySQL Sunucu'dan veritabanı yapısı ve içeriği alınarak yapılır.

* Sunucunun veritabanı bilgisine erişimi ve eriştiği bilgiyi mantıksal formata çevirmesi gerektiğinden fiziksel yöntemden daha yavaştır.

* Özellikle metin formatında kaydedildiğinde, çıktı fiziksel yedeklemeden daha büyüktür.

* Kullanılan depolama motorundan bağımsız olarak, yedekleme ve yeniden yüklemede işlem gören içerik sunucu seviyesinde (tüm veritabanları), veri tabanı seviyesinde (bir veritabanındaki yer alan tüm tablolar) veya tablo seviyesinde olabilir.

* Yedekleme işlemi kütük veya konfigürasyon dosyaları ile veritabanının bir parçası olmayan ancak veritabanı ile ilgili dosyaları da içermez.

* Mantıksal yedekleme donanım yapısına bağlı olmaksızın bir bilgisayardan diğerine aktarılabilir.

* Mantıksal yedekleme MySQL Sunucu çalışırken yapılabilir.

* Mantıksal yedekleme için mysqldump programı ve SELECT ... INTO OUTFILE komutu kullanılır. Bu yöntemler MEMORY dahil olmak üzere tüm depolama motorları ile kullanılabilir.

* SQL formatındaki mantıksal yedeklemeleri geri yüklemek için, mysql programı, metin dosyalarını yüklemek için ise LOAD DATA INFILE komutu veya mysqlimport programı kullanılır.

2. Online ve offline yedekleme

Online yedekleme MySQL Sunucu çalışırken gerçekleştirildiğinden veritabanı bligisi direk molarak sunucudan alınır. Offline yedekleme ise sunucu çalışmayı durdurduğunda yapılır.

Online yedekleme yönteminin temel özellikleri:

* Yedekleme esnasında sunucu ile işlem yapan diğer kullanıcıların işlemlerini fazla etkilemez.

* Yedeklemenin bütünlüğünü riske atabilecek veri değişikliklerini engellemek için uygun kilitleme işlemleri yapılmasını gerektirir.

Offline yedekleme yönteminin temel özellikleri:

* Yedekleme esnasında sunucu dever dışı kalacağından, sunucuyu kullanan diğer programların işlemleri aksar. Bu nedenle, bu tür yedekleme işlemleri esas sunucunun bir yedeği olarak çalışan bir sunucudan yapılmalıdır.

* Diğer kullanıcılar herhangi bir işlem yapamayacağından, yedekleme işlemi daha basittir.

Yedeklenen verilerin geri yüklenmesi esnasında, eğer online yöntem tercih edilirse, sunucudaki verilerin üzerine yazılacağından, veri okuma yetkisi dahil olmak üzere, diğer kullanıcıların yetkileri işlem süresince kilitleme yöntemiyle sınırlanmalıdır.

3. Lokal ve uzaktan yedekleme

Lokal yedekleme MySQL Sunucu'nun çalıştığı host ile aynı yerde, uzaktan yedekleme ise farklı bir host üzerinden yapılır. Bazı yedekleme türleri için, elde edilen çıktı lokal host üzerinde çalışan sunucuya yazılsa bile, yedekleme uzaktaki bir host üzerinde çalıştırılır.

* mysqldump programı lokal veya uzak sunuculara bağlanabilir. SQL çıktısı (CREATE ve INSERT komutları) için, lokal veya uzak aktarma yapılabilir ve çıktılar çalışan program tarafından elde edilir. Metin çıktısı (--tab seçeneği ile), veri dosyaları sunucuyu host eden sistemde oluşturulur.

* mysqlhotcopy programı sadece lokal yedekleme yapabilir: Veri değişikliklerine karşı kilitleme yapmak için sunucuya bağlanır ve lokal tablo dosyalarını kopyalar.

* SELECT ... INTO OUTFILE komutu lokal veya uzak host üzerinde çalıştırılablir, ancak çıktı dosyası sunucu host üzerinde oluşturulur.

* Kopyalanan dosyalar uzak host'a gönderilse bile, sunucu offline konuma getirileceğinden, fiziksel yedekleme MySQL Sunucu üzerinde başlatılır.

4. Tam (Full) ve artımlı (Incremental) yedekleme

Tam yedekleme herhangi bir zamanda MySQL Sunucu tarafından kontrol edilen tüm verileri içerir. Artımlı yedekleme ise herhangi bir zaman diliminde verilere yapılan değişiklikleri içerir. MySQL'de tam yedekleme daha önce açıklanan farklı yöntemlerle yapılablir. Artımlı yedekleme ise suncunun veri değişikliklerini kaydetmek için kullandığı ikili sistem kütük dosyasını kullanarak yapılabilir.

5. Tam (Full) ve artımlı (Incremental) yükleme

Tam yüklemede tam yedeklemede yer alan tüm veriler yeniden yüklenir. Bu yükleme sunucuyu yedekleme yapıldığı andaki durumuna geri döndürür. Eğer bu durum son değişiklikleri içermiyorsa, sunucuyu güncelleştirmek için tam yüklemenin peşinden artımlı bir yükleme işlemi gerçekleştilir.

Artımlı yükleme verilen zaman aralığında yapılan değişiklikleri geri yükler. Sunucuyu verilen bir zamana göre güncellediğinden, bu işleme zamana göre yükleme adı verilir. Zamana göre yükleme ikili sistem kütüğüne göre işlem yapar ve tam bir yüklemenin peşinden gerçekleştirilir. İkili sistem kütüğüne yazılan veri değişiklikleri, veri değişikliklerini yeniden gerçekleştirmek ve sunucuyu zaman içinde istenen duruma getirmek için, artımlı yükleme olarak uygulanır

Veritabanı yedekleme yöntemleri

1. Tablo dosyalarını kopyalayarak yedekleme

Her tablo için tabloya ait dosyalar kullanan depolama motorları için, tablo dosyaları kopyalanarak yedekleme işlemi yapılır. Örneğin, My-ISAM tabloları dosyalar halinde depolandığından, *.frm, *.MYD ve *.MYI uzantılı dosyalar kopyalanarak yedekleme işlemi kolayca yapılabilir. Güvenilir bir yedekleme için, sunucuyu devre dışı bıraktıktan veya dosyaları kilitledikten sonra FLUSH işlemi uygulayın:

FLUSH TABLES tbl_list WITH READ LOCK;

Sadece okuma için kilitleme yapmanız yeterlidir. Bu durumda, siz veritabanı dizininde yer alan dosyaları kopyalarken diğer kullanıcıların bu dosyaları kullanmalarını sağlar. Flsuh işlemi yedeklemeden önce tüm aktif indeks sayfalarının diske yazılmalarını sağlar.

Aynı zamanda, sunucu bir güncellleme yapmadığı sürece, tüm tablo dosyalarnı kopyalayarak, ikili sistem yedekleme oluşturabilirsiniz. mysqlhotcopy programı bu yöntemi kullanır. Ancak, tablo dosyalarını kopyalama yöntemi veritabanı InnoDB tabloları içerdiğinde çalışmaz. InnoDB tablo içeriğini veritabanı dizinine kaydetmediğinden, mysqlhotcopy programı InnoDB tablolarına işlem yapmaz. Aynı zamanda, sunucu aktif bir şekilde güncellemese bile, InnoDB bellekte yer alan veriyi değiştirir ve tüm bu değişiklikleri diske aktarmaz.

2. Metin dosyaları şeklinde yedekleme

Tablo verilerini içeren bir metin dosyası oluşturmak için aşağıdaki komutu kullanabilirsiniz:

SELECT * INTO OUTFILE 'dosya_adı' FROM tablo_adı

Dosya MySQL Sunucu host (client host değil) üzerinde oluşturulur. Bu komut için, çıktı dosyası mevcut olamaz, çünkü dosyaların üzerine yazılmasına izin vermek güvenlik sorunu oluşturabilir.

Bu yöntem tablonun yapısını değil sadece içerdiği veriyi kaydeder.

Metin yapısında veri dosyaları oluşturmanın diğer bir yolu da (yedeklenen tablolar için CREATE TABLE komutları içeren dosyaların yanısıra) mysqldump komutunu --tab seçneği ile birlikte kullanmaktır.

Veri içeren bir metin dosyasındaki bilgileri geri yüklemek için LOAD DATA INFILE komutunu veya mysqlimport programını kullanabilirsiniz.

3. mysqldump programı veya mysqlhotcopy ile yedekleme

mysqldump programı ve mysqlhotcopy yedeklem yapabilir. Tüm tablo türlerini yedekleyebildiğinden, mysqldump programı daha yaygın olarak kullanılmaktadır. mysqlhotcopy ise belirli depolama motorları ile çalışabilir.

mysqldump prgoramının --single-transaction seçeneğini kullanarak, InnoDB tablolar için tablolar üzerinde kilitleme yapmadan online yedekleme yapmak mümkündür.

4. İkili sistem kütüğünü etkinleştirerek artımlı yedekleme yapma

MySQL artımlı yedeklemeyi destekler: İkili sistem kütüğünü etkinleştirerek için sunucuyu --log-bin seçeneği ile başlatmanız gerekir. İkili sistem kütüğü dosyaları size yedeklemeden sonra veritabanına yapılan değişikliği uygulamak için ihtiyaç duyduğunuz bilgiyi sağlar.

Artımlı yedekleme yapmak istediğinizde (son komple veya artırımlı yedekleme işleminden sonra yapılan değişiklikleri içeren), FLUSH LOGS komutunu kullanarak ikili sistem kütüğünü yenilemeniz gerekir. Bu yapılırsa, son komple veya artımlı yedekleme anından sonuncusuna kadar olan tüm ikili sistem kütüklerini yedekleme yerine koyalamanız gerekir. Geri yükleme durumunda, bu ikili sistem kütükleri kullanılır. Bir sonraki komple yedekleme işleminde, FLUSH LOGS, mysqldump --flush-logs, veya mysqlhotcopy --flushlog komutunu kullanarak ikili sistem kütüğünü yenilemeniz gerekir.

5. Benzer sunucu kullanarak yedekleme yapma

Eğer yedekleme yaparken ana sunucunuz ile performans sorununuz oluyorsa, yedekleme işlemini yedek benzer bir sunucu kullanarak yapabilirsiniz.

Eğer yedekleme işlemi için yedek benzer bir sunucu kullanıyorsanz, seçtiğiniz yedekleme yöntemini dikkate almaksızın, yedek sunucunun veritabanlarını yedeklerken master.info ve relay-log.info dosyalarını yedeklemeniz gerekir. Yedek sunucu verilerini geri yükledikten sonra benzerlik sağlamaya devam etmek için bu bilgi dosyalarına daima ihtiyaç duyulur. Eğer yedek sunucu LOAD DATA INFILE komutlarını kullanırsa, aynı zamanda yedek sunucunun bu amaçla kullandığı ve dizinde bulunan SQL_LOAD-* dosyalarını da yedeklemeniz gerekir. Yedek sunucunun kesilmiş LOAD DATA INFILE işlemlerinin benzetilmesine devam etmesi için bu dosyalara ihtiyaç duyar. Bu dizinin yeri --slave-load-tmpdir seçeneğinin değeridir. Eğer sunucu bu seçenekle başlatılmazsa, dizinin yeri tmpdir sistem değişkeninin değeridir.

6. Bozulmuş dosyaları onarma

Eğer bozulmuş MyISAM tabloları yeniden yüklemmek isterseniz, öncelikle REPAIR TABLE veya myisamchk -r komutlarını kullanarak onarmaya çalışın. Bu işlemin 99.9% oranında başarılı olması gerekir.

mysqldump programının kullanımı

Bu bölümde, veri yedekleme ve yedeklenen verileri yeniden yükleme için mysqldump programının kullanılmasını incelemeye çalışacağız. Yedeklenen dosya bir kaç farklı şekilde kullanılabilir:

* Veri kaybı durumunda verileri yeniden elde etmek yedekleme amacıyla

* Yedek sunucu oluşturmada veri kaynağı olarak

* Bir veritabanının kopyasını oluşturmak için

mysqldump programı ile --tab seçeneğinin tanımlanması durumuna bağlı olarak 2 tür çıktı elde edilir:

* --tab seçeneği kullanılmadığında, mysqldump programı SQL komutlarını standart çıkışa yazar. Elde edilen çıktı içinde veritabanlarını, tabloları,vb. olşturan CREATE komutları ile verileri tablolara aktaran INSERT komutları yer alır. Çıktı bir dosya içine yazılabilir ve depolanan verileri tekrar oluşturmak için mysql programı ile tekrar yüklenir.

* --tab seçeneği kullanıldığında, mysqldump programı her bir tablo için 2 çıktı dosyası oluşturur. Sunucu tablo_adi.txt bir dosyaya, her satırda bir tablo satırı olmak üzere, tab sınırlı metin olarak yazar. tablo_adi.sql adlı dosyaya ise CREATE TABLE komutları yazılır.

mysqldump komutu ile SQL formatında veri yedekleme

Ön tanımlı olarak, mysqldump programı verileri SQL komutları olarak standart çıkışa yazar.

Aşağıdaki komutla elde edilen çıktıyı bir dosyaya kaydedebilirsiniz:

C:\> mysqldump [argümanlar] > dosya_adi

mysqldump programı ile --all-databases seçeneğini kullanarak tüm veritabanlarını yedekleyebilirsiniz:

C:\> mysqldump --all-databases > yedek.sql

mysqldump programı ile --databases seçeneğini kullanarak belirli veritabanlarını yedekleyebilirsiniz:

C:\> mysqldump --databases dbase1 dbase2 dbase3 > yedek.sql

--databases seçeneği komut satırında kullanılan tüm isimlerin veritabanı olarak değerlendirilmesini sağlar. Bu seçenek kullanılmadığında, mysqldump programı ilk isimi veritabanı adı ve takip edenleri ise tablo adı olarak değerlendirir.

--all-databases veya --databases seçenekleriyle, mysqldump programı CREATE DATABASE ve USE komutlarını her bir veritabanını depolamadan önce yazar. Bu sayede, depolanan dosya yüklendiğinde, mevcut olmayan veritabanını oluşturularak ön tanımlı veritabanı olarak tanımlarndığından, veritabanı içerikleri alındığı veritabanına geri yüklenir. Eğer depolanan dosyanın bir veritabanını yeniden oluşturmadan önce veritabanını silmesini isterseniz, --add-drop-database seçeneğini kullanabilirsiniz. Bu durumda, mysqldump programı her CREATE DATABASE komutundan önce bir DROP DATABASE komutu ekler.

Tek bir veritabanını depolamak için komut satırında tanımlayın:

C:\> mysqldump --databases dbase_adi > veri.sql

Tek bir veritabanı olursa, --databases seçeneğini kullanmayabilirsiniz:

C:\> mysqldump dbase_adi > veri.sql

--databases seçeneğini kullanmadığınızda, depolama dosyası CREATE DATABASE ve USE komutlarını içermez. Bu durumda, aşağıdaki kuralları uygulamanız gerekir:

* Depolanan dosyayı yüklediğinizde, sunucunun yüklenecek veritabanını belirlemesi için bir veritabanı tanımlamanız gerekir.

* Yeniden yüklemede, orjinal veritabanı adından farklı bir ad tanımlayarak veriyi farklı bir veritabanına yükleyebilirsiniz.

* Eğer yüklenen veritabanı mevcut değilse, öncelikle oluşturmanız gerekir.

* Eğer çıkış CREATE DATABASE komutu içermezse, --add-drop-database seçeneğinin herhangi bir etkisi yoktur. Eğer kullanırsanız, DROP DATABASE komutu oluşturmaz.

Sadece veritabanındaki belirli tabloları depolamak için, tablo adlarını komut satırında veritabanı adından sonra tanımlayın:

C:\> mysqldump dbase_adi tablo_adi1 tablo_adi4 tablo_adi6 > veri.sql

SQL formatındaki veriyi yükleme

SQL komutları içeren ve mysqldump programı tarafından oluşturulan dosyayı yüklemek için, dosya mysql programına aktarılır. Eğer dosya mysqldump programı ile oluşturulurken --all-databases veya --databases seçeneği ile kullanılırsa, CREATE DATABASE ve USE komutları içerir ve verinin yükleneceği ön tanımlı bir veritabanı tanımlanmasına gerek yoktur:

C:\> mysql < veri.sql

mysql programı içinde, source komutunu kullanabilirsiniz:

mysql> source veri.sql

Eğer dosya tek bir veritabanı içinse ve CREATE DATABASE ve USE komutlarını içermiyorsa, öncelikle veritabanını oluşturun:

C:\> mysqladmin create dbase_adi

Sonra, depolanan dosyayı yüklediğinizde, veritabanı adını tanımlayın:

C:\> mysql dbase_adi < veri.sql

Bu uygulamanın aynısını mysql programının içinden yapabilirsiniz. Önce veritabanı oluşturulur, veritabanı ön tanımlı olarak seçilir ve depolanan dosya yüklenir:

mysql> CREATE DATABASE IF NOT EXISTS dbase_adi;

mysql> USE dbase_adi;

mysql> source veri.sql