FibaCloud
İçeriğe geç
Soru sor

Kapatmak için ESC tuşuna basın

MySQL 8.4: Veritabanı, Kullanıcı ve Yetki Yönetimi

Bu rehber çalışan bir MySQL 8.4 LTS sunucusunda yeni bir uygulama veritabanı, sınırlı kullanıcı ve örnek tablo oluşturur. CRUD işlemlerini, transaction geri almasını ve ayrı bir veritabanına yedek dönüşünü uygulayacağız. Kurulum gerekiyorsa önce Ubuntu üzerinde MySQL rehberini tamamlayın.

Kullanıcı, veritabanı ve yetki sınırı
Kullanıcı, veritabanı ve yetki sınırı Uygulama hesabının erişimi ihtiyaç duyduğu veritabanıyla sınırlanır. Okuma hesabına yazma yetkisi verilmez; yedekleme hesabının yetkileri kullanılan yönteme göre ayrıca belirlenir.
Görselin adım adım açıklaması
  1. Ayır: Yönetim ve uygulama hesaplarını ayır.
  2. Sınırla: Yetkileri ilgili veritabanında tanımla.
  3. Dene: İzin verilen ve reddedilen işlemleri test et.
  4. İzle: Gereksiz izinleri düzenli olarak kaldır.

Yönetici ve uygulama hesabını ayırın

Sunucu yönetimi için yetkili bir hesap gerekir. Uygulama bu hesabın parolasını kullanmamalıdır. Aşağıdaki appdb, appdb_restore ve fc_app adları yeni test kaynaklarını belirtir. Mevcut bir veritabanı veya kullanıcıyla çakışıyorsa devam etmeyin. Yönetici parolasını komuta yazmak yerine mysql -u root -p ile etkileşimli girin.

SELECT VERSION(), CURRENT_USER();
SHOW DATABASES;
SELECT User, Host FROM mysql.user WHERE User='fc_app';

Bir bulut sunucusu, yönetilen veritabanı veya HA seçeneğinin bulunması tek başına MySQL replikasyonu, otomatik failover, yedekleme veya belirli bir RPO garantisi vermez. Hizmetin güncel kapsamını ve fiyatlarını FibaCloud hizmetleri üzerinden inceleyin; satın alma/portal seçeneklerini SQL adımlarının ön koşulu gibi varsaymayın.

utf8mb4 şemasını ve örnek tabloyu oluşturun

Yönetici oturumunda:

CREATE DATABASE appdb
  CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE appdb.tasks (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(200) NOT NULL,
  done BOOLEAN NOT NULL DEFAULT FALSE
) ENGINE=InnoDB;
CREATE USER 'fc_app'@'localhost' IDENTIFIED BY RANDOM PASSWORD;
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'fc_app'@'localhost';
SHOW GRANTS FOR 'fc_app'@'localhost';

Üretilen parolayı güvenli kaydedin. Bu kullanıcı yalnız appdb içinde veri okuyabilir/değiştirebilir; hesap oluşturma veya tablo yapısını değiştirme yetkisi yoktur. GRANT ALL ON *.* ve WITH GRANT OPTION bu uygulama için gerekli değildir. Şema migrasyonları için ayrı, dar kapsamlı bir hesap kullanın.

Gerçek veriyi okuyun ve transaction ile geri alın

Ayrı terminalde uygulama hesabıyla bağlanın:

mysql --protocol=SOCKET --default-character-set=utf8mb4 -u fc_app -p appdb
INSERT INTO tasks(title) VALUES
  ('İstanbul yedeği 🚀'), ('Verify restore');
SELECT id, title, done FROM tasks ORDER BY id;
START TRANSACTION;
SELECT id, title, done FROM tasks WHERE id=1 FOR UPDATE;
UPDATE tasks SET done=TRUE WHERE id=1;
SELECT ROW_COUNT();
SELECT id, title, done FROM tasks WHERE id=1;
ROLLBACK;
SELECT id, title, done FROM tasks WHERE id=1;

