MySQL Table is marked as crashed and last (automatic?) repair failed hatasi

Bu hatayı repair table komutu çalışmayı bitiremedikten sonra tekrar repair etmeye kalktığınızda alırsınız.

Normalde Mysql tablonuz crash olduysa;

repair table tablo_adi; 

komutuyla tablonuzu tamir etmeye çalışabilirsiniz. Ancak gelin görün ki bu işe yaramıyor diyorsanız, en azından MyIsam tablolarda çalışabilecek bir yöntem daha var.

mysql i durdurun.

service mysql stop
veya 
/etc/init.d/mysqld stop

/var/lib/mysql/database_adi yoluna gidin. (veya veritabanınızın dosyaları her neredeyse..)

myisamchk -r -v -f --sort_buffer_size=128M --key_buffer_size=128M /var/lib/mysql/database_adi /tablo_adi.MYI

şeklinde crash edilmiş bir myIsam motorlu tablonuzu kurtarabilirsiniz.

Tavsiye

Tabi ki bu hale gelip de bu yazıyı gördüyseniz, yedek alma sisteminiz henüz mevcut olmayabilir. Eğer kendinize ait bir sunucunuz var ise,
Veritabanı yedekleme cronjobu eklemenizi tavsiye ederim. Buradan mysqldump ile yedek almayı öğrenin.

Kendinize ait bir sunucunuz yok ise de hosting hizmeti aldığınız firmadan ISRARLA talep ediniz.

mysql komutları (mysql commands)

Giriş yapmak ;

 [mysql_dir]/bin/mysql -u root -p 

Bir database yaratmak (ek olarak default character set ve collate ekleyebilirsiniz) ;

 mysql> create database [database_name]; 

Tüm databaseleri listelemek ;

 mysql> show databases; 

Bir database seçmek ;

 mysql> use [database_name] ;

Seçtiğimiz databasede bulunan tüm tablaları görmek ;

 mysql> show tables; 

Tablonun yapısını görmek ;

 mysql> describe [table_name] ;

Database silmek ;

 mysql> drop database [database_name] ;

Tablo silmek ;

 mysql> drop table [table_name] ;

Tablodaki bütün verileri görmek ;

 mysql> SELECT * FROM [table_name];

Tablodaki sütunları ve özelliklerini görmek ;

 mysql> show columns from [table_name];

Tablodaki verileri bir kritere göre listelemek ;

 mysql> SELECT * FROM [table_name] WHERE [field_name] = "kriter";

Tabloda name sütunundaki veri ‘Ahmet’ ve phone sütunundaki veri ‘123123123’ olan verileri listelemek ;

 mysql> SELECT * FROM [table_name] WHERE name = "Ahmet" AND phone = ""123123123";

Tabloda name sütunundaki veri ‘Ahmet’ olmayan ve phone sütunundaki veri ‘789789789’ olan verileri numara sırasında göre listelemek ;

 mysql> SELECT * FROM [table_name] WHERE name != "Ahmet" AND phone = "789789789" ORDER BY phone;

Tabloda name sütunundaki veri ‘Ahmet’ ile başlayan ve phone sütununda ‘123123123’ olan verileri listelemek ;

 mysql> SELECT * FROM [table_name] WHERE name = 'Ahmet%' AND phone = "123123123";

Tabloda name sütunundaki veri ‘Ahmet’ ile başlayan ve phone sütununda ‘123123123’ olan verileri 1,5 aralığında (5 adet) listelemek ;

 mysql> SELECT * FROM [table_name] WHERE name = 'Ahmet%' AND phone = '123123123' LIMIT 1,5 ;

Tabloda rec sütunundaki veri ‘a’ ile başlayan verileri listelemek ;

 mysql> SELECT * FROM [table_name] WHERE rec RLIKE '^a';

Bir sütundaki unique verileri listelemek ;

 mysql> SELECT DISTINCT [column_name] FROM [table_name];

