Skip to main content

MariaDB Process Listeleme ve Kill

MariaDB üzerinde mysql CLI ile aktif processleri görme, kilitlenmiş işlemleri inceleme ve güvenli kill adımları.

Hızlı kontrol listesi

  • Doğru host/ortamda mısın? (prod/preprod/test)
  • replika mı? (replika ise read_only/super_read_only açık olabilir; replika thread'lerini kill etme)
  • Process ID MySQL içi oturum ID'sidir, OS PID değildir.

Bağlantı

mysql -h db-host -u dbuser -p
# veya .my.cnf ile:
mysql

Process listesi alma

SHOW PROCESSLIST;
-- Uyuyanları filtrele, en uzun sürenleri sırala
SELECT ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO
FROM information_schema.PROCESSLIST
WHERE COMMAND <> 'Sleep'
ORDER BY TIME DESC;

Alanlar:

  • TIME: saniye cinsinden çalıştığı süre.
  • STATE: lock bekleme, sorting, sending data gibi aşama.

Transaction ve lock inceleme

Uzun bekleyen/kitlenen işlemleri bul:

-- Açık transaction listesi
SELECT trx_id, trx_mysql_thread_id AS thread_id, trx_started,
trx_state, trx_rows_locked, trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;

-- Lock bekleyen ve bloklayan eşleşmeleri
SELECT r.trx_mysql_thread_id AS waiting_thread,
b.trx_mysql_thread_id AS blocking_thread,
TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_s,
r.trx_query AS waiting_query,
b.trx_query AS blocking_query
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
ORDER BY wait_s DESC;

Not: Bloklayan thread ID'yi PROCESSLIST.ID ile eşleyip kill edeceksin.

Kill kararı (ne zaman?)

  • Kısa süreli SELECT/backup işlemlerini öldürmeden önce onay al.
  • Yazma işlemi (UPDATE/DELETE) commit aşamasındaysa kill veri kaybı yaratabilir; önce bekleme süresini ve etkiyi değerlendir.
  • Replication SQL/IO thread'lerini kill etme; replika lag için farklı aksiyon gerekir.

Kill uygulama

-- Sadece mevcut sorguyu durdur (bağlantı açık kalır)
KILL QUERY <id>;

-- Oturumu tamamen kapatır
KILL <id>;

Adımlar:

  1. SHOW PROCESSLIST veya lock sorgularından ID'yi al.
  2. Önce KILL QUERY <id> dene; çözülmezse KILL <id>.
  3. Sonrasında process list ve lock listini tekrar kontrol et.

Yavaş sorgu ve plan bakışı

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

Etkisi kabul ediliyorsa slow log açık değilse aç:

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- ihtiyaca göre

Son kayıtları incele (örnek dosya yolu varsayımsal):

sudo tail -n 50 /var/log/mysql/slow.log

Plan analizi için:

EXPLAIN FORMAT=JSON <sorgu>;

Örnek hızlı akış

  1. SHOW PROCESSLIST ile uzun sürenleri sırala, Sleep hariç.
  2. Lock varsa lock bekleyen/bloklayan çiftini yukarıdaki join ile bul.
  3. Bloklayan thread ID için gerekliyse KILL QUERY <id> → halen kilitliyse KILL <id>.
  4. Tekrar PROCESSLIST/innodb_trx/innodb_lock_waits ile temizlik doğrula.

İlgili dokümanlar