Güncelleme bir satırı etkilemeli; ROLLBACK sonrasında done yeniden 0 olmalıdır. Gerçek işte hedef satırları ve etkilenen sayıyı doğruladıktan sonra bilinçli olarak COMMIT seçersiniz. Bu transaction örneği InnoDB içindir; DDL ifadelerinin örtük commit davranışını aynı alıştırmayla karıştırmayın. DELETE işlemi öncesinde de aynı WHERE koşuluyla SELECT çalıştırın; WHERE içermeyen silme örneklerini üretimde denemeyin.

Yetki sınırının çalıştığını kanıtlayın

Uygulama oturumunda CREATE TABLE permission_probe(id INT); yetki hatası vermelidir. Başka bir şemaya erişim ve CREATE USER girişimi de reddedilmelidir. Yanlış parolayla bağlantının reddedildiğini ayrıca kontrol edin. Beklenen retler erişim modelinin kabul testidir.

Yerel socket için TLS ayarı gerekmez. Ağ üzerinden bağlanacaksanız TLS sertifikasını doğrulayın ve yalnız gerekli özel ağ/kaynak adresine izin verin. phpMyAdmin kullanımı bu rehberin kurulum kapsamı değildir; resmî güvenli kurulum yönergeleri doğrultusunda HTTPS, erişim kısıtı ve güncelleme planı gerektirir.

Yedeği ayrı veritabanına geri yükleyin

Yönetici shell’inde özel bir yedek dizini hazırlayın. Aşağıdaki dosya yolunun var olan bir yedeği ezmediğini kontrol edin; düzenli işler için zaman damgalı, benzersiz dosya adları kullanın.

umask 077
backup_dir="$HOME/fc-backups"
install -d -m 700 "$backup_dir"
mysqldump -u root -p --single-transaction --routines --events --triggers \
  --set-gtid-purged=OFF --no-tablespaces appdb > "$backup_dir/appdb.sql"

Komutun başarılı çıkışını ve dosyanın boş olmadığını doğrulayın. --single-transaction bu InnoDB örneğinde tutarlı veri görüntüsü sağlar; dump sırasında DDL çalıştırmayın. Transaction desteklemeyen tablolar için bu yöntem tek başına yeterli değildir. Örnekte --databases kullanılmadığından dump ayrı hedefe yüklenebilir.

Yönetici MySQL oturumunda hedefi oluşturun:

CREATE DATABASE appdb_restore
  CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
mysql -u root -p appdb_restore < "$backup_dir/appdb.sql"
SELECT * FROM appdb.tasks ORDER BY id;
SELECT * FROM appdb_restore.tasks ORDER BY id;

İki satır, başlıklar ve done değerleri aynı olmalıdır. Gerçek uygulamada index, trigger, routine, event, uygulama davranışı ve yetki bağımlılıkları da kontrol edilir. Dump kullanıcı/grant kaydı içermez; bunların ayrı güvenli kaydı gerekir. Geri yükleme testinde kaynak veritabanının üzerine yazmayın. Yedeği aynı sunucuda bırakmak felaket kurtarma planı değildir; erişimi ayrılmış bir kopya ve günlük yedekleme planı hazırlayın.

Hata giderme ve temizlik

Access denied durumunda parola, User@Host, bağlantı protokolü ve SHOW GRANTS çıktısını birlikte kontrol edin; global yetki vermeyin. Unknown database durumunda hedef adı doğrulayın. Geri yükleme hatasında canlı veriyi değiştirmek yerine test hedefini inceleyin. Eğitim kaynaklarını ancak adlarını, yedeği ve bağımlılıkları doğruladıktan sonra kaldırın; bu rehber otomatik DROP temizliği çalıştırmaz.

Kaynaklar

Teknik içerik ve kaynaklar 4 Ekim 2026 tarihinde gözden geçirildi. Sürüm veya sağlayıcı değişikliğinde ilgili resmî belgeyi yeniden kontrol edin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir