MYSQL Ufak İpuçları – vol.3

Üçüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.

Nasipse 4. seriyi de yayınlarım yakın bir zamanda 🙂

İlk olarak şöyle bir yapalım. Bir tablomuz var ve diğer bir tabloya aktaracağız. Arayüz kullanırken bu işlemler bir kaç tık yaparak sonuca hızlıca ulaşabiliriz fakat ya arayüzümüz yoksa. ! Çözüm tabi ki var. Komut satırından devam. Arayüz ne yapıyor sanıyorsunuz 🙂

Örnek olarak eski kullanıcı tablosundaki belirli bir sorgunun cevabını yeni bir tabloya aktarmamız gerekiyor;
# INSERT INTO YENI_KULLANICI_TABLOSU ( ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES ) SELECT ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES FROM ESKI_KULLANICI_TABLOSU WHERE YAS > 23 AND KAYIT_TARIHI > ‘2018-01-01’  ORDER BY ID DESC LIMIT 1000

Where şartımıza göre yukarıdaki sorgumuz ESKI_KULLANICI_TABLOSU‘dan  YENI_KULLANICI_TABLOSU‘na aktarım yapacaktır. Bu işlemi bir yazılım dili ile de yapabiliriz. Fakat şöyle düşünün; Önce yazılımın çalışacağı PLATFORM’a tüm bilgiyi çekeceğiz ve sonra tekrar geriye INSERT edeceğiz. Bu şekilde daha hızlı olmasını sağlayabilirsiniz. Tabi ki bir veritabanından farklı bir veritabanına aktarım yapmak isterseniz bu sorgu biraz yetersiz gelebilir. 🙂 O zaman kolları sıvayıp bir aktarım / transfer mekanizması yazmanız gerekebilir.

Veritabanınızdaki toplam satır sayısını merak ediyorsanız aşağıdaki sorguyu kullanabilirsiniz.
# SELECT SUM( TABLE_ROWS )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘VERI_TABANI_ADI‘;

Yine bir merak sorusu ile devam edelim. Merak ettiğimiz ise veritabanımızdaki tabloların MB ( megabayt ) cinsinden boyutlarını sorgulayalım.
# SELECT
table_schema as `Database`,
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;

Bu sorgular sürekli kullanılan sorgular değildir. Genellikle kriz anlarında yani veritabanı çökmeye yakın anlarında hangi tablo çatlamış, hangi tablo diskte fazla yer kaplıyor, hangi tablo neden bu kadar şişmiş durumlarını kontrol edebilmek içindir. Sorguları genişletip daha farklı sonuçlar alabilirsiniz ve geleceğinizi yakından görüp kriz anlarını öncesinde çözebilirsiniz.

Bir sonraki seride görüşmek üzere. 🙂

 

MYSQL Ufak İpuçları – vol.2

İkinci seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.

  • Eski bir tabloda otomatik ID yok ise aşağıdaki komut ile ekleyebilirsiniz;
    • ALTER TABLE `TABLO_ADI` ADD `SUTUN_ADI` INT NOT NULL AUTO_INCREMENT AFTER `HANGI_SUTUNDAN_SONRA`, ADD PRIMARY KEY (`SUTUN_ADI`);
  • Var olan bir Mysql kullanıcısı şifre değiştirme;
    • UPDATE SET USER PASSWORD=PASSWORD(‘YENI_SIFRE‘) WHERE USER=’KULLANICI_ADI‘;
      FLUSH PRIVILEGES;
    • Yetki durumuna göre de şifre değiştirme işlemi yapabilirsiniz;
      • GRAN ALL PRIVILEGES ON DATABASEADI.* TO ‘KULLANICI_ADI‘@’SOURCE_IP‘ IDENTIFIED BY ‘YENI_SIFRE’ with GRANT OPTION;
      • Source IP / Kaynak IP olarak kullanıcı hangi IP den izinli olup olmadığını belirtebilirsiniz. Her yerden bağlanmasını isterseniz “%” ( Yüzde ) işareti koymanız gerekir.

