XAMPP üzerinde çalışan MySQL veritabanınız bir anda kayıp mı oldu? Tablolar görünmesine rağmen açılmıyor ya da kayıtlar erişilemez hale mi geldi? Endişelenmeyin. Bu rehberde, bilgisayarın ani kapanması, elektrik kesintisi veya bozuk data klasörü gibi sorunların nasıl veritabanınızı çökerttiğini ve tablolarınızı adım adım nasıl kurtarabileceğinizi öğreneceksiniz. Görsellerle desteklenmiş bu makale sayesinde, frm ve ibd dosyalarıyla tablolarınızı yeniden hayata döndürebilir, verilerinizi güvenle geri alabilirsiniz.
1.Giriş
XAMPP, geliştiriciler için en popüler lokal sunucu çözümlerinden biridir. Ancak bazen beklenmedik hatalar, yanlış kapatma işlemleri veya donanım sorunları nedeniyle MySQL veritabanı bozulabilir. Bu yazıda, XAMPP MySQL tablolarını ve verilerini kurtarmak için uygulanabilecek adımları ayrıntılı şekilde ele alacağız.
2.Sorunun Olası Sebepleri
MySQL tablolarının bozulmasına yol açabilecek yaygın senaryolar:
- Bilgisayarın zorla kapatılması: XAMPP veya MySQL çalışırken bilgisayarın güç düğmesiyle kapatılması.
- Sistem kilitlenmesi: Donanım veya yazılım hatası nedeniyle bilgisayarın donması ve MySQL’in düzgün kapanmaması.
- Elektrik kesintisi: Ani kesinti sırasında veritabanı dosyaları tam yazılamaz ve bozulur.
- Disk hataları: HDD/SSD’de bozuk sektörler olması.
- Yanlış klasör müdahaleleri: klasöründe dosyaların yanlışlıkla silinmesi veya taşınması.
3. MySQL Başlatma Sorunu
Bazı durumlarda XAMPP çalışıyor gibi görünse de MySQL servisi başlatıldıktan kısa süre sonra kapanır. Bunun sebepleri:
- Bozuk
ibdata1dosyası: InnoDB metadata dosyası hasar gördüğünde MySQL stabil çalışmaz. - Uyumsuz tablolar: klasöründeki tabloların bir kısmı bozulmuşsa MySQL açılır ama kısa süre sonra kapanır.
- Port çakışması: 3306 portunu başka bir uygulama kullanıyorsa MySQL çakışma nedeniyle kapanır.
- Bellek sorunları: Büyük tablolar yüklenirken RAM yetersiz kalabilir.

4. XAMPP’ı Yeniden Kurmadan Önce Çözüm Aramak
XAMPP’ı hemen yeniden kurmak yerine önce mevcut durum içerisinde bir çözüm aramak, hem iş yükünü azaltmak hem de veri ve ayarları kaybetmemek için önemlidir. Örneğin öncelikle MySQL’in çalıştığı portun meşgul olup olmadığını kontrol etme, meşgulse portu boşa çıkarma veya MySQL başka portta çalıştırma, bizim burada ele alacağımız bozuk ibdata1 dosyasını değiştirme amaçlı var olan data klasörünü yedekleyip yeni bir data klasörü oluşturmak gibi çözümleri denemek daha güvenli bir yöntemdir. Bu yazıda bozuk dosyaları değiştirme yöntemi ele alınacaktır.
5. MySQL’i Yeniden Çalıştırmak İçin Klasör/Dosya Değiştirme Yöntemi
Xampp uygulamasının bulunduğu dizinde yer alan mysql klasörü içinde yapılacak işlemleri adım adım ele alalım:

