mariadb, MariaDB sunucusuna bağlanıp SQL çalıştırdığınız komut satırı istemcisidir. Etkileşimli kullanımda mariadb -u kullanici -p veritabani yazıp parolanızı girersiniz ve MariaDB [veritabani]> istemine düşersiniz; betiklerde ise -e ile tek bir komut çalıştırabilir, < ile bir SQL dosyasını besleyebilir ya da --batch ile sekmeyle ayrılmış çıktı alabilirsiniz. Unix sistemlerde aynı programa mysql adlı bir sembolik bağlantı da bulunur.

Bu yazı istemcinin günlük işte en çok kullanılan özelliklerini anlatıyor: bağlantı parametreleri ve varsayılanlar, soket ile TCP arasındaki fark, ifade sonlandırıcıları, istemci içi komutlar, source ve DELIMITER, çıktı biçimleri, --safe-updates, geçmiş dosyası, istem satırını özelleştirme ve yapılandırma dosyası grupları. Uzak sunucuya bağlanmak için sunucu tarafında yapılması gerekenler uzaktan bağlantı yazısında ayrıca ele alınıyor.

Bağlanmak: parametreler ve varsayılanlar

Bağlanmak: parametreler ve varsayılanlar: --host=name, --user=name, --password[=passwd], --port=num

Hiçbir parametre vermeden mariadb yazdığınızda bağlantı rehberine göre şu varsayılanlar kullanılır: host localhost, kullanıcı adı Unix oturum adınız, parola gönderilmez, bir veritabanı seçilmez ve varsayılan soket dosyası kullanılır. Varsayılanları seçeneklerle değiştirirsiniz:

bash
mariadb -h 192.0.2.10 -u uygulama -p magaza

Bu komutta -h hostu, -u kullanıcıyı belirtir; -p değer almadığı için istemci parolayı sorar; seçeneklerden sonra gelen ilk argüman (magaza) bağlanılacak veritabanıdır. Port verilmediği için TCP bağlantısında varsayılan 3306 kullanılır.

KısaUzunAnlamıVarsayılan
-h--host=nameBağlanılacak sunuculocalhost
-u--user=nameMariaDB kullanıcı adıUnix oturum adınız
-p--password[=passwd]Parola; değer verilmezse sorulurparola gönderilmez
-P--port=numTCP portu3306
-S--socket=nameUnix soket dosyasıderlemeye ve dağıtıma göre değişir
-D--database=nameKullanılacak veritabanıyok
--protocol=nametcp, socket, pipe veya memoryişletim sistemine göre en uygunu

localhost ile 127.0.0.1 aynı şey değildir

Unix sistemlerde host verilmezse ya da localhost verilirse istemci Unix soketi kullanır. Başka bir host yazıldığında ise TCP/IP bağlantısı kurulur. Belgeler özellikle uyarır: localhost özel bir değerdir ve 127.0.0.1 ile aynı değildir; ikincisi sunucuya TCP üzerinden bağlanır. Komut satırında --port gibi bir bağlantı özelliği verdiğinizde de o özelliğe uyan protokol seçilir. Bu fark iki pratik sonuç doğurur. Birincisi, unix_socket ile doğrulanan root@localhost hesabına TCP üzerinden bağlanamazsınız. İkincisi, sunucu tarafında skip_networking açıksa yalnızca soket bağlantıları çalışır.

bash
mariadb --protocol=socket
mariadb --host=localhost --protocol=tcp --port=3306

Hangi protokolle bağlandığınızı görmek için istemci içinde status komutunu çalıştırın. Çıktıda "Connection" satırı bağlantı türünü, soket bağlantısında ise "UNIX socket" satırı kullanılan dosyayı gösterir.

İfadeleri göndermek ve durdurmak

Etkileşimli oturumda bir SQL ifadesini noktalı virgül (;), \g ya da \G ile bitirip Enter'a basarsınız. \G sonucu dikey biçimde, her sütunu ayrı satırda gösterir; geniş tablolarda ve uzun metinlerde okumayı kolaylaştırır. --auto-vertical-output seçeneği, sonuç terminal genişliğinden büyükse dikey moda kendiliğinden geçer.

sql
SELECT user, host FROM mysql.user WHERE user = 'root'\G

