MariaDB'de yeni bir kullanıcı CREATE USER deyimiyle oluşturulur. En basit hâli CREATE USER 'ad'@'host' IDENTIFIED BY 'parola'; biçimindedir. Oluşan hesap hiçbir yetkiye sahip değildir; yalnızca sunucuya bağlanabilir. Veritabanı üzerinde iş yapabilmesi için ardından GRANT ile yetki vermeniz gerekir. Var olan bir hesabı değiştirmek için ALTER USER, adını ya da host kısmını değiştirmek için RENAME USER, silmek için DROP USER kullanılır.
Bu yazıda hesap adının iki parçası olan kullanıcı adı ve host kısmının nasıl eşleştiğini, OR REPLACE ve IF NOT EXISTS farkını, hesap başına kaynak sınırlarını, parola süresini, hesap kilitlemeyi ve MariaDB 12.1 ile DROP USER davranışında gelen değişikliği resmî belgelere dayanarak anlatıyoruz. Yetki verme konusu GRANT ve REVOKE rehberinde, kimlik doğrulama eklentileri ise unix_socket ve ed25519 yazısında ayrıntılı olarak ele alınıyor. Serinin tamamı için MariaDB öğrenme rehberi sayfasına bakabilirsiniz.
Hesap adı: kullanıcı ve host birlikte

MariaDB'de bir hesap yalnızca kullanıcı adından oluşmaz. Hesap adı 'kullanici_adi'@'host_adi' biçimindedir ve iki parça birlikte tek bir hesabı tanımlar. Yani 'ali'@'localhost' ile 'ali'@'%' aynı ada sahip ama birbirinden tamamen bağımsız iki ayrı hesaptır. Parolaları, yetkileri ve kilit durumları ayrı ayrı tutulur.
Kullanıcı adı ve host tırnaksız yazılabilir; tek tırnak, çift tırnak ya da ters tırnak (backtick) ile de yazılabilir. Tire gibi özel karakterler ya da joker karakterler kullanıyorsanız tırnak zorunludur. Tırnak kullandığınızda iki parçayı ayrı ayrı tırnaklamanız gerekir: 'ali'@'localhost' doğrudur, 'ali@localhost' ise bambaşka bir anlama gelir. Host kısmını hiç yazmazsanız MariaDB onu '%' kabul eder.
- Joker karakterler: Host kısmında
%ve_kullanılabilir; bunlarLIKEile aynı mantıkta eşleşir. Alt çizgiyi gerçek karakter olarak kullanmak isterseniz önüne ters eğik çizgi koyarsınız. - Ağ maskesi:
'temel_ip/maske'biçimiyle bir IPv4 aralığı tanımlanabilir.'247.150.130.0/255.255.255.0'yazıldığında 247.150.130.0 ile 247.150.130.255 arasındaki adresler eşleşir. IPv6 adreslerinde ağ maskesi kullanılamaz. - localhost: Yalnızca yerel bağlantılara izin vermek için kullanılır. Belgelere göre Linux'ta 127.0.0.1 üzerinden gelen bağlantı
localhostile eşleşmez;localhostyalnızca Unix soket bağlantılarına karşılık gelir. - Uzunluk sınırları: Host kısmı en fazla 255 karakter, kullanıcı adı en fazla 128 karakter olabilir. Kullanıcı adları
utf8mb3ile saklandığı için emoji gibi 4 baytlık karakterler uyarı verilmeden?olarak kaydedilir. - Büyük küçük harf: Kullanıcı adı harfi harfine eşleşmelidir; host eşleşmesi ise büyük küçük harfe duyarlı değildir.
Temel CREATE USER kullanımı
CREATE USER çalıştırmak için genel CREATE USER yetkisine ya da mysql veritabanında INSERT yetkisine sahip olmanız gerekir. Her hesap için mysql.global_priv tablosuna (ve onu gösteren mysql.user görünümüne) yetkisiz bir satır eklenir. Belgelerdeki temel örnek şöyledir:
CREATE USER foo2@test IDENTIFIED BY 'mariadb';IDENTIFIED BY ile verdiğiniz düz metin parola, saklanmadan önce PASSWORD() fonksiyonuyla özetlenir. Parola vermezseniz kullanıcı parolasız bağlanabilir. Burada önemli bir ayrıntı var: boş parola herhangi bir parolayla eşleşen bir joker değildir; parola tanımlı değilse kullanıcının bağlanırken parola göndermemesi gerekir. Aynı deyimde virgülle birden fazla hesap da oluşturabilirsiniz.
Kimlik doğrulama eklentisi belirtmezseniz MariaDB hesabı mysql_native_password eklentisiyle oluşturur. Daha güçlü bir yöntem için IDENTIFIED VIA ed25519 USING PASSWORD('...') gibi bir yazım kullanılabilir; birden çok yöntem OR ile sıralanabilir ve sırayla denenir. Bu konu kimlik doğrulama yazısında işleniyor.
CREATE USER safe@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret') OR unix_socket;sql_mode içinde NO_AUTO_CREATE_USER yoksa hesaplar GRANT ile de örtük olarak oluşturulabilir. Ancak belgelere göre bu kip varsayılan olarak açıktır; bu yüzden hesabı önce CREATE USER ile açıp sonra yetki vermek en açık yoldur.
OR REPLACE ve IF NOT EXISTS
Aynı ada sahip bir hesap zaten varsa CREATE USER ERROR 1396 (HY000) döndürür. Birden fazla hesap oluştururken bazıları hata verirse, hata vermeyenler yine de oluşturulur ve oluşturulamayan tüm hesaplar için tek bir hata üretilir. Bu davranışı değiştirmenin iki yolu vardır.
OR REPLACE, önce DROP USER IF EXISTS sonra CREATE USER çalıştırmanın kısa yoludur. Yani var olan hesap silinip yeniden oluşturulur; eski hesaba verilmiş yetkiler de bu sırada gider. Belgelerdeki örnekte ilk deneme hata verir, ikincisi başarılı olur:
CREATE USER foo2@test IDENTIFIED BY 'password';
ERROR 1396 (HY000): Operation CREATE USER failed for 'foo2'@'test'
CREATE OR REPLACE USER foo2@test IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)IF NOT EXISTS ise hesaba dokunmaz; hesap varsa hata yerine bir uyarı (not) döner ve mevcut hesap olduğu gibi kalır. Kurulum betiklerinde aynı betiği birden çok kez güvenle çalıştırmak için uygundur:
CREATE USER IF NOT EXISTS foo2@test IDENTIFIED BY 'password';
Query OK, 0 rows affected, 1 warning (0.00 sec)
SHOW WARNINGS;
+-------+------+----------------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------------+
| Note | 1973 | Can't create user 'foo2'@'test'; it already exists |
+-------+------+----------------------------------------------------+Bağlanırken hangi hesap eşleşir?