Tabloda belirlediğimiz sütundaki verileri belirleriğimiz bir artma(ascending – ASC) veya azalma(descenging – DESC) sırasına göre listeler;

 mysql> SELECT [column_1], [column_2] FROM [table_name] ORDER BY [column_2] ASC;

Tablodaki satır sayısını verir ;

 mysql> SELECT count(*) FROM [table_name];

Sütundaki toplam değeri verir ;

 mysql> SELECT SUM(column) FROM [table_name];

BUNU TEKRAR YAP. Tabloları join etme ;

 mysql> ;

Yeni bir kullanıcı yaratıp root olarak giriş yapma ;

mysql -u root -p
mysql> use mysql;
mysql> INSERT INTO user (Host, User, Password) VALUES ('%', 'username', PASSWORD('password'));
mysql> flush privileges; 

Kullanıcının şifresini değiştirme ;

 mysql> SET PASSWORD FOR 'user'@'hostname' = PASSWORD('password');
 mysql> flush privileges;

mysql root password geri almak (mysql server işlemini durduruyoruz, skip-grant-tables yaparak mysql’e root olarak giriş yapıyoruz. yeni şifreyi set ediyoruz, sonra mysql’i restart ediyoruz. );

/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET password=PASSWORD("newrootpassword") WHERE User='root';
mysql> flush privileges;
mysql> quit
/etc/init.d/mysql stop
/etc/init.d/mysql start 

root şifresi hiç değiştirilmediyse, bir şifre vermek için ;

 mysqladmin -u root password newpassoword ;

root şifresini değiştirme ;

 mysqladmin -u root oldpassword newpassword ;

‘ahmet’ isimli kullanıcıya “pass” şifresi erişim izni verme;

 mysql> use mysql;
mysql> grant usage on *.* to ahmet@localhost identified by 'pass';
mysql> flush privileges; 

Veritabanı için kullanıcıya yetki vermek (2 yolu vardır). ;
1 )

 # mysql -u root -p
mysql> use mysql;
mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('%','databasename','username','Y','Y','Y','Y','Y','N');
mysql> flush privileges;  ;

2 )

 mysql> grant all privileges on databasename.* to username@localhost;
mysql> flush privileges; ;

Update işlemi ;

 mysql> UPDATE [table_name] SET [column_1] = 'A', [column_2] = 'B' WHERE [field_name] 'user'; 

Tablodan satır silmek ;

 mysql> DELETE FROM [table_name] where [phone] = '123123123';

Dosya izinlerini güncellemek;

 mysql> flush privileges;

Tablodan bir sütun silmek ;

 mysql> ALTER TABLE [table_name] DROP COLUMN [column_name];

Tabloya bir sütun eklemek ;

 mysql> ALTER TABLE [table_name] ADD COLUMN [new_column_name] varchar(30);

Tablodan bir sütunun ismi değiştirme ;

 mysql> ALTER TABLE [table_name] CHANGE [old_column_name] [new_column_name];

Bir sütunu unique hale getirmek ;

 mysql> ALTER TABLE [table_name] ADD UNIQUE ([column_name]);

Tablodaki bir sütunun yapısını düzenlemek (düzenlemeden önce varchar(50) olduğunu varsayalım);

 mysql> ALTER TABLE [table_name] MODIFY [column_name] varchar(30);

Tablodaki bir sütunun unique keyini kaldırmak ;

 mysql> ALTER TABLE [table_name] DROP INDEX [column_name];

CSV dosyasını tabloya aktarmak ;

 mysql> LOAD DATA INFILE 'filename.csv' REPLACE INTO TABLE [table_name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1, field2, field3)  ;

Tüm veritabanlarını yedeklemek ;

 mysqldump -u root -p --opt > alldatabase.sql ;

Tek bir veritabanını yedeklemek ;

 mysqldump -u root -p --databases databasename1 > database1.sql ;

Bir veritabanından tek bir tabloyu yedeklemek ;

 mysqldump -u root -p databasename tablename > database.table.sql ;

Veritabanı içe aktarmak, onarmak ;

 mysqldump -u root -p databasename < database.sql ;