Ek olarak Centos 7 üzerinde MYSQL portuna firewall tarafından izin vermeyi de ekliyorum. Belki lazım olur 🙂

Her yerden izin vermek istediğimizde;
# firewall-cmd –permanent –add-port=3306/tcp
Bu komutun aynısı farklı port açma işlemlerinde de kullanabilirsiniz. Örn : http : 80, https : 443,  ftp : 21, ssh : 22, telnet : 23, dns : 53, ntp : 123 vb.

Özel IP adreslerine izin vermek istediğimizde;
firewall-cmd –permanent –zone=public –add-rich-rule=’ rule family=”ipv4″ source address=”KAYNAK_IP” service name=”mysql” accept’

Bu komuttan sonra işe yaraması için firewall-cmd –reload yapmanız veya servisi tekrar başlatmanız önerilir. En kötü sunucuyu yeniden başlatın 🙂

Yukarıdaki örnekler basit örneklerdir. Fakat sunucu ve arka plan işlemleri ile uğraşanların hemen hemen her konfigürasyonunda kullanmış oldukları, ihtiyaç doğrultusunda keep.google.com gibi yerlerde hızlı ulaşabilmek için saklıyorlardır. En azından ben o şekilde saklıyorum 🙂

MYSQL Ufak İpuçları – vol.1

Bu seri MYSQL ile ufak ipuçlarını paylaşacağım. Öyle anlar olur ki verilerinizi sakladığınız yerlerde problemler, analiz etmeniz gereken zıpçıktılar vs. olabilir.
Benimde özel notlarımın arasındakileri sizlerle paylaşıyor olacağım.

Aşağıdaki komut genellikle linux CLI tarafında kullanılmaktadır. Sunucudaki tüm veritabanlarını ve tabloları kontrol edip optimizasyon / uyarlama işlemlerini gerçekleştirir. Ek parametreleri ile birkaç kullanım örneğini aşağıdaki gibidir;
#   mysqlcheck –all-databases –optimize

Tek bir tablo için;
 mysqlcheck VERITABANIADI TABLOADI
Tek bir veritabanı fakat tüm tablolar için;
#   mysqlcheck VERITABANIADI
Tüm veritabanları ve tablolar için;
#   mysqlcheck –all-databases 

Bu komut ile veritabanınızın ufak da olsa bakımını sağlayabilirsiniz. Crush olmuş veritabanızı da kurtarma ihtimaliniz yüksektir.
Başlangıç olarak burada bırakıyorum. Çok daha farklı ve işe yarar komutlar var. Zaman buldukça onları da paylaşmaya çalışacağım.

PHP ile Firebase Realtime Database Veri Ekleme

Realtime ( gerçek zamanlı ) olarak uyarı sistemi kullandığımız bir projede yazılımcı bir arkadaşın yardımlarıyla Firebase Realtime Database üzerine PHP CURL ile verileri eklemeyi başardık. 🙂

Kod bloğu aşağıdaki gibidir.

<?php
private function firebase_update( $data )
{
$data = json_encode( $data );

$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://UYGULAMAHAVUZU.firebaseio.com/TABLOADI.json",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
"Cache-Control: no-cache",
"Content-Type: application/json",
"Postman-Token: 99d8fc6b-d20e-43a0-93e6-5e04350ff449"
),
));
$response = curl_exec($curl);
curl_close($curl);
}
?>

UYGULAMAHAVUZU -> Firebase tarafından size verilir.
TABLOADI -> Tablo adı değil fakat JSON verisi olarak KEY değeri diyebiliriz.

Farklı KEY ler oluşturup birden fazla tablo varmış gibi davranabilirsiniz.
Yukarıdaki işlemde RealTime database ayarlarında kurallar aşağıdaki gibi olmalıdır.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */  "rules": {
    ".read": true,
    ".write": true
  }
}