mysqldump kullanımı

mysqldump komutu veritabanının yedeğini almak için ve bu yedekleri geri yüklemek için kullanılan bir komuttur. Veritabanının yedeğini almak derken, yapabileceğimiz işlemler kısıtlı değildir. Tek bir veritabanının yedeğini almak, birden çok veritabanının yedeğini almak, tüm veritabanlarının yedeğini almak, tek bir veritabanından seçtiğimiz tabloların yedeğini almak gibi işlemleri yapabiliriz.

mysqldump komutunun kullanımı aşağıdaki 3 şekilde özetlenebilir.

mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] --databases [OPTIONS] DB1
mysqldump [OPTIONS] --all-databases [OPTIONS]

Parametrelerinden bahsedecek olursak;

–add-drop-database(--add-drop-database) ve –add-drop-table(--add-drop-table) parametreleri, alacağımız yedeğe CREATE DATABASE ve DROP DATABASE ekler. Böylece yedeği geri yüklerken, eğer tablo varsa, olası bi hatadan kurtulmuş oluruz.

–default-character-set=utf8(--default-character-set=utf8) parametresi ile (dikkat: default kelimesinden önce 2 adet çizgi var, diğerleri tek çizgi)(utf8 yerine başka bir seçenek de yazabiliriz) dil seçeneğini belirleyebiliriz. Böylece geri yüklemelerde türkçe karakter problemi yaşamanın önüne geçeriz.

–add-locks(--add-locks) parametresi ile yedekleme sırasında tabloları kilitleyebiliriz. Böylece yedeklerken tablolara yeni veri yüklenemez, böylece yedekleme işlemimizin süresi kısalabilir.

Örnek vererek açıklamaya çalışayım.

3 adet veritabanımız, bunların içinde de 2’şer tane tablomuz olduğunu varsayalım.

veritabanı : Log
tabloları : mysql_error, php_error

veritabanı : Users
tablolaro : admin, customer

veritabanı : Blog
tabloları : options, comments

Tek bir veritabanının yedeğini alalım;

mysqldump -u root -p Log > log.sql

Log veritabanındaki tüm tabloları log.sql olarak yedekledik. log.sql’in başına dosya yolu da ekleyebiliriz. Örneğin A:/test/yedekler/log.sql gibi bir yere de yedekleyebiliriz.

Dil seçeneğini nasıl kullanacağımıza bakalım;

mysqldump -u root -p --default-character-set=utf8 Log > log.sql

–add-drop-database kullanarak yedekleyelim bir de

mysqldump -u root -p --add-drop-database --default-character-set=utf8 Log > log.sql

Tek veritabanından tek bir tabloyu yedekleyelim;

mysqldump -u root -p Users customer > usersCustomer.sql

Birden çok veritabanının yedeğini alalım;

mysqldump -u root -p --databases Users Blog > usersAndBlog.sql

Tüm veritabanlarının yedeğini alalım;

mysqldump -u root -p --all-databases > allMysqlDb.sql

Aldığımız yedekleri geri yüklemek istediğimiz zaman da yapmamız gereken çok basit;

mysqldump -u root -p {veritabanı adı} < {yedek}

mysqldump -u root -p Log2 < log.sql

Manager of pid-file quit without updating[FAILED] hatasi

Eğer Starting MySQL….Manager of pid-file quit without updating[FAILED] hatası alıyorsanız, muhtemelen bir sebepten ötürü mysqlinizi durdurmuşsunuz, ama sonra bir daha başlatamamışsınız demektir.

Benim de hata şöyle başıma geldi. Bazı sitelerimiz yaklaşık 2 dakikadır açılmıyordu. Server a Ssh’tan giriş yapabildim, ve kontrol edebildim. Makina’da load yoktu. (2-3 civarındaydı.)

ben de serviceleri yeniden başlatarak bir rahatlama sağlayabileceğimi düşündüm. Servisleri durdurdum fakat, mysqli başlatamadım. Başlıkta belirttiğim hatayı verdi. Daha sonra diskte yer kalmadığını gördük. Pid dosyasını da güncelleyemiyordu haliyle.

Çözüm