Bir kullanıcı bağlandığında birden fazla hesap eşleşebilir. MariaDB hesapları belirli bir sıraya dizer ve ilk eşleşeni seçer. Kurallar özetle şöyledir: tam host adı içeren hesaplar joker içerenlerden önce gelir (ağ maskesi kullanan host da tam sayılır). Joker içerenler kendi aralarında özgüllüğe göre sıralanır; daha az host ile eşleşebilen desen önce gelir, tek başına % en sondadır. Boş olmayan kullanıcı adları boş kullanıcı adlarından (anonim hesaplardan) önce gelir.
Belgelerdeki şu sıralama tablosu kuralı iyi özetler:
+---------+-------------+
| User | Host |
+---------+-------------+
| joffrey | 192.168.0.3 |
| | 192.168.0.% |
| joffrey | 192.168.% |
| | 192.168.% |
+---------+-------------+Eşleşen hesap kimliğinizi ve genel (global) yetkilerinizi belirler. Daha alt seviyedeki yetkiler ise her seviyede ayrıca aranır ve o seviyede en özgül eşleşme tek başına geçerli olur. Belgelerdeki örnekte 'joffrey'@'192.168.0.3' hesabına test.t1 üzerinde SELECT, 'joffrey'@'%' hesabına ise INSERT verilmiştir. 192.168.0.3 adresinden bağlanan joffrey yalnızca SELECT yapabilir, başka bir adresten bağlanan ise yalnızca INSERT. Yetkiler birleştirilmez. Bu konunun yetki tarafı GRANT yazısında ayrıca örnekleniyor.
CREATE USER 'joffrey'@'192.168.0.3';
CREATE USER 'joffrey'@'%';
GRANT SELECT ON test.t1 TO 'joffrey'@'192.168.0.3';
GRANT INSERT ON test.t1 TO 'joffrey'@'%';Anonim hesaplar ve localhost tuzağı
Kullanıcı adı boş olan hesaplara anonim hesap denir; ''@'localhost' gibi. Bunlar, girilen kullanıcı adı için daha özgül bir eşleşme yoksa herkesi yakalayan hesaplardır. Sorun şurada çıkar: 'melisa'@'%' oluşturduğunuzu ve yerel makineden bağlanamadığınızı düşünün. Bağlantı sorunları kılavuzu bunun tipik nedenini anlatır: ''@'localhost' hesabının host kısmı daha özgül olduğu için öne geçer ve siz melisa yerine anonim hesap olarak değerlendirilirsiniz.
Çözüm olarak kılavuz iki yol önerir: melisa için ayrıca 'melisa'@'localhost' hesabı açmak ya da, başka bir amaçla kullanılmadığından eminseniz, anonim hesabı silmek. Kurulum sonrasında anonim hesapları kaldırmak, mariadb-secure-installation aracının da adımlarından biridir.
SELECT user, host FROM mysql.user WHERE user='melisa' OR user='';
DROP USER ''@'localhost';Hesap başına kaynak sınırları
WITH yan cümlesiyle bir hesabın sunucu kaynaklarını ne kadar kullanabileceğini sınırlayabilirsiniz. Paylaşımlı bir sunucuda bir uygulamanın tüm bağlantıları tüketmesini önlemek için kullanışlıdır. Sınırlar kullanıcı adına ya da bağlantıya göre değil, hesaba yani 'kullanici'@'host' çiftine göre izlenir.
| Seçenek | Anlamı |
|---|---|
| MAX_QUERIES_PER_HOUR | Hesabın saatte çalıştırabileceği deyim sayısı (güncellemeler dahil) |
| MAX_UPDATES_PER_HOUR | Saatte yapılabilecek güncelleme sayısı (sorgular hariç) |
| MAX_CONNECTIONS_PER_HOUR | Saatte açılabilecek bağlantı sayısı |
| MAX_USER_CONNECTIONS | Aynı hesaptan eşzamanlı bağlantı sayısı; 0 ise max_connections kullanılır |
| MAX_STATEMENT_TIME | Hesabın deyimleri için saniye cinsinden zaman aşımı |
CREATE USER 'someone'@'localhost' WITH
MAX_USER_CONNECTIONS 10
MAX_QUERIES_PER_HOUR 200;Bir sınırı 0 yapmak o kaynak için sınırı kaldırır. Sayaçlar tüm kullanıcılar için FLUSH USER_RESOURCES, FLUSH PRIVILEGES ya da mariadb-admin reload ile sıfırlanabilir. Aynı seçenekler ALTER USER ile sonradan da değiştirilebilir.
Parola süresi ve hesap kilitleme
Parolaların belirli bir süre sonra geçersiz olmasını PASSWORD EXPIRE seçenekleriyle hesap bazında ayarlayabilirsiniz. Genel ayar default_password_lifetime değişkenidir; belgelere göre varsayılanı 0'dır, yani otomatik parola süresi kapalıdır. Hesap bazındaki ayar genel ayarın önüne geçer:
CREATE USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY;Parola süresi dolan kullanıcıların nasıl karşılandığı ve parola politikası eklentileri parola yönetimi yazısında ele alınıyor.
Hesap kilitleme ise bir hesabı silmeden kullanıma kapatmanın yoludur. Kilitli hesapla yeni bağlantı açılamaz; ancak belgelere göre mevcut bağlantılar bundan etkilenmez. Kilit, hesap oluşturulurken ya da sonradan ALTER USER ile verilebilir. Kilit seçeneği ile parola seçeneği herhangi bir sırada yazılabilir.
CREATE USER 'lorin'@'localhost' ACCOUNT LOCK;
ALTER USER 'marijn'@'localhost' ACCOUNT LOCK;Kilitli bir hesapla bağlanmaya çalışan kullanıcı belgelerde gösterilen şu hatayı alır:
ERROR 4151 (HY000): Access denied, this account is lockedKilidi açmak için ALTER USER ... ACCOUNT UNLOCK kullanılır. Bir hesabın kilitli olup olmadığını SHOW CREATE USER çıktısından görebilirsiniz:
ALTER USER 'lorin'@'localhost' ACCOUNT UNLOCK;
SHOW CREATE USER 'marijn'@'localhost';
+-----------------------------------------------+
| CREATE USER for marijn@localhost |
+-----------------------------------------------+
| CREATE USER 'marijn'@'localhost' ACCOUNT LOCK |
+-----------------------------------------------+Tüm kilitli hesapları listelemek için belgelerde mysql.global_priv tablosunun JSON sütununda arama yapan şu sorgu verilir. Belgedeki örnek çıktıda mariadb.sys@localhost hesabının da listede çıktığına dikkat edin; bu sistem hesabı sunucunun iç işleri için gereklidir ve silinemez.
SELECT CONCAT(user, '@', host) AS 'Locked Accounts' FROM mysql.global_priv WHERE Priv like '%account_locked":true%';ALTER USER ile hesabı değiştirmek
ALTER USER, CREATE USER ile aynı seçenekleri kabul eder ve var olan hesapları değiştirir. Genel CREATE USER yetkisi ya da mysql veritabanında UPDATE yetkisi ister; read_only açıksa ayrıca READ_ONLY ADMIN yetkisi gerekir. Hesap yoksa hata verir; IF EXISTS eklerseniz hata yerine uyarı alırsınız. Oturumunuzdaki hesabın parolasını değiştirmek için CURRENT_USER() kullanılabilir:
ALTER USER CURRENT_USER() IDENTIFIED BY 'mariadb';CREATE USER 'bob'@'localhost'
IDENTIFIED VIA mysql_native_password USING PASSWORD('pwd')
OR unix_socket;
ALTER USER 'bob'@'localhost' IDENTIFIED VIA mysql_native_password
USING PASSWORD('pwd2');RENAME USER ve DROP USER
Bir hesabın kullanıcı adını ya da host kısmını değiştirmek için RENAME USER kullanılır. Eski hesap yoksa ya da yeni ad zaten kullanılıyorsa ERROR 1396 döner. Belgelerdeki örneklerde hem kullanıcı adı hem host birlikte değiştiriliyor, ikinci örnekte ise yalnızca host kısmı:
CREATE USER 'donald', 'mickey';
RENAME USER 'donald' TO 'duck'@'localhost', 'mickey' TO 'mouse'@'localhost';
RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'10.20.30.40';DROP USER bir ya da daha fazla hesabı ve tüm yetki tablolarındaki satırlarını siler. Yalnızca kullanıcı adını yazarsanız host '%' kabul edilir; yani DROP USER bob; deyimi 'bob'@'localhost' hesabını değil, 'bob'@'%' hesabını hedefler. Belgelerdeki IF EXISTS örneği şöyledir:
DROP USER bob;
ERROR 1396 (HY000): Operation DROP USER failed for 'bob'@'%'
DROP USER IF EXISTS bob;
Query OK, 0 rows affected, 1 warning (0.00 sec)Bağlı kullanıcıyı silmek: MariaDB 12.1 değişikliği
Belgelere göre MariaDB 12.1 öncesinde o anda bağlı olan bir hesap silindiğinde, bağlantı kapanana kadar silinmez ve bağlantı da otomatik kapatılmazdı; yalnızca yeni bağlantı açılamazdı. MariaDB 12.1'den itibaren hesap silinir, ancak deyim etkin bağlantılar olduğunu söyleyen bir uyarıyla tamamlanır. Bu, bağlantı kesilene kadar hesabın tüm yetkileriyle hâlâ etkin olduğu anlamına gelir.
Belgelerde sözdizimine eklenen FORCE yan cümlesi de anlatılır; ancak aynı sayfa bu yan cümlenin MariaDB Community Server'da bulunmadığını açıkça belirtir. Community Server kullanıyorsanız silinen hesabın açık oturumlarını KILL CONNECTION ile kendiniz sonlandırmalısınız. Oturumları bulmak için SHOW PROCESSLIST ve KILL yazısına bakabilirsiniz.
Deyimlerin karşılaştırması