Yazdığınız ifadeden vazgeçmek için \c girdiyi temizler. Çalışmakta olan bir ifadeyi durdurmak için Control-C'ye basarsınız: istemci ifadeyi sonlandırmayı dener; bu yapılamazsa ya da ifade sonlanmadan Control-C'ye ikinci kez basarsanız istemci kapanır. Bir oturumdan çıkmak için exit, quit ya da \q kullanılır.

İstemci içi komutlar

SQL dışında istemcinin kendisinin anladığı komutlar vardır. Belgelere göre bu metin komutları satırın başında olmalı ve noktalı virgülle bitmelidir. En sık kullanılanlar:

KomutKısaNe yapar
status\sSunucudan durum bilgisi alır; bağlantı türü, kullanıcı, veritabanı
use\uBaşka bir veritabanına geçer
source\.Bir SQL betik dosyasını çalıştırır
delimiter\dİfade ayıracını değiştirir
tee\TBütün çıktıyı verilen dosyaya da ekler
noteeDosyaya yazmayı durdurur
pager\PSonuçları less gibi bir sayfalayıcıdan geçirir (Unix)
nopagerSayfalayıcıyı kapatır
warnings\WHer ifadeden sonra uyarıları gösterir
system\!Bir kabuk komutu çalıştırır (Unix benzeri sistemler)
rehash\#Ad tamamlama önbelleğini yeniden kurar
promptİstem satırını değiştirir
connectSunucuya yeniden bağlanır; veritabanı ve host alabilir
help\hYardımı gösterir

Ad tamamlama varsayılan olarak açıktır: bir veritabanı, tablo ya da sütun adının başını yazıp Tab'a bastığınızda istemci tamamlar. Çok tablolu veritabanlarında açılış yavaşlarsa -A (--no-auto-rehash) ile bunu kapatıp gerektiğinde rehash çalıştırabilirsiniz.

SQL dosyası çalıştırmak: yönlendirme ve source

SQL dosyası çalıştırmak: yönlendirme ve source

Bir dosyadaki ifadeleri çalıştırmanın iki yolu vardır. Kabuktan yönlendirme ile istemci etkileşimsiz modda çalışır; belgeler bu modda sonucun ASCII tablo yerine sekmeyle ayrılmış biçimde verildiğini belirtir:

bash
mariadb magaza < kurulum.sql > sonuc.tab

Oturum içinden ise source komutunu kullanırsınız. Dosya genellikle çalışma dizininde aranır; belgelere göre MariaDB 12.0'dan itibaren --script-dir ile bir dizin verilebilir.

sql
source kurulum.sql

Hata davranışı önemli bir ayrıntıdır. --abort-source-on-error, source ile çalıştırılan dosyada hata olursa işlemi durdurur. -f (--force) ise SQL hatası olsa bile devam eder ve --abort-source-on-error değerini sıfırlar. Kurulum betiklerinde yarım kalmış bir şemayı fark etmeden geçmemek için hatada durmak genellikle daha güvenlidir. Büyük döküm dosyalarını geri yüklemenin ayrıntıları mariadb-dump yazısında.

DELIMITER: saklı yordam yazarken ayıracı değiştirmek

Varsayılan ayıraç noktalı virgüldür. BEGIN ... END bloğu içeren bir fonksiyonu satır satır yazdığınızda istemci bloğun içindeki ilk noktalı virgülü ifadenin sonu sanar ve yarım tanımı sunucuya gönderir; sonuç bir sözdizimi hatasıdır. Çözüm, tanım süresince ayıracı geçici olarak değiştirmektir. Belgelerin örneğinde // kullanılır:

sql
DELIMITER //

CREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC
BEGIN
  DECLARE x TINYINT;
  SET x = 42;
  RETURN x;
END

//

DELIMITER ;

Son satır ayıracı tekrar noktalı virgüle döndürür. \g ve \G özel bir ayıraç tanımlıyken de her zaman kullanılabilir. Saklı yordam ve fonksiyonların kendisi stored procedure yazısında anlatılıyor.

Betiklerde kullanım: -e, --batch ve çıktı biçimleri

-e (--execute) verilen ifadeyi çalıştırır ve çıkar; geçmiş dosyasını ve --force davranışını kapatır, varsayılan çıktı biçimi --batch ile aynıdır. -B (--batch) sütunları sekmeyle ayırır, her satırı yeni satıra yazar, geçmiş dosyasını kullanmaz ve özel karakterleri kaçışlar; kaçışı kapatmak için -r (--raw) kullanılır. -N sütun adlarını yazmaz, -s çıktıyı sadeleştirir ve birden fazla verildiğinde daha da azaltır.

