Bir web sitesi, uygulama ya da CMS çalıştırıyorsanız, verilerinizin büyük ihtimalle bir ilişkisel veritabanında saklandığını bilirsiniz. Bu alanda en yaygın iki isim MySQL ve onun topluluk çatalı olan MariaDB'dir. WordPress'ten özel PHP uygulamalarına, e-ticaret sistemlerinden panellere kadar sayısız yazılım bu iki motordan biri üzerinde çalışır. İkisinin komut yapısı büyük ölçüde aynı olduğu için bu rehberde öğrenecekleriniz her ikisi için de geçerlidir.
Bu makalede bir sunucuya MySQL/MariaDB kurmaktan, güvenliğini sıkılaştırmaktan, veritabanı ve kullanıcı oluşturmaya, doğru yetkileri vermeye, temel SQL komutlarını kullanmaya ve mysqldump ile yedek alıp geri yüklemeye kadar günlük yönetim işlerini adım adım göreceksiniz. Terminal komutlarına yeniyseniz önce Linux temel komutları rehberine göz atmanız işinizi kolaylaştırır.
MySQL ve MariaDB Arasındaki Fark#
MariaDB, MySQL'in özgün geliştiricileri tarafından, MySQL'in Oracle tarafından satın alınmasının ardından açık kaynak kalması güvence altına alınsın diye başlatılmış bir çataldır. Pratikte:
- Komut uyumluluğu neredeyse tamdır; bu rehberdeki her komut ikisinde de çalışır.
- MariaDB genellikle varsayılan olarak daha açık lisanslıdır (tamamen GPL) ve bazı Linux dağıtımlarında
mysqlpaketi aslında MariaDB kurar. - Depolama motorları, bazı fonksiyonlar ve performans ayarlarında zamanla farklılıklar oluşmuştur, ancak temel yönetim işleri açısından aynı gibi düşünebilirsiniz.
Kendi sunucunuzu yönetiyorsanız (örneğin bir sanal sunucu (VPS) veya daha yüksek kaynaklı bir VDS sunucu) hangisini kurduğunuzun bir önemi yoktur; yönetim mantığı ikisinde de birebir aynıdır.
Kurulum#
Kurulum, kullandığınız dağıtıma göre değişir. Debian/Ubuntu tabanlı bir sistemde MariaDB kurmak için:
sudo apt update
sudo apt install mariadb-server
MySQL'i tercih ediyorsanız mysql-server paketini kurabilirsiniz. RHEL/AlmaLinux/Rocky tarafında ise:
sudo dnf install mariadb-server
Kurulumdan sonra servisi başlatıp sistem açılışında otomatik çalışacak şekilde etkinleştirin:
sudo systemctl start mariadb
sudo systemctl enable mariadb
Servisin durumunu kontrol etmek için:
sudo systemctl status mariadb
Çıktıda active (running) ifadesini görüyorsanız veritabanı sunucunuz çalışıyor demektir. Paylaşımlı web hosting paketlerinde bu adımlar sizin için hazırdır; veritabanı yönetimi genellikle cPanel veya benzeri bir arayüz üzerinden yapılır. Aşağıdaki adımlar kök erişimine sahip olduğunuz kendi sunucular içindir.
Güvenliği Sıkılaştırma: mysql_secure_installation#
Yeni bir kurulumda ilk yapmanız gereken şey mysql_secure_installation betiğini çalıştırmaktır. Bu betik, üretim ortamı için tehlikeli olabilecek varsayılan ayarları düzeltir:
sudo mysql_secure_installation
Betik sırayla şunları sorar:
- root parolasını ayarlama (veya modern kurulumlarda
unix_socketkimlik doğrulamasına geçiş). - Anonim kullanıcıları silme — kimlik doğrulaması olmadan bağlanabilen kullanıcılar kaldırılır.
- Uzaktan root girişini kapatma — root yalnızca yerel makineden bağlanabilir.
- Test veritabanını silme — kurulumla gelen boş
testveritabanı kaldırılır. - Yetki tablolarını yeniden yükleme — değişikliklerin hemen etkinleşmesi için.
Bu soruların tamamına güvenli seçeneği (genellikle Y) vermeniz önerilir. Bu adım, sunucunuza yönelik en yaygın otomatik saldırıların önemli bir kısmını daha en baştan etkisiz kılar.
MySQL Shell'e Giriş#
Veritabanı sunucusuyla etkileşim için mysql istemcisini kullanırsınız. Modern MariaDB/MySQL kurulumlarında yerel root, unix_socket yöntemiyle doğrulandığından çoğu zaman parola bile gerekmez:
sudo mysql
Parola ile giriş yapmanız gereken bir kullanıcı varsa -u ve -p bayraklarını kullanın:
mysql -u root -p
-p bayrağından sonra parolayı komut satırına yazmayın; istemci sizden güvenli biçimde, ekrana yansıtmadan soracaktır. Parolayı -p ile bitişik yazarsanız (örneğin -pParola123) bu değer terminal geçmişinize ve süreç listesine düşer; bu yüzden bitişik kullanımdan kaçının. Başarılı girişte komut istemi MariaDB [(none)]> ya da mysql> biçiminde değişir. Buradan çıkmak için exit; yazmanız yeterlidir.
SQL komutlarının her zaman noktalı virgül (;) ile bittiğini unutmayın. Noktalı virgülü unutursanız istemci komutun devam ettiğini varsayar ve yeni satırda -> göstererek beklemeye geçer.
Veritabanı ve Kullanıcı Oluşturma#
Her uygulamaya ayrı bir veritabanı ve o veritabanına özel bir kullanıcı vermek en iyi uygulamadır. Böylece bir uygulama ele geçirilse bile saldırgan diğer veritabanlarına erişemez.
Veritabanı Oluşturma#
Yeni bir veritabanı oluştururken karakter kümesini mutlaka utf8mb4 olarak belirtin. Eski utf8 (aslında utf8mb3) emoji ve bazı Türkçe olmayan karakterleri tam desteklemez; utf8mb4 gerçek dört baytlık UTF-8 desteği sunar:
CREATE DATABASE uygulama_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Burada utf8mb4_unicode_ci harmanlaması (collation), karşılaştırma ve sıralama kurallarını belirler; _ci eki büyük/küçük harf duyarsız (case-insensitive) anlamına gelir. Türkçe içerikler için utf8mb4_unicode_ci çoğu durumda doğru tercihtir.
Kullanıcı Oluşturma#
Şimdi bu veritabanına erişecek bir kullanıcı oluşturalım. 'localhost' kısmı, kullanıcının yalnızca aynı sunucudan bağlanabileceğini belirtir:
CREATE USER 'uygulama_kullanici'@'localhost'
IDENTIFIED BY 'guclu-bir-parola-buraya';
Parolanızın gerçekten güçlü olması kritik önemdedir. Tahmin edilmesi zor, uzun ve rastgele bir parola için parola üretici aracımızı kullanabilirsiniz. Parolayı bir yere kaydetmeden bu adımı geçmeyin; birazdan yetki verirken tekrar gerekmese de uygulama yapılandırmanızda kullanacaksınız.
GRANT ile Yetkilendirme#
Kullanıcı oluşturmak tek başına yetmez; kullanıcının bu veritabanı üzerinde ne yapabileceğini GRANT ile belirtmeniz gerekir. Tipik bir uygulama kullanıcısına yalnızca kendi veritabanı üzerinde tam yetki vermek en doğrusudur:
GRANT ALL PRIVILEGES ON uygulama_db.*
TO 'uygulama_kullanici'@'localhost';
Buradaki uygulama_db.* ifadesi "uygulama_db veritabanındaki tüm tablolar" anlamına gelir. Kullanıcı başka hiçbir veritabanına dokunamaz. Daha kısıtlı bir yetki isterseniz ALL PRIVILEGES yerine tek tek izinleri de verebilirsiniz:
GRANT SELECT, INSERT, UPDATE, DELETE ON uygulama_db.*
TO 'uygulama_kullanici'@'localhost';
Bu ikinci yaklaşım, kullanıcının tablo yapısını değiştirmesine (DROP, ALTER gibi) izin vermez; kurulumu tamamlanmış, yalnızca veri okuyup yazan uygulamalar için daha güvenlidir.
FLUSH PRIVILEGES#
Yetki değişikliklerinin bellekteki yetki tablolarına anında yansıması için:
FLUSH PRIVILEGES;
GRANT ve REVOKE komutları yetkileri zaten otomatik olarak yeniden yükler; bu yüzden çoğu durumda FLUSH PRIVILEGES çalıştırmanıza gerek kalmaz. Yalnızca mysql.user gibi yetki tablolarını doğrudan UPDATE ile düzenlediğinizde bu komut zorunlu hâle gelir. Yine de, yetki değişikliklerinden sonra bir refleks olarak çalıştırmak zararsızdır. Bir kullanıcının hâlihazırda hangi yetkilere sahip olduğunu görmek için:
SHOW GRANTS FOR 'uygulama_kullanici'@'localhost';
Temel SQL Komutları#
Günlük yönetim için ihtiyacınız olacak birkaç temel komuta göz atalım. Önce sunucudaki tüm veritabanlarını listeleyelim:
SHOW DATABASES;
Bir veritabanı üzerinde çalışmak için önce onu seçin:
USE uygulama_db;
Seçtiğiniz veritabanındaki tabloları listelemek için:
SHOW TABLES;
Bir tablonun sütun yapısını incelemek için:
DESCRIBE kullanicilar;
Ve elbette veri sorgulamak için en çok kullanacağınız komut SELECT'tir. Örneğin bir tablodaki ilk 10 kaydı görmek için:
SELECT id, ad, eposta
FROM kullanicilar
ORDER BY id DESC
LIMIT 10;
WHERE yan tümcesiyle koşul ekleyebilirsiniz:
SELECT * FROM kullanicilar
WHERE eposta LIKE '%@clou.tr'
LIMIT 20;
Bu komutlar, ister bir sorunu gidermek için ister rutin kontroller için olsun, veritabanınızla çalışırken en sık başvuracaklarınızdır. WordPress gibi bir CMS kuruyorsanız çoğu işi panel halleder, ama tablo düzeyinde bir sorun çıktığında bu komutlar hayat kurtarır. Kurulum adımları için WordPress kurulumu rehberimize bakabilirsiniz.
Yedekleme ve Geri Yükleme: mysqldump#
Veritabanı yedeği almadan hiçbir güncelleme veya taşıma işlemine girişmemelisiniz. En yaygın araç, MySQL/MariaDB ile birlikte gelen mysqldump'tır. Bu araç, veritabanınızı yeniden oluşturmaya yetecek tüm CREATE ve INSERT komutlarını içeren düz bir SQL dosyası üretir.
Tek bir veritabanının yedeğini almak için:
mysqldump -u root -p uygulama_db > uygulama_db_yedek.sql
Yedeğin boyutunu küçültmek için doğrudan gzip ile sıkıştırabilirsiniz:
mysqldump -u root -p uygulama_db | gzip > uygulama_db_yedek.sql.gz
Sunucudaki tüm veritabanlarını tek seferde yedeklemek için:
mysqldump -u root -p --all-databases > tum_veritabanlari.sql
Yedeği geri yüklemek için, önce hedef veritabanının var olduğundan emin olun, ardından dosyayı içe aktarın:
mysql -u root -p uygulama_db < uygulama_db_yedek.sql
Sıkıştırılmış bir yedeği doğrudan geri yüklemek için:
gunzip < uygulama_db_yedek.sql.gz | mysql -u root -p uygulama_db
Yedeklerin düzenli, otomatik ve sunucu dışında bir yerde saklanması gerektiğini unutmayın; aynı diskte duran yedek, disk arızasında sizi kurtarmaz. Otomatik, dış konuma yedekleme için bir yedekleme çözümü değerlendirebilir; sunucu göçü sırasında ise site taşıma hizmetimizden yararlanabilirsiniz.
Uzak Erişim ve Güvenlik#
Varsayılan olarak MySQL/MariaDB yalnızca yerel bağlantıları (localhost) dinleyecek şekilde ayarlıdır ve bu genellikle en güvenli yapılandırmadır. Uygulama sunucusuyla veritabanı sunucusu aynı makinedeyse uzaktan erişimi hiç açmamalısınız.
Farklı bir sunucudan bağlanmanız gerekiyorsa, adım adım şunları yapın:
- Yapılandırma dosyasında (
/etc/mysql/mariadb.conf.d/50-server.cnfveya benzeri)bind-addresssatırını, dinlenecek arayüze göre düzenleyin. Dış dünyaya açmadan önce iki kez düşünün. - Kullanıcıyı yalnızca belirli bir IP adresinden bağlanabilecek şekilde tanımlayın; asla
'%'(herkes) kullanmayın:
CREATE USER 'uzak_kullanici'@'203.0.113.10'
IDENTIFIED BY 'cok-guclu-parola';
GRANT ALL PRIVILEGES ON uygulama_db.*
TO 'uzak_kullanici'@'203.0.113.10';
FLUSH PRIVILEGES;
- Sunucunun güvenlik duvarında
3306portunu yalnızca güvendiğiniz IP'ye açın; tüm dünyaya açık bir MySQL portu, otomatik tarayıcıların ilk hedeflerindendir. - Mümkünse ham port yerine bir SSH tüneli veya TLS bağlantısı kullanın; böylece veritabanı trafiği şifrelenir.
Güvenlik ipucu: Güçlü parolalar, en az yetki ilkesi (kullanıcıya yalnızca ihtiyacı olan izinleri verin) ve kapalı bir güvenlik duvarı, MySQL güvenliğinin üç temel direğidir. Bunların üçünü birlikte uygulamadan hiçbir veritabanını internete açmayın.
Uygulama ile veritabanı arasındaki trafiği şifrelemek, bir web sitesi işletiyorsanız ziyaretçi trafiğini şifreleyen SSL sertifikası kadar önemlidir. WordPress gibi kritik uygulamaların bakım ve güvenliği için WordPress bakım hizmetimiz de düzenli yedek ve güncelleme yükünü üstlenir.
Sıkça Sorulan Sorular#
MySQL ile MariaDB arasında hangisini seçmeliyim?#
Çoğu kullanım senaryosu için ikisi de fazlasıyla yeterlidir ve komutları neredeyse aynıdır. MariaDB tamamen açık kaynak lisansıyla öne çıkar ve birçok Linux dağıtımında varsayılan gelir; belirli bir kurumsal MySQL özelliğine ihtiyacınız yoksa dağıtımınızla gelen paketi kullanmanız en pratik yoldur.
utf8 yerine neden utf8mb4 kullanmalıyım?#
MySQL'deki eski utf8, aslında karakter başına en fazla üç bayt saklayan eksik bir uygulamadır ve emoji ile bazı özel karakterleri kaydedemez. utf8mb4 gerçek dört baytlık UTF-8 desteği sunar; yeni veritabanlarını her zaman utf8mb4 ve utf8mb4_unicode_ci harmanlamasıyla oluşturmanız veri kaybını ve garip karakter hatalarını önler.
root parolamı unuttum, ne yapmalıyım?#
Sunucuya kök (SSH root) erişiminiz varsa, MySQL/MariaDB servisini --skip-grant-tables seçeneğiyle güvenli modda başlatıp yeni bir root parolası atayabilirsiniz. İşlem dağıtıma göre biraz değişir; adımları uygularken servisi geçici olarak dışarıya kapatmayı ve işlem bitince normal modda yeniden başlatmayı unutmayın.
Veritabanı yedeğini ne sıklıkla almalıyım?#
Bu, verinizin ne kadar sık değiştiğine bağlıdır. Aktif bir e-ticaret sitesi için günlük, hatta saatlik yedek makul olabilirken, nadiren güncellenen bir bilgi sitesi için haftalık yeterli olabilir. Kilit nokta yedeklerin otomatik olması ve sunucudan farklı bir konumda saklanmasıdır; el ile alınan ve unutulan yedekler işe yaramaz.
GRANT ALL PRIVILEGES vermek güvenli mi?#
Bir kullanıcıya ALL PRIVILEGES vermek, yalnızca o kullanıcının tek bir veritabanıyla (uygulama_db.*) sınırlandırıldığında makuldür. Asla *.* (tüm veritabanları) üzerinde geniş yetki vermeyin. En az yetki ilkesini benimseyin: uygulama yalnızca veri okuyup yazıyorsa SELECT, INSERT, UPDATE, DELETE izinleri çoğu zaman yeterlidir.
Uzaktan MySQL bağlantısını açmak zorunda mıyım?#
Hayır, ve gerekmedikçe açmamalısınız. Uygulama ve veritabanı aynı sunucudaysa localhost bağlantısı en güvenli seçenektir. Zorunluysa, erişimi yalnızca belirli IP adreslerine sınırlayın, güvenlik duvarında 3306 portunu daraltın ve mümkünse SSH tüneli ya da TLS kullanarak trafiği şifreleyin.
Buraya kadar geldiyseniz, MySQL/MariaDB üzerinde bir veritabanını ve kullanıcısını sıfırdan kurup güvenle yönetmek için gereken temel bilgiye sahipsiniz. Bu adımların tam kontrolünü isteyenler için kök erişimli bir VDS sunucu ideal bir başlangıçtır; kurulum ve yönetim yükünü üstlenmek istemeyenler ise veritabanı altyapısı hazır gelen web hosting paketleriyle daha az uğraşla yola çıkabilir. Hangi yolu seçerseniz seçin, düzenli yedek almayı ve en az yetki ilkesini alışkanlık hâline getirmeniz verilerinizi güvende tutmanın en sağlam yoludur. Sunucu tarafında rahatça hareket etmek istiyorsanız, bir sonraki durak olarak SSH bağlantısı ve güvenliği ile sunucu güvenliği temelleri rehberlerimizi de okumanızı öneririz.