xampp/mysql/dataklasörünü yedekle:dataklasörünün farklı adda bir kopyasını alın (Örneğin data_old).ibdata1dosyasını değiştir:xampp/mysql/backupklasörünün içerisindeki ibdata1 dosyasını kopyalayıp data klasörüne yapıştırın (data klasöründeki eskiibdata1dosyasının üzerine yazdırın)- MySQL’i çalıştırmayı dene: XAMPP kontrol panelinden MySQL’i başlatın ve çalışıp çalışmadığını kontrol edin. Eğer MySQL çalışmaya başlamışsa veritabanlarınızın durumunu görmek ve içeriklerini kontrol etmek için 7.Adıma geçebilirsiniz. MySQL hala başlatılamıyorsa aşağıdaki adımları tamamlayın.
- Yeni
dataklasörü oluştur:xampp/mysql/backupklasörünün bir kopyasınıdataadı ile oluşturun.backupklasörü, MySQL’in temiz başlangıç dosyalarını içerir. - Eski veritabanı klasörlerini taşı: Eski
dataklasörü (örneğimizde data_old) içerisinde yer alan veritabanı klasörlerini yeni data klasörü içerisine kopyalayın. Bu klasörlerin birer kopyası eski data klasörü (data_old) içinde kalmaya devam etsin, çözüm çalışmaları sırasında duruma göre tekrar ihtiyacınız olabilir. Veritabanı klasörleri, veritabanı adlarıyla aynı isme sahiptir (veritabani_adi şeklinde). Eskidataklasöründekiibdata1dosyasını taşımayın, çünkü bu dosya bozulmuş olabilir. Amacımız temiz bir başlangıç yaparak MySQL sunucusunu tekrar çalıştırabilmek. - MySQL’i tekrar çalıştırmayı dene: XAMPP kontrol panelinden MySQL’i tekrar başlatın ve çalışıp çalışmadığını bir kez daha kontrol edin. Eğer MySQL hala başlatılamamışsa, data klasörünüzün yedeğini aldığınızdan emin olarak XAMPP’ın yeniden kurulumuna geçebilirsiniz.

6. XAMPP Yeniden Kurulacaksa İzlenecek Yol
Eğer denediğiniz ibdata1 dosyasının yenilenmesi veya başka çalıştırma yöntemleri (örneğin) işe yaramadı ve XAMPP yeniden kurmaya karar verdiyseniz, ya da onarımla uğraşmak yerine doğrudan XAMPP’ın yeniden kurulumuna geçmek istediyseniz bile, eğer sistemde önceden oluşturduğunuz veritabanları varsa, Adım 4’teki data klasörü yedekleme işlemini mutlaka yapmanızı ve kurulumdan sonra verilerinizi geri getirmek için devamındaki adımları uygulamanızı öneririm.
7. MySQL Çalıştıktan Sonra Kontrol
MySQL çalışıyorsa phpMyAdmin üzerinden veritabanlarını kontrol edin. Veritabanları burada listeleniyor görünebilir ama üzerine tıklayıp tabloları görmek istediğinizde tabloların kaybolduğunu görüp, bir hata iletisiyle karşı karşıya gelme olasılığınız yüksektir. Özellikle veritabanı dosyaları bozulmuş ve MySQL bu nedenle hata vermişse bu sonuçla karşılaşma olasılığınız daha da artacaktır.
“Tablo yapısı veya kayıtlar görüntülenemiyor.” benzeri bir uyarıyla karşılaşmışsanız tabloların yapı bilgisini tutan .frm uzantılı dosyalar ile kayıt bilgilerini tutan .ibd uzantılı dosyalar uyumsuz veya bozuk olabilir. Bir sonraki aşama tabloları ve içerdiği verileri kurtarma işlemlerini içermektedir.
8. Veritabanı Tablolarını ve Verileri Kurtarma
8.1. Kurtarma İçin Gereken Veritabanı Dosyaları

.frmdosyaları → Tablo yapısını tutar..ibddosyaları → Tablo verisini tutar.ibdata1dosyası → InnoDB metadata dosyasıdır, ama bozulmuşsa doğrudan kullanılamaz.