| Deyim | Ne yapar | Hesap yoksa / varsa |
|---|---|---|
| CREATE USER | Yetkisiz yeni hesap açar | Varsa ERROR 1396; IF NOT EXISTS ile not |
| CREATE OR REPLACE USER | Hesabı silip yeniden açar | Varsa eski hesap ve yetkileri gider |
| ALTER USER | Parola, eklenti, TLS, sınır, kilit, süre değiştirir | Yoksa hata; IF EXISTS ile uyarı |
| RENAME USER | Kullanıcı adını ve/veya host kısmını değiştirir | Eski yoksa ya da yeni varsa ERROR 1396 |
| DROP USER | Hesabı ve tüm yetki satırlarını siler | Yoksa ERROR 1396; IF EXISTS ile not |
| SHOW CREATE USER | Hesabı yeniden oluşturacak deyimi gösterir | Kilit ve parola süresini de gösterir |
Sık yapılan hatalar
- Host kısmını unutmak:
CREATE USER aliaslında'ali'@'%'oluşturur. Uygulamanız yalnızca yerelden bağlanacaksa bu gereğinden geniş bir hesaptır. - 127.0.0.1 ile localhost'u aynı sanmak: Belgelere göre Linux'ta 127.0.0.1 üzerinden gelen TCP bağlantısı
localhosthesabıyla eşleşmez. Uygulama TCP ile bağlanıyorsa uygun hostu tanımlayın. - Anonim hesapları gözden kaçırmak:
''@'localhost'gibi bir hesap,'%'ile açtığınız hesabın önüne geçebilir. - OR REPLACE'in yetkileri sildiğini unutmak: Hesap silinip yeniden açıldığı için önceki
GRANT'lar kaybolur. - ALTER USER ile kimlik doğrulama yöntemini kaybetmek:
IDENTIFIED VIAlistesinde yazmadığınız yöntem kaldırılır. - Kilitleme ile oturumların kapandığını sanmak:
ACCOUNT LOCKyalnızca yeni bağlantıları engeller. - mysql tablolarını elle düzenlemek:
CREATE USER,DROP USER,GRANTgibi deyimlerFLUSH PRIVILEGESgerektirmez; bu komut yalnızcamysqltablolarını doğrudan değiştirdiğinizde gerekir.
Sık Sorulan Sorular
Yeni oluşturduğum kullanıcı neden hiçbir tabloyu göremiyor?
CREATE USER yetkisiz bir hesap açar; SHOW GRANTS çıktısında yalnızca genel USAGE görünür. Veritabanı ya da tablo yetkisini GRANT ile ayrıca vermeniz gerekir. Ayrıntılar GRANT ve REVOKE rehberinde.
Uzaktan bağlanacak kullanıcı için host kısmına ne yazmalıyım?
Mümkün olduğunca dar bir değer seçin: tek bir IP, bir ağ maskesi ya da belirli bir alan adı deseni. '%' her hosttan girişe izin verir. Sunucunun ağdan bağlantı kabul etmesi için gereken ayarlar uzaktan bağlantı yazısında anlatılıyor.
Kullanıcının parolasını nasıl değiştiririm?
ALTER USER 'ad'@'host' IDENTIFIED BY 'yeni'; ya da SET PASSWORD kullanılır. Root parolasını unuttuysanız izlenecek yol root parolası sıfırlama yazısında anlatılıyor.
Bir hesabı silmek yerine geçici olarak kapatabilir miyim?
Evet. ALTER USER ... ACCOUNT LOCK hesabı ve yetkilerini korur ama yeni bağlantıları reddeder. Açık oturumları ayrıca sonlandırmanız gerekir. Kilidi ACCOUNT UNLOCK ile açarsınız.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: MariaDB öğrenme rehberi · MariaDB GRANT ve REVOKE · MariaDB rolleri · MariaDB kimlik doğrulama · mariadb-secure-installation · MariaDB uzaktan bağlantı · WordPress veritabanı bağlantı hatası