Tablo oluşturma örneği ;

 mysql > CREATE TABLE IF NOT EXISTS `settings` (
  `settings_id` int(11) NOT NULL AUTO_INCREMENT,
  `settings_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `status` enum('on','off') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'on',
  PRIMARY KEY (`settings_id`)
) ;

Bu yazı buradaki yazıdan türkçeye çevirilmiştir.

database – mysql persistent connection nedir?

Persistent connection nedir?

Persistent connection, bağlantının sürekli açık tutulduğu bağlanma biçimine denir.

Normal olarak, yazılım dilleri bir veritabanına bağlanacağı zaman, bilgisayardaki bir port üzerinden veritabanına bağlantı açar. Daha sonra kodun sonunda, veya isteğe bağlı bir yerine bağlantıyı kapatır. Ayrıca connection kapatılmadıysa, yazılım dillerinde otomatik kapatma seçenekleri de bulunmaktadır. Örneğin 5 sn sonra kapat, 10 sn sonra kapat, biter bitmez kapat gibi seçenekler mevcuttur.

Persistent connection ın avantajları

Veritabanı bağlantısının otomatik. olarak açılıp kapatılması, en az ayar gerektiren şey olabilir. Ancak performansınızı persistent connection ile artırabilirsiniz.

Bir web sayfası isteği geldi diyelim. Yazılım dili kodu çalıştırdı. Varsayalım ki 1 Query gerekti bu sayfa için.
1- Hazırda bir bağlantı yok. İşletim sisteminden ilgili portu kullanmak için müsade istedi.
2- Daha sonra ilgili porta bağlandı.
3- Sonra querysini çalıştırdı.
4- Sonucunu ilgili porttan okudu.
5- Kod bitince de mysql bağlantısını kapattı.

persistent connection bu noktada, 1. aşamayı hızlandırır, 2. aşamayı direkt ortadan kaldırır, 4. aşamayı hızlandırır ve 5. aşamayı ortadan kaldırır.

Baktığımızda query önemli bir maliyet olabilir tabi ki querysine göre değişir ancak, yüklü bir serverda bahsettiğim durumun bariz hız kazandıracağı aşikar.

—-
Persistent connectionın diğer bir avantajı da , yüksek load altında, saçmalayan bir yapıya müsade etmemesidir. Persistent connection sayınızı yazılım dilinden ayarladığınızda, diyleim ki 200 verdiniz, sitenize aynı anda 1000 kişi bile gelse, serverinizin stabilliğini korur. Otomatik olarak bir sürü bağlantı açtırsaydık, bunları yönetmemiz imkansız olacaktır. (tabi kullanıcılar mysql bağlanamadı hatası alırlar, ancak siteniz çökmez bu daha önemlidir, en önemlisi de sistemi ince ayar yaparak bu ihtiyaçları da karşılayabilir hale getirmeniz sizin elinizdedir.)

Mysql olarak anlattık hep, mysql de persistent connection kullanmanız inanılmaz kolay. tek yapacağınız mysql_connect yerine mysql_pconnect kullanmanız. Bir de eğer mysql_close kullanıyorsanız, bunlar kodunuzdan kaldırmanız. (tabi ki başka bir database e bağlanacaksanız o ayrı durum)

—–
Bu sadece mysql için değil hemen hemen tüm veritabanlarında ortak olan bir özelliktir.

Hele ki database serverini ayrı bir server olarak kullanıyorsanız, ve bu makina sadece database e özel bir makina ise şiddetle tavsiye ederim. Ben aktif olarak mysql ve mongoda persistent connection kullanıyorum.

dipnot : Mysql ve Mongo persistent connectionları için PHP’de mod_php ile Apache ‘yi tercih etmeyiniz. Nginx veya lighthttpd yanında kurulu bir phpfcgi(php fast cgi), yüksek load altında apacheden hem çok daha stabil çalışıyor, hem de performans olarak %500 den fazla hızlı çalışıyor. En önemlisi, yapacağınız ayarları “DOĞRU” olarak çalıştırıyor.

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.. 🙂