bash
mariadb -N -B -e "SELECT VERSION();"

Bu komut sürüm metnini tablo çizgileri ve sütun başlığı olmadan tek satır olarak verir; izleme betiklerinde değeri bir değişkene almak için uygundur. Toplu çıktıda tablo görünümü isterseniz -t (--table) ekleyin. Diğer biçimler için -E dikey, -H HTML, -X XML çıktı üretir. Çok büyük sonuç kümelerinde bellek sorunu yaşarsanız -q (--quick) sonucu önbelleğe almadan satır satır basar; belgeler bunun çıktı bekletildiğinde sunucuyu yavaşlatabileceğini de not eder.

--show-warnings her ifadeden sonra uyarıları gösterir ve hem etkileşimli hem toplu modda çalışır. Uzun bir oturumun kaydını tutmak için --tee=dosya her şeyi dosyaya ekler; bu seçenek toplu modda çalışmaz.

Kazalara karşı: --safe-updates

Yeni başlayanlar için belgelerin önerdiği seçenek --safe-updates'tir (eş anlamlısı --i-am-a-dummy, kısaltması -U). WHERE koşulunu unuttuğunuz bir DELETE FROM tablo ifadesi normalde bütün satırları siler; bu seçenekle silme ve güncelleme ancak anahtar değerleriyle satır belirtildiğinde ya da LIMIT verildiğinde çalışır. İstemci bağlanırken şu ifadeyi gönderir:

sql
SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

Bunun sonucunda LIMIT içermeyen büyük SELECT sonuçları 1.000 satırla sınırlanır ve muhtemelen 1.000.000'dan fazla satır kombinasyonu incelemesi gereken çok tablolu SELECT ifadeleri durdurulur. Sınırları değiştirmek için:

bash
mariadb --safe-updates --select_limit=500 --max_join_size=10000

UPDATE ve DELETE ifadelerinin doğru yazımı INSERT, UPDATE, DELETE yazısında anlatılıyor.

Geçmiş dosyası ve istem satırı

Unix'te istemci çalıştırdığınız ifadeleri ev dizininizdeki .mysql_history dosyasına yazar. Farklı bir dosya için MYSQL_HISTFILE ortam değişkeni ayarlanır. Belgeler bu dosyanın kısıtlayıcı izinlerle korunması gerektiğini, çünkü parola içeren ifadelerin metninin buraya yazılabileceğini vurgular. Geçmiş tutmak istemiyorsanız dosyayı silip MYSQL_HISTFILE değişkenini /dev/null yapabilir ya da dosyayı /dev/null'a sembolik bağlantı olarak oluşturabilirsiniz:

bash
ln -s /dev/null $HOME/.mysql_history

Varsayılan istem \N [\d]> biçimindedir; köşeli parantez içinde geçerli veritabanı görünür, veritabanı seçilmemişse (none) yazar. --prompt seçeneği ya da prompt komutuyla değiştirilebilir. Belgelerdeki özel dizilerden bazıları: \u kullanıcı adı, \h sunucu hostu, \d varsayılan veritabanı, \v sunucu sürümü, \p TCP portu ya da soket dosyası, \R 24 saatlik saat. Üretim ve test sunucusunu karıştırmamak için hostu istemde göstermek pratik bir alışkanlıktır.

sql
prompt \u@\h [\d]>\_

Seçenekleri yapılandırma dosyasına yazmak

İstemci, komut satırının yanında yapılandırma dosyalarından da seçenek okur; dosyada tanımadığı bir seçeneği yok sayar. Okuduğu gruplar [mysql], [mariadb-client], [client], [client-server] ve [client-mariadb]'dir. Örneğin kendi ev dizininizdeki ~/.my.cnf dosyasına şunu yazarak her bağlantıda aynı kullanıcıyı, güvenli güncelleme modunu ve uyarı gösterimini kullanabilirsiniz:

ini
[client]
user=uygulama

[mariadb-client]
safe-updates
show-warnings

Yapılandırma dosyasında seçenekleri baştaki -- olmadan yazarsınız. --print-defaults istemcinin hangi argümanlarla başlayacağını yazdırıp çıkar; --no-defaults hiçbir dosyayı okumaz. Bu ikisi, --defaults-file ve --defaults-extra-file gibi dosya seçenekleri komut satırında ilk argüman olmalıdır. Dosyaların okunma sırası ve grupların tamamı my.cnf yazısında.