Diskte bir miktar yer açtıktan sonra mysql sıkıntısız bir şekilde başladı. Ah bu loglar yok mu…

Mysql Tablo id’leri Sıralamak ve Yeniden Dizmek (reorder primary_key)

tablo1 tablosu; id ve label adlı 2 sütundan oluşuyor ve id primary key auto increment mevcut.

insert into tablo1 values(11,'ahmet'),(3,'mahmut'),(4,'muharrem'),(5,'sedat'),(1,'emre');

Şeklinde bir komut ile satırlarınızı olutşturduysanız,

SELECT * FROM tablo1;

komutu çalıştırdığınızda order by komutu kullanmazsanız, sonuçlar aşağıdaki gibi ekleme sıranıza göre gelecektir.

id      label
11	ahmet
3	mahmut
4	muharrem
5	sedat
1	emre

Bu tabloda

ALTER TABLE tablo1 ORDER BY id ASC;

komutunu çalıştırırsanız, yeni

Select * from tablo1;

komutunuzun sonucu şöyle olur:

id	label
1	emre
3	mahmut
4	muharrem
5	sedat
11	ahmet

———————————
İnsanlar yukarıda yazdığımla şu yazdığımı birbirine karıştırıyor.
Şimdi ayrı bir konu olduğunu belirterek; bu satırların id lerini de tekrar sıraya dizmek istiyorsak şöyle yapabiliriz.

SET @count = 0;
UPDATE `tablo1` SET `id` = @count:= @count + 1;

Sonuçlar:

Select * from tablo1;

Sonuçlar :

id      label
1	emre
2	mahmut
3	muharrem
4	sedat
5	ahmet

şeklinde görüldüğü gibi tablo id’lere göre sıraya dizilmiş bir şekilde olacaktır.

Bu konuyla ilgili araştırıyorsanız (neden araştırdığınızı siz biliyorsunuz zaten, benim bunu uygulama derdim; düzenli olması ve en önemlisi bu veritabanını kullanan herkes için bir standart oturtmak istememdi), en mantıklısı ilk yaptığımdan sonra 2. yaptığımı uygulamaktır. Böylece hem satırlar default eklenme sırasına göre değil de , ilgili id’ye göre sıralanmış olacaktır. Daha sonra da , bu idleri de 1 den başlayacak şekilde tekraradan dizmiş olacağız.

Yani bahsetmiş olduğum 2 olayı komutu birlikte kullanınca, artık idleri 1 den ardışık bir şekilde devam eden bir tablonuz olmuş oalcaktır. Özellikle ayar tablolarınızın arada sırada primary_key alanında böyle bir güzelleştirme yaparsınız diye düşündük.. 🙂

mysql ortalama (avg) fonksiyonu

Çok basit bir konu olan ortalama alma, mysql içinde tek bir fonksiyon (avg fonksiyonu) ile yapılabilmektedir. Her veritabanında muhtemelen vardır zaten. Aklımızda bulunsun, aranınca da bulunsun..

Örnek :
Bir blogumuz olsun ve içinde yazılarımıza puan verenlerin tutulduğu bir sütunumuz olsun.

select avg(point) from posts;

point sütunundaki değerin ortalamasını almak manasına gelmektedir. query yapılan tablodaki sorgu sonucu için ilgili sütunun ortalamasını döndürür.

Mysql “Got error 28 from storage engine” Hatası

Mysql ile çalışan bir sisteminizde Got error 28 from storage engine hatası alıyorsanız eğer, harddiskinizde işlem yapacak en ufak bir yer kalmamış demektir.
Basit bir select sorgusunda bile (diske bir şey yazılmıyor zannediyorsanız, mysql-cache açıksa bunu cachelemek için diske yazar) bu hatayı alabilirsiniz.

Diskinizde bir miktar yer açarsanız yani kısaca mysql için çalışma alanı oluşturabilirseniz, problem çözülecektir. Genelde tmp klasörü içindekiler silinebilir.

Ama doğrudan problem bu klasörün dolması demek değildir, diskinizin dolmasından dolayıdır. Amaçsızca bir şeyler silmeyiniz 🙂