.frm ve .ibd uzantılı dosyalar, veritabanıyla aynı isimdeki klasörün içinde, tablo adı olarak tutulurlar. (tablo_adi.frm ve tablo_adi.ibd)
8.2. Tablo Yapısını Kurtarma
Tablo verilerini kurtarabilmek için önce tablo yapısının eskisi ile aynı olması gerekir. Eğer phpMyAdmin panelinde veritabanı tablolarını görüyor ama açmaya çalıştığımızda hatayla karşılaşıyorsak, yeni yapıyı kurabilmek için önce eski tabloları kaldırmalıyız, çünkü phpMyAdmin aynı isimde yeni bir tablo oluşturmanıza izin vermeyecektir. Tabloları phpMyAdmin panelinden doğrudan veya xampp/mysql/data/sizin_veritabani klasörünün içeriğini silerek dolaylı olarak kaldırabilirsiniz
NOT: phpMyAdmin’de hangi tablolarda sorun yaşıyorsanız, sadece o tabloları kaldırmalısınız. O nedenle eğer dosya silme yöntemini seçmişseniz, veritabanı klasöründen sadece ilgili tablo adına sahip .frm ve .ibd uzantılı dosyaları sildiğinizden emin olmalısınız.
Eğer önceki tablo yapısını tam olarak bilmiyorsanız, bu yapıyı ilgili tablonun .frm uzantılı dosyasından çekmemiz gerekir. Bunun için de mysqlfrm, go-frm-parser veya dbsake gibi araçlardan yararlanabilirsiniz. mysqlfrm, MySQL’in kendi aracı olmasına rağmen geliştirilmesi durdurulmuştur ve yeni MySQL yapısındaki MariaDB ile uyumsuzluk çıkarabilmektedir. Bunun yerine Bunun yerine go-frm-parser veya dbsake gibi modern araçları kullanmanızı öneririm. Ben go-frm-parser kullanıyorum ve aşağıdaki komut satırı örnekleri de bu araca aittir. Bu aracı web sitemdeki dosyalar bölümünde Windows için go-frm-parser Derlemesi adıyla bulabilirsiniz.
Veritabanının .frm uzantılı tablo dosyalarını parse edebilmek için uygulamanın bulunduğu dizinde bir terminal açarak gerekli komutları çalıştırabilirsiniz.
Örneğin C dizinine kurulmuş bir XAMPP localhost sunucusu için veritabaniniz adlı veritabanındaki wp_options tablosunun yapısı C:\xampp\mysql\data\veritabaniniz\wp_options.frm dosyasındadır (Tablo bozuk olduğu için silmişseniz bu dosya konumunu yedeğinize yönlendirmelisiniz. Örn: C:\xampp\mysql\data_old\veritabaniniz\wp_options.frm). Bu dosyanın içerisindeki tablo yapısını indirdiğiniz frm_parser.exe dosyasının bulunduğu konumda başlatacağınız Powershell terminalinde
.\frm_parser.exe "C:\xampp\mysql\data_old\veritabaniniz\wp_options.frm"
komutunu çalıştırarak görebilirsiniz. Komut işletildikten sonra, yine terminalde tabloyu yeniden oluşturmak için gereken CREATE TABLE SQL komutu yazdırılacaktır.
.\frm_parser.exe "C:\xampp\mysql\data_old\veritabaniniz\wp_options.frm" >> "C:\xampp\mysql\data_old\wp_options.sql"
komutuyla da CREATE TABLE çıktısını settings.sql dosyasına yazdırmış olursunuz.
Örnek çıktı:
====WITHOUT HEADER:
CREATE TABLE `wp_options` (
`option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`option_name` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`option_value` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
`autoload` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'yes',
PRIMARY KEY (`option_id`),
UNIQUE KEY `option_name` (`option_name`),
KEY `autoload` (`autoload`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
====WITH HEADER:
--
-- Table structure for table `wp_options`
-- Created with MySQL Version 10.4.32
--
CREATE TABLE `wp_options` (
`option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`option_name` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`option_value` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
`autoload` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'yes',
PRIMARY KEY (`option_id`),
UNIQUE KEY `option_name` (`option_name`),
KEY `autoload` (`autoload`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

PowerShell ile data_old/localdb veritabanı klasörünün içerisindeki tüm tabloların şemasını alıp, aşağıdaki örnekte olduğu gibi aynı klasörde oluşturulacak localdb.sql dosyasına ekleyebilirsiniz.
Get-ChildItem "C:\xampp\mysql\data_old\veritabaniniz\" -Filter *.frm | ForEach-Object {
.\frm_parser.exe $_.FullName >> "C:\xampp\mysql\data_old\veritabaniniz.sql"
}
8.3. Tabloyu/Tabloları Yeniden Oluşturma
go-frm-parse aracını kullanarak elde ettiğimiz CREATE TABLE komutları sayesinde tablolarımızın yapısını kurtarmış olduk. Tablolarımızı veritabanı içerisinde yeniden oluşturabilmek için bu CREATE TABLE komutlarını MySQL’de çalıştırmalıyız. Bunun için oluşturulan sql dosyasını phpMyAdmin panelinde veritabanı seçiliyken doğrudan içe aktarabilir veya şema alma komutlarını tek tek vermişseniz, geri dönen CREATE TABLE komutlarını veritabanının SQL penceresinde çalıştırabilirsiniz. Bu sayede ilgili tabloları yeniden oluşturmuş olursunuz.
Parse aracı WITHOUT HEADER ve WITH HEADER olmak üzere TABLE CREATE komutunun aynı 2 çıktısını verir ve hem terminale, hem de -talep etmişseniz- dosyaya ikisini birden yazar. Bu nedenle phpMyAdmin SQL panelinden tabloyu yeniden oluştururken terminalden kopyaladığınızda aynı tablonun sadece bir TABLE CREATE komutunu aldığınızdan emin olun. SQL dosyasından içe aktarma yapacaksanız da dosyadaki aynı tablo için yazdırılmış TABLE CREATE komutlarının birer tanesini silerek teke düşürün.
8.4. Tablo Verilerini Kurtarmak
Tablo verileriniz .ibd uzantılı dosyalarda bulunuyor. Biz MySQL’de tabloları yeniden oluşturduğunuzda xampp/mysql/data dizinindeki veritabanı klasörünüzde her tablo için yeni .frm ve .ibd dosyaları oluştu. .frm dosyaları artık istediğiniz tablo yapısını/sütunlarını içerirken, .ibd dosyaları, oluşturduğunuz tablolar boş olduğu için herhangi bir veri barındırmıyor. Sizin eski verileriniz yedeklediğiniz klasördeki .ibd dosyalarında. Bu nedenle yedekteki veritabanı içerisindeki sadece .ibd dosyalarını, yeni .ibd dosyalarının yerine koyduğunuzda veri dosyalarında bir bozulma olmadığı sürece kayıtlarınıza yeniden ulaşma şansı yakalamış olacaksınız. Bu taşıma öncesi yeni oluşan .ibd dosyalarının bir kopyasını almak iyi olabilir, eğer eski .ibd dosyasında bir sorun varsa bu .ibd dosyasını tekrar klasöre taşırsınız ve verinizi geri getirememiş olsanız da tablonuz kullanılabilir halde kalır.
Son olarak verileri veritabanı tablolarımıza geri getirebilmek için, tabloların onları yeniden tanımlarken oluşturulan .ibd dosyaları ile bağlarının kesilip, yedekten klasöre tekrar taşıdığınız ve veri içeren eski .ibd dosyalarına bağlanması gerekecek. Bunun için de veritabanının phpMyAdmin SQL bölümünde her tablo için
ALTER TABLE tablo_adı DISCARD TABLESPACE;
ALTER TABLE tablo_adı IMPORT TABLESPACE;
komutlarını çalıştırarak TABLESPACE işlemlerini yapmalısınız.
Bu aşamada yukarıdaki örnek sunucumuz ve settings tablosunu kurtarma senaryomuza göre şunları yapın:
C:\xampp\mysql\data\veritabaninizklasöründeki yeni .ibd dosyalarını yedekleyin.C:\xampp\mysql\data_old\veritabaniniz\settings.ibddosyasını ve varsa diğer tabloların .ibd dosyalarınıC:\xampp\mysql\data\veritabaninizklasörüne taşıyın.- phpMyAdmin panelinin veritabanına ait SQL penceresinde aşağıdaki TABLESPACE komutlarını çalıştırın:
ALTER TABLE settings DISCARD TABLESPACE;
ALTER TABLE settings IMPORT TABLESPACE;
- Aşağıdaki SQL komutuyla tablonuza verilerin gelip gelmediğini kontrol edin.
SELECT * FROM settings
9. Önleyici Tedbirler
- Düzenli yedekleme yapın (
mysqldump, tam yedek) - Doğrudan data klasörünü kopyalamak yerine resmi yedekleme yöntemlerini kullanın
- Büyük tabloların yer aldığı kurtarma işlemlerinde tabloları tek tek kurtarın.
10. Sonuç
Bu rehberde, XAMPP MySQL tablolarını kurtarmak için:
- Olası bozulma sebeplerini,
- MySQL’in kendiliğinden kapanma senaryolarını,
- XAMPP’ı yeniden kurmadan önce klasör değişikliği yöntemini,
- phpMyAdmin’de tablo hatalarını örnek olay olarak ve dosyalarıyla kurtarma adımlarını ele almaya çalıştım.
Doğru araçlar ve dikkatli uygulama ile kaybolmuş gibi görünen tabloları siz de yeniden hayata döndürebilirsiniz.
Veri kaybı her geliştiricinin başına gelebilecek stresli bir durumdur. Ancak doğru adımları izleyerek tablolarınızı ve kayıtlarınızı geri getirmek mümkündür. Bu rehberde öğrendiğiniz yöntemlerle projelerinizi kaldığınız yerden sürdürebilir, gelecekteki riskleri en aza indirmek için düzenli yedekleme alışkanlığı kazanabilirsiniz. Eğer bu rehber size yardımcı olduysa, başkalarının da verilerini kurtarabilmesi için paylaşın. Benzer sorunlar yaşadıysanız veya farklı çözümler bulduysanız yorumlarda paylaşarak bu kaynağı daha da zenginleştirmenizden mutluluk duyarım. Unutmayın: bilgi paylaştıkça çoğalır ve birbirimize destek oldukça daha güçlü hale geliriz.