Bağlantı koparsa: otomatik yeniden bağlanma

İstemci bir ifadeyi gönderirken bağlantıyı kaybederse bir kez otomatik olarak yeniden bağlanıp ifadeyi tekrar gönderir. Belgeler bunun tehlikeli olabileceğini anlatır: yeniden bağlansa bile ilk oturum bitmiştir; geçici tablolar, autocommit modu, kullanıcı ve oturum değişkenleri kaybolur ve açık işlem geri alınır. Belgelerdeki örnekte SET @a=1 sonrası sunucu yeniden başlar, istemci sessizce yeniden bağlanır ve bir sonraki INSERT, değişken artık tanımsız olduğu için tabloya NULL yazar. Bağlantı koptuğunda istemcinin hata verip durmasını istiyorsanız --skip-reconnect kullanın. İşlemlerin ayrıntıları transaction yazısında.

Sık yapılan hatalar

Sık yapılan hatalar: -p ile parola arasında boşluk bırakmak, 127.0.0.1 ile bağlanıp root'un neden reddedildiğini anlamamak, Yapılandırma dosyasındaki protocol=tcp satırını...
  • -p ile parola arasında boşluk bırakmak: -p parola yazdığınızda istemci parolayı sorar ve "parola" kelimesini veritabanı adı olarak yorumlar.
  • 127.0.0.1 ile bağlanıp root'un neden reddedildiğini anlamamak: 127.0.0.1 TCP bağlantısıdır; unix_socket ile doğrulanan hesap ancak soket üzerinden çalışır.
  • Yapılandırma dosyasındaki protocol=tcp satırını unutmak: Authentication sayfası, sistem genelindeki dosyada protocol=tcp varsa sudo mariadb --protocol=socket kullanmanızı söyler.
  • Saklı yordamı DELIMITER değiştirmeden yazmak: İlk iç noktalı virgülde tanım kesilir ve ERROR 1064 sözdizimi hatası alırsınız.
  • Betiklerde -f kullanıp hataları gözden kaçırmak: Hata olsa bile devam edildiği için şema yarım kalabilir.
  • Geçmiş dosyasını korumamak: CREATE USER ... IDENTIFIED BY gibi ifadeler parolayla birlikte .mysql_history dosyasına yazılabilir.
  • Otomatik yeniden bağlanmaya güvenmek: Uzun bakım oturumlarında oturum değişkenleri ve açık işlem sessizce kaybolabilir; kritik işlerde --skip-reconnect tercih edin.

Sık Sorulan Sorular

mysql komutu ile mariadb komutu farklı mı?

Belgelere göre istemcinin adı mariadb'dir; Unix sistemlerde mysql adlı bir sembolik bağlantı, Windows'ta ise mysql.exe adlı alternatif bir ikili dosya bulunur. Yani aynı program iki adla çağrılabilir. Bu seride MariaDB'ye özgü adları kullanıyoruz.

Sorgu sonucunu CSV benzeri bir dosyaya nasıl alırım?

En basit yol, toplu modda çalıştırıp çıktıyı yönlendirmektir: -B sekmeyle ayrılmış çıktı verir, -N başlıkları kaldırır. Sunucu tarafında dosya yazmak için SELECT ... INTO OUTFILE ise FILE yetkisi gerektirir ve dosyayı sunucunun diskine yazar. Veri içeri aktarma LOAD DATA ve mariadb-import yazısında anlatılıyor.

Hangi sunucuya bağlı olduğumu nasıl görürüm?

status (ya da \s) komutu geçerli kullanıcıyı, veritabanını ve bağlantı türünü gösterir. Sürüm için SELECT VERSION(); çalıştırabilirsiniz. Hostu istem satırına \h ile eklemek de karışıklığı önler.

İstemciden bağlanamıyorum, ilk neye bakmalıyım?

Hata koduna bakın. 2002 genellikle sunucunun çalışmadığını ya da soket yolunun yanlış olduğunu, 1045 erişim reddini gösterir. Bağlantı sorunları rehberi her iki durumun nedenlerini sıralar; özetini MariaDB sık hatalar yazısında bulabilirsiniz. Uzak bağlantı hataları için bind-address yazısına bakın.

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 · uzaktan bağlantı · my.cnf dosyaları · stored procedure · mariadb-dump · SQL nedir