
MySQL/MariaDB Veritabanı Yönetimi: Bağlantı, CRUD, JOIN, Transaction ve EXPLAIN (2026)
MySQL ve MariaDB yönetiminde temel sysadmin akışı: bağlantı kurma, DDL, veri tipleri, charset, CRUD işlemleri, JOIN türleri, transaction, stored procedure, view, yedekleme ve EXPLAIN sorgu analizi.
MySQL/MariaDB Veritabanı Yönetimi: Bağlantı, CRUD, JOIN, Transaction ve EXPLAIN Rehberi (2026)
MySQL ve MariaDB yönetmek salt "SQL çalıştırmak" değil; bağlantı, şema tasarımı, CRUD güvenliği, JOIN optimizasyonu, transaction güvenliği ve sorgu analizi döngüsünü birlikte yürütmek demek. Bu rehberde temel sysadmin akışını — bağlantıdan DDL'e, CRUD'tan JOIN ve transaction'a, yedeklemeden EXPLAIN kullanımına — pratik örneklerle aktarıyoruz.
Buyukweb perspektifi: cPanel hosting paketlerimizde MariaDB 10.6 LTS + phpMyAdmin standart olarak sunuluyor. VDS paketlerimizde dedicated MariaDB/MySQL kurulumu yapabilir,
my.cnfüzerinde tam kontrol sağlarsınız. Bu yazı genel MySQL/MariaDB sysadmin akışı odaklı; performans tuning ve replikasyon için ilgili rehberlere bağlantı verilmiştir.
MySQL/MariaDB Bağlantısı: CLI, phpMyAdmin, DBeaver, Workbench
Komut Satırı (mysql client)
# Yerel sunucuya root bağlantısı
mysql -u root -p
# Uzak sunucuya belirli bir DB'ye bağlan
mysql -h 192.168.1.10 -u appuser -p site_db
# Tek komut çalıştır (otomasyon, cron)
mysql -u root -p -e "SHOW STATUS LIKE 'Uptime';"
# Port belirterek bağlan
mysql -h db.sunucu.com -P 3306 -u appuser -p site_db
Grafik Araçlar
| Araç | Kullanım Senaryosu | Not |
|---|---|---|
| phpMyAdmin | cPanel hosting, tarayıcı tabanlı | Buyukweb cPanel'de dahili gelir |
| DBeaver | Çoklu DB destekli masaüstü IDE | MySQL, PostgreSQL, SQLite aynı UI |
| MySQL Workbench | MySQL resmi GUI, ERD + migration | Remote MySQL whitelist gerekli (aşağıda) |
| TablePlus | macOS/Windows hızlı GUI | SSH tüneli ile VDS bağlantısı |
Tercih etmeyin: phpMyAdmin'i production otomasyonu için kullanmayı. Export/Import işlemleri büyük DB'lerde timeout'a girer;
mysqldumpkomut satırı her zaman tercih edilmeli.
Veritabanı ve Tablo Yönetimi: DDL Temelleri
Veritabanı Operasyonları
-- Veritabanı oluştur (charset ve collation ile birlikte — kritik)
CREATE DATABASE site_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Mevcut veritabanlarını listele
SHOW DATABASES;
-- Çalışılacak veritabanını seç
USE site_db;
-- Veritabanını sil (geri dönüşü yok, dikkatli kullan)
DROP DATABASE eski_db;
Tablo Operasyonları
-- Tablo oluştur
CREATE TABLE kullanicilar (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
durum TINYINT(1) NOT NULL DEFAULT 1,
olusturma DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
guncelleme DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Mevcut tabloları listele
SHOW TABLES;
-- Tablo yapısını incele
DESCRIBE kullanicilar;
SHOW CREATE TABLE kullanicilar;
-- Tabloya sütun ekle
ALTER TABLE kullanicilar ADD COLUMN telefon VARCHAR(20) AFTER email;
-- Sütun tipini değiştir
ALTER TABLE kullanicilar MODIFY COLUMN ad VARCHAR(150) NOT NULL;
-- Sütun sil
ALTER TABLE kullanicilar DROP COLUMN eski_alan;
-- Tabloyu sil
DROP TABLE temp_tablo;
-- Tüm kayıtları sil ama tabloyu koru (TRUNCATE auto_increment'i sıfırlar)
TRUNCATE TABLE log_kayitlari;
Veri Tipleri 2026: Doğru Seçim Performansı Etkiler
Sayısal Tipler
| Tip | Aralık | Ne Zaman? |
|---|---|---|
| TINYINT(1) | 0-255 / -128-127 | Boolean (0/1), küçük sayaç |
| INT | ±2.1 milyar | Genel ID, sayaç |
| BIGINT | ±9.2 × 10¹⁸ | Büyük tablolar, sosyal ID |
| DECIMAL(10,2) | Kesin ondalık | Para, vergi — FLOAT kullanma |
| FLOAT/DOUBLE | Yaklaşık | Bilimsel hesap, koordinat (toleranslı) |
Tercih etmeyin: Para hesapları için FLOAT veya DOUBLE kullanmayı — yuvarlama hatası kaçınılmaz. DECIMAL(10,2) kullanın.
Metin Tipleri
| Tip | Max Boyut | Ne Zaman? |
|---|---|---|
| VARCHAR(N) | 65535 byte | Dinamik uzunluk metin (ad, başlık) |
| TEXT | 65 KB | Blog paragrafı, açıklama |
| MEDIUMTEXT | 16 MB | Makale içeriği, HTML |
| LONGTEXT | 4 GB | Log dosyası, büyük veri |
| CHAR(N) | 255 karakter | Sabit uzunluk (ISO kodu, hash) |
Tarih/Zaman Tipleri
| Tip | Aralık | Not |
|---|---|---|
| DATE | 1000-9999 | Sadece tarih |
| DATETIME | 1000-9999, saat dahil | Saat diliminden bağımsız |
| TIMESTAMP | 1970-2038 | UTC saklar, saat dilimiyle dönüştürür |
| TIME | -838:59:59 – 838:59:59 | Süre, çalışma saati |
Not: TIMESTAMP 2038 sorununu göz önünde bulundurun; uzun vadeli tarih verisi için DATETIME tercih edin.
Modern Tipler
-- JSON (MariaDB 10.2+, MySQL 5.7+ native)
ALTER TABLE urunler ADD COLUMN ozellikler JSON;
SELECT JSON_EXTRACT(ozellikler, '$.renk') FROM urunler WHERE id = 1;
-- SPATIAL (coğrafi veri)
CREATE TABLE lokasyonlar (
id INT AUTO_INCREMENT PRIMARY KEY,
isim VARCHAR(100),
konum POINT NOT NULL,
SPATIAL INDEX(konum)
) ENGINE=InnoDB;
-- ENUM — kullanım uyarısı
ALTER TABLE siparisler ADD COLUMN durum ENUM('beklemede','tamamlandi','iptal') DEFAULT 'beklemede';
-- Uyarı: ENUM'a yeni değer eklemek ALTER TABLE gerektirir ve büyük tablolarda yavaştır.
-- Modern alternatif: TINYINT + uygulama katmanı mapping.
Charset ve Collation: utf8mb4 Neden Şart?
MySQL'deki utf8 (3 byte) emoji ve bazı unicode karakterleri saklayamaz — bu bir bug değil tasarım sınırı. utf8mb4 (4 byte) tam unicode desteği sağlar; 2026'da yeni tablo için utf8 kullanmak hata.
| Collation | Karşılaştırma | Ne Zaman? |
|---|---|---|
| utf8mb4_general_ci | Hızlı, basit | Eski sistemler, Türkçe olmayan |
| utf8mb4_unicode_ci | Locale-aware, doğru | Türkçe karakter için tercih |
| utf8mb4_bin | Binary, case-sensitive | Hash karşılaştırma, kod değerleri |
| utf8mb4_0900_ai_ci | MySQL 8.0 varsayılanı | En güncel unicode kuralları |
Türkçe için: utf8mb4_unicode_ci kullanın — "ş", "ğ", "ı", "ö", "ü" doğru sıralanır ve büyük/küçük harf dönüşümü tutarlı çalışır. general_ci'da bazı Türkçe karşılaştırmalar hatalı sonuç verir.
-- Mevcut DB charset'ini güncelle
ALTER DATABASE site_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Tablo charset'ini güncelle (içeriği de dönüştürür)
ALTER TABLE kullanicilar
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CRUD İşlemleri: SELECT, INSERT, UPDATE, DELETE
SELECT
-- Temel sorgulama
SELECT id, ad, email FROM kullanicilar WHERE durum = 1;
-- WHERE koşulları
SELECT * FROM siparisler
WHERE toplam > 100
AND olusturma >= '2026-01-01'
AND durum IN ('tamamlandi', 'beklemede');
-- GROUP BY + HAVING
SELECT musteri_id, COUNT(*) AS siparis_sayisi, SUM(toplam) AS toplam_tutar
FROM siparisler
WHERE olusturma >= '2026-01-01'
GROUP BY musteri_id
HAVING siparis_sayisi > 3
ORDER BY toplam_tutar DESC
LIMIT 20;
-- Sayfalama (OFFSET performans notu)
SELECT * FROM urunler ORDER BY id LIMIT 20 OFFSET 100;
-- Büyük tablolarda OFFSET yavaşlar; keyset pagination tercih et:
SELECT * FROM urunler WHERE id > 500 ORDER BY id LIMIT 20;
INSERT
-- Tekil kayıt
INSERT INTO kullanicilar (ad, email, durum)
VALUES ('Ahmet Yılmaz', '[email protected]', 1);
-- Toplu kayıt (bulk insert — tek seferde verimli)
INSERT INTO log_kayitlari (kullanici_id, eylem, tarih) VALUES
(1, 'giris', NOW()),
(2, 'siparis_ver', NOW()),
(3, 'profil_guncelle', NOW());
-- Çakışmada güncelle (upsert)
INSERT INTO sayac (anahtar, deger)
VALUES ('ziyaret', 1)
ON DUPLICATE KEY UPDATE deger = deger + 1;
UPDATE
-- WHERE filtresi ZORUNLU — unutursan tüm tabloya yazarsın
UPDATE kullanicilar
SET ad = 'Ahmet Y.', guncelleme = NOW()
WHERE id = 42;
-- Çoklu tablo güncelleme
UPDATE siparisler s
JOIN kullanicilar k ON s.musteri_id = k.id
SET s.durum = 'iptal'
WHERE k.email = '[email protected]' AND s.durum = 'beklemede';
-- Test etmeden önce SELECT ile doğrula
SELECT COUNT(*) FROM kullanicilar WHERE durum = 0; -- kaç kayıt etkilenecek?
UPDATE kullanicilar SET durum = 0 WHERE olusturma < '2020-01-01';
DELETE
-- WHERE filtresi ZORUNLU
DELETE FROM oturumlar WHERE son_aktivite < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- Çok büyük silme işlemi — batch ile yap (lock önlemek için)
DELETE FROM log_kayitlari WHERE tarih < '2025-01-01' LIMIT 1000;
-- Cron ile tekrarla; tek seferde milyonlarca kayıt silmek tabloyu kilitler.
-- TRUNCATE: WHERE yok, tüm içeriği siler, auto_increment sıfırlanır
TRUNCATE TABLE gecici_veriler;
JOIN Türleri: INNER, LEFT, RIGHT, CROSS, Self-JOIN
-- INNER JOIN: sadece her iki tabloda eşleşen kayıtlar
SELECT s.id, k.ad, s.toplam
FROM siparisler s
INNER JOIN kullanicilar k ON s.musteri_id = k.id
WHERE s.durum = 'tamamlandi';
-- LEFT JOIN: sol tablodaki tüm kayıtlar + eşleşenler (sağda null olabilir)
SELECT k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
-- Hiç sipariş vermemiş müşteriler: siparis_sayisi = 0 olarak gelir
-- RIGHT JOIN: sağ tablodaki tüm kayıtlar (nadiren kullanılır; LEFT JOIN yeter)
SELECT s.id, k.ad
FROM siparisler s
RIGHT JOIN kullanicilar k ON s.musteri_id = k.id;
-- FULL OUTER JOIN: MySQL native desteklemez — UNION ile simüle et
SELECT k.ad, s.id AS siparis_id
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
UNION
SELECT k.ad, s.id
FROM kullanicilar k
RIGHT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.id IS NULL;
-- CROSS JOIN: kartezyen çarpım (tüm kombinasyonlar) — büyük tablolarda dikkatli
SELECT r.renk, b.beden
FROM renkler r
CROSS JOIN bedenler b;
-- Self-JOIN: aynı tabloya kendin join (hiyerarşi, çalışan-yönetici)
SELECT c.ad AS calisan, y.ad AS yonetici
FROM calisanlar c
LEFT JOIN calisanlar y ON c.yonetici_id = y.id;
Performans notu: JOIN edilen sütunlara indeks ekleyin.
ON s.musteri_id = k.idiçinsiparisler.musteri_idsütununa INDEX gereklidir. Detay için veritabanı indeksleme rehberimize bakın.
Temel İndeksleme: PRIMARY KEY, UNIQUE, INDEX, FULLTEXT
İndeksleme ayrı bir yazının konusu; burada temel sözdizimi:
-- PRIMARY KEY (InnoDB'de clustered — fiziksel sıralama)
ALTER TABLE kullanicilar ADD PRIMARY KEY (id);
-- UNIQUE index (tekrar eden değer reddedilir)
CREATE UNIQUE INDEX idx_email ON kullanicilar(email);
-- B-Tree index (varsayılan — WHERE, JOIN, ORDER BY için)
CREATE INDEX idx_durum_tarih ON siparisler(durum, olusturma);
-- FULLTEXT (metin arama — LIKE '%...%' alternatifi)
ALTER TABLE makaleler ADD FULLTEXT INDEX ft_baslik_icerik(baslik, icerik);
SELECT * FROM makaleler WHERE MATCH(baslik, icerik) AGAINST('mysql yönetim' IN BOOLEAN MODE);
-- Index sil
DROP INDEX idx_eski ON kullanicilar;
-- Mevcut indexleri listele
SHOW INDEX FROM kullanicilar;
Stored Procedure ve Trigger
Stored Procedure
DELIMITER //
CREATE PROCEDURE musteri_sil(IN musteri_id INT, OUT silinen_siparis INT)
BEGIN
-- Önce bağlı siparişleri sil
DELETE FROM siparisler WHERE musteri_id = musteri_id;
SET silinen_siparis = ROW_COUNT();
-- Sonra müşteriyi sil
DELETE FROM kullanicilar WHERE id = musteri_id;
END //
DELIMITER ;
-- Çağır
CALL musteri_sil(42, @silinen);
SELECT @silinen AS silinen_siparis;
Trigger
DELIMITER //
CREATE TRIGGER siparis_sonrasi_stok_guncelle
AFTER INSERT ON siparis_kalemleri
FOR EACH ROW
BEGIN
UPDATE urunler
SET stok = stok - NEW.miktar
WHERE id = NEW.urun_id;
END //
DELIMITER ;
Modern best-practice: Stored procedure ve trigger iş mantığını DB'ye gömer — test, versiyon kontrolü ve ölçeklendirme zorlaşır. Çoğu modern uygulama bu mantığı uygulama katmanına (ORM, servis katmanı) taşır. Stored procedure meşru kullanım: raporlama, batch işlem, legacy sistemlerle entegrasyon.
Transaction: ACID ve Isolation Levels
Temel Kullanım
START TRANSACTION;
UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;
UPDATE hesaplar SET bakiye = bakiye + 500 WHERE id = 2;
-- Her iki güncelleme başarılıysa kaydet
COMMIT;
-- Hata varsa geri al
-- ROLLBACK;
SAVEPOINT ile Kısmi Geri Alma
START TRANSACTION;
INSERT INTO siparisler (musteri_id, toplam) VALUES (5, 150);
SAVEPOINT siparis_eklendi;
INSERT INTO siparis_kalemleri (siparis_id, urun_id, miktar) VALUES (LAST_INSERT_ID(), 10, 2);
-- Bu satır hata verirse sadece kalemleri geri al, siparişi koru
ROLLBACK TO SAVEPOINT siparis_eklendi;
COMMIT;
ACID Özellikleri
| Özellik | Ne Demek? |
|---|---|
| Atomicity | Transaction ya tamamen tamamlanır ya hiç — yarım kalmaz |
| Consistency | DB kısıtları (FK, UNIQUE) transaction sonrası geçerli kalır |
| Isolation | Eş zamanlı transaction'lar birbirini bozmaz |
| Durability | COMMIT sonrası veri disk arızasında bile korunur |
Isolation Levels (InnoDB)
| Seviye | Phantom Read | Non-repeatable Read | Ne Zaman? |
|---|---|---|---|
| READ UNCOMMITTED | Var | Var | Neredeyse hiç kullanılmaz |
| READ COMMITTED | Var | Yok | Yüksek eşzamanlılık, gevşek tutarlılık |
| REPEATABLE READ | Yok* | Yok | InnoDB varsayılanı — dengeli |
| SERIALIZABLE | Yok | Yok | Maksimum tutarlılık, en düşük eşzamanlılık |
*InnoDB MVCC ile REPEATABLE READ'de phantom read büyük ölçüde önlenir.
-- Oturum için isolation level değiştir
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- Mevcut seviyeyi kontrol et
SELECT @@transaction_isolation;
View ve Materialized View
View (Sanal Tablo)
-- View oluştur — kayıt edilen sorgu
CREATE VIEW aktif_musteriler AS
SELECT k.id, k.ad, k.email, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.durum = 1
GROUP BY k.id, k.ad, k.email;
-- View'dan sorgula
SELECT * FROM aktif_musteriler WHERE siparis_sayisi > 5;
-- View güncelle
CREATE OR REPLACE VIEW aktif_musteriler AS SELECT k.id, k.ad, k.email
FROM kullanicilar k WHERE k.durum = 1;
-- View sil
DROP VIEW aktif_musteriler;
Materialized View (MySQL'de Native Yok)
MySQL/MariaDB native materialized view desteği sunmaz. Manuel yöntem:
-- Sonuç tablosunu oluştur
CREATE TABLE mat_musteri_ozet AS
SELECT k.id, k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
-- Cron ile periyodik yenile (örn. her gece 03:00)
TRUNCATE TABLE mat_musteri_ozet;
INSERT INTO mat_musteri_ozet
SELECT k.id, k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
Yoğun sorgu çekilen raporlama tablolarında bu yaklaşım anlamlı performans kazancı sağlar.
Yedekleme: mysqldump, mariabackup, Binlog
Detaylı yedekleme stratejisi için veritabanı yedekleme rehberimize bakın. Temel komutlar:
# mysqldump — mantıksal yedek (küçük-orta DB)
mysqldump -u root -p --single-transaction --quick \
site_db | gzip > /backups/site_$(date +%Y%m%d).sql.gz
# Tüm veritabanları
mysqldump -u root -p --single-transaction --all-databases \
| gzip > /backups/all_$(date +%Y%m%d).sql.gz
# Geri yükleme
gunzip < /backups/site_20260510.sql.gz | mysql -u root -p site_db
# mariabackup — fiziksel yedek (büyük DB, sıfır downtime)
mariabackup --backup --target-dir=/backups/mb_full \
--user=root --password=SIFRE
# Binary log (incremental, PITR)
# /etc/mysql/mariadb.conf.d/50-server.cnf:
# log_bin = /var/log/mysql/binlog
# binlog_format = ROW
Buyukweb hosting: cPanel paketlerimizde JetBackup ile haftalık otomatik yedekleme harici sunuculara yapılır. Günlük veya saatlik PITR gerekiyorsa yukarıdaki cron + binlog kurulumunu kendi VDS'inize uygulayın.
User ve Privilege Yönetimi
-- Kullanıcı oluştur
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'guclu_sifre';
CREATE USER 'raporcu'@'%' IDENTIFIED BY 'guclu_sifre'; -- tüm IP
-- Yetki ver
GRANT SELECT, INSERT, UPDATE, DELETE ON site_db.* TO 'appuser'@'localhost';
GRANT SELECT ON site_db.* TO 'raporcu'@'%';
-- Tek tabloya yetki
GRANT SELECT ON site_db.kullanicilar TO 'readonly'@'localhost';
-- Yetkileri yenile (MariaDB 10.4+ otomatik; eski sürümlerde gerekli)
FLUSH PRIVILEGES;
-- Kullanıcı yetkilerini gör
SHOW GRANTS FOR 'appuser'@'localhost';
-- Yetki iptal et
REVOKE DELETE ON site_db.* FROM 'appuser'@'localhost';
-- Kullanıcı sil
DROP USER 'eski_kullanici'@'localhost';
-- Mevcut kullanıcıları listele
SELECT user, host FROM mysql.user;
Güvenlik kuralı: Her uygulama için ayrı kullanıcı, sadece ihtiyaç duyduğu yetki. Root kullanıcıyı uygulama bağlantısı için kullanmayın. '%' yerine mümkünse spesifik IP/host belirtin.
Performans Temeli: EXPLAIN, slow_query_log, OPTIMIZE TABLE
EXPLAIN ile Sorgu Planı Okuma
EXPLAIN SELECT k.ad, COUNT(s.id)
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.durum = 1
GROUP BY k.id;
Kritik EXPLAIN sütunları:
| Sütun | İyi | Kötü |
|---|---|---|
| type | ref, range, eq_ref, const | ALL (tam tablo tarama) |
| key | index adı var | NULL (index kullanılmıyor) |
| rows | Küçük sayı | Milyon+ (gereksiz tarama) |
| Extra | Using index | Using filesort, Using temporary |
type=ALL görürseniz: ilgili WHERE/JOIN sütununa index ekleyin.
-- EXPLAIN ANALYZE (MariaDB 10.9+, MySQL 8.0.18+) — gerçek çalışma süresi
EXPLAIN ANALYZE SELECT * FROM siparisler WHERE durum = 'beklemede';
slow_query_log
# /etc/mysql/mariadb.conf.d/50-server.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# pt-query-digest ile slow log analiz (Percona Toolkit)
pt-query-digest /var/log/mysql/slow.log | head -50
OPTIMIZE TABLE
-- Tablo parçalanmasını gider (InnoDB: rebuild yapar)
OPTIMIZE TABLE siparisler;
-- Birden fazla tablo
OPTIMIZE TABLE kullanicilar, siparisler, urunler;
Dikkat:
OPTIMIZE TABLEInnoDB'de tablo rebuild yapar — büyük tablolarda süre alır ve kısa kilitlenmeye neden olabilir. Production saatlerinde dikkatli kullanın.
cPanel'de MySQL Yönetimi: Sınırlamalar ve Geçici Çözümler
Buyukweb cPanel hosting paketlerinde MySQL/MariaDB yönetimi:
- MySQL Databases UI: DB oluşturma, kullanıcı atama, yetki verme — temel işlemler için yeterli. Detaylı DDL ve EXPLAIN için yetersiz.
- phpMyAdmin: Tablo yapısı, basit sorgular, küçük dump import/export. phpMyAdmin rehberimize bakın.
- Kaynak limitleri: CloudLinux LVE ile CPU/RAM sınırı uygulanır. Ağır sorgular bu limiti tetikler; optimize edilmemiş JOIN veya tam tablo taraması sorun çıkarır.
- MySQL Workbench remote bağlantı: cPanel > Remote MySQL menüsünden bağlanacağınız IP'yi whitelist'e eklemeniz gerekir.
cPanel > Veritabanları > Remote MySQL > IP ekle
Sonra: mysql -h hosting.buyukweb.com -u kullanici -p
cPanel'de yapılamayan şeyler: my.cnf değişikliği, global değişken ayarı (innodb_buffer_pool_size), binary log yönetimi. Bunlar için VDS tercih edin.
Buyukweb Altyapısı: cPanel + MariaDB 10.6 + Redis
| Bileşen | cPanel Hosting | VDS |
|---|---|---|
| DB motoru | MariaDB 10.6 LTS | Tercihli MariaDB/MySQL |
| Yönetim | cPanel UI + phpMyAdmin | Komut satırı + my.cnf tam kontrol |
| Yedekleme | JetBackup haftalık | Müşteri sorumluluğu (cron + mariabackup) |
| Redis | Object Cache (eklenti) | Dedicated Redis kurulumu |
| Replikasyon | Desteklenmez | Desteklenir — detay: replikasyon rehberi |
| Kaynak | CloudLinux LVE paylaşımlı | Dedicated CPU/RAM |
VDS için Bursa Tier 3 veri merkezimizde dedicated MariaDB kurulumu, my.cnf optimizasyonu ve replikasyon yapılandırması yapabilirsiniz. Performans tuning için MySQL performans rehberimize bakın.
Sıkça Sorulan Sorular
MySQL mı MariaDB mı?
MariaDB, MySQL 5.5'ten fork alındı; çoğu sözdizimi ve araç uyumlu. MariaDB'nin avantajları: Galera Cluster native, gelişmiş query optimizer, Aria depolama motoru. MySQL 8.0'ın avantajları: JSON tablo fonksiyonları, window functions daha olgun, Oracle aktif geliştirme. Buyukweb cPanel hosting'de MariaDB 10.6 LTS kullanılır; her ikisiyle yazılan SQL büyük ölçüde taşınabilir.
JOIN'ler yavaş, ne yapayım?
EXPLAIN ile type=ALL var mı kontrol edin. JOIN sütunlarına (ON koşulu) index ekleyin. Gereksiz sütun seçmeyin (SELECT * yerine ihtiyaç duyulan sütunlar). Çok tablolu karmaşık JOIN'leri parçalara bölün veya geçici tablo kullanın.
Stored procedure mantıklı mı?
Raporlama ve batch işlemler için evet; uygulama iş mantığı için hayır. Modern uygulamalarda iş mantığı uygulama katmanında — test edilebilir, versiyon kontrollü, framework bağımsız. Stored procedure test ve CI/CD entegrasyonu zorlaştırır.
Transaction her zaman gerekli mi?
Birden fazla tabloyu birlikte değiştiriyorsanız (örn. sipariş + stok güncelleme) transaction şart. Tek tablo tek satır güncellemede InnoDB zaten implicit transaction kullanır. Uzun süreli transaction'lardan kaçının — kilit tutma süresini uzatır.
EXPLAIN nasıl okunur?
type sütununa bakın: ALL kötü (tam tarama), ref/range/eq_ref iyi (index kullanıyor). key NULL ise index kullanılmıyor demek. rows çok yüksekse sorgu gereğinden fazla veri tarıyor. Extra sütununda Using filesort veya Using temporary varsa sıralama veya gruplama pahalı — index veya sorgu yapısını gözden geçirin.
phpMyAdmin yetersiz kaldığında ne kullanmalıyım?
Karmaşık sorgu geliştirme ve analiz için DBeaver (ücretsiz, çoklu DB) veya MySQL Workbench kullanın. Remote bağlantı için cPanel > Remote MySQL'den IP whitelist gerekli. Otomasyon ve büyük dump işlemleri için her zaman komut satırı (mysql, mysqldump) tercih edin.
Sonuç
MySQL/MariaDB sysadmin akışı: doğru charset ile DB oluşturma, CRUD'ta WHERE filtresi zorunluluğu, JOIN'lerde index gerekliliği, transaction ile veri tutarlılığı ve EXPLAIN ile sorgu doğrulama — bu beş adım temel yönetim kalitesini belirler. Buyukweb cPanel hosting'de MariaDB 10.6 + JetBackup ile başlangıç altyapısı hazır; ölçek için VDS'e geçişte dedicated MySQL yapılandırması ve replikasyon yapılandırabilirsiniz.
Destek için: 0850 302 60 70 veya iletişim sayfamız.
İlgili Büyükweb Hizmetleri
Veritabanı ve hosting altyapısı için paketler:
- cPanel Web Hosting — MariaDB 10.6 + phpMyAdmin + JetBackup dahil
- VDS Sunucu — Dedicated MariaDB, root erişim, tam my.cnf kontrolü
- E5 v4 VDS — Yüksek IOPS NVMe, replikasyon ve yedekleme için ideal
- WordPress Hosting — LiteSpeed + Redis Object Cache
- Fiziksel Dedicated — Maksimum kaynak, üretim DB için
Sorularınız için 0850 302 60 70 numaralı destek hattımıza yazabilirsiniz.
Veritabanı Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

