Mysql – birden fazla IP den mysqle baglanmak

Eğer 2 farklı IP’deki sunucunuz, aynı mysql sunucusuna bağlanması gerekiyorsa yapmanız gereken temel olarak bir kaç maddelik işiniz var demektir. Bunları listeleyelim :

  1. Bağlanılan (mysql-server’in olduğu makinenizde) mysql konfigürasyon dosyanızı bulun. (işletim sisteminiz centos ise /etc/my.cnf gibi bir yerde, ubuntu ise, /etc/mysql/my.cnf gibi bir yerdedir). 
  2. my.cnf içerisinde bind-address diye bir parametre varsa, onu 0.0.0.0 şeklinde düzeltin, yoksa
    bind-address = 0.0.0.0

    şeklinde yeni bir satır ekleyin (çünkü varsayılan değeri 127.0.0.1 yani localhost tur)

  3. my.cnf içerisinde skip-networking diye bir parametre varsa onu silin. (veya başına # işareti koyarak yorum haline getirin.)
  4. Mysqlinizi yeniden başlatın. (service mysql restart)
  5. şu anda veritabanınız dışarıdan bağlantılara açık hale geldi. Ancak bu bi güvenlik tehdidini de beraberinde getirir. Doğrudan bir tehlike değil bu ancak, root şifrenizi deneye yanıla(brute-force teknikleri de dahil) bulabilirler, veya yanlış vermiş olduğunuz yetki, user var ise, bunları keşfedebilirler)  Bu yüzden bir firewall kullanmalıyız. Halihazırda iptables vardır diye düşünüyorum. iptables için bir kural ekleyelim ve istemediğimiz ipler dışındaki istekleri drop edelim, böylece sadece istediğimiz IP’ler networkten içeri girebilsin. :
    iptables -A INPUT -p tcp --dport 3306 ! -d xxx.xxx.xxx.xxx -j DROP
  6. bir user ekleyin.
    CREATE USER 'kullanici'@'ip_Adresi' IDENTIFIED BY 'şifre';
  7. Bu kullanıcıya ilgili IP için yetki verin(hangi yetkileri istiyorsanız)
    GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , EVENT, TRIGGER, SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `database_adi` . * TO 'kullanici'@'ip_Adresi';
  8. Testlerinizi yapın. Bu testleri hem bağlanmasını istediğiniz makineler için, hem de istemediğiniz makineler için mutlaka yapın. mysql-client yüklü ise şöyle yapabilirsiniz :
    mysql -u kullanici -h ip_Adresi database_adi

mysql bağlantıları için iptables kuralları kaynak: http://www.cyberciti.biz/faq/unix-linux-mysqld-server-bind-to-more-than-one-ip-address/

mysql’deki tablonun olup olmadığını kontrol etmek (php kullanarak)

Php ile çalışırken, mysql’de kullandığımız veritabanı içerisinde, herhangi bir isimdeki tablonun var olup olmadığını kontrol etmenin bir kaç yolu vardır. Bu yazıda onlardan bahsedeceğim.

Bunlardan ilki, SHOW TABLES querysini kullanmaktır.

Örneğin, test isminde bir veritabanımız olsun. İçerisindeki tabloların ismi de, admin, member, log, test1, test2 olsun. Yani mysql’e konsoldan bağlanıp use test dedikten sonra, show tables dediğimizde karşımıza şu çıksın.

+------------------------+         |
| admin                  |
| member                 |
| log                    |
| test1                  |
| test2                  | 
+------------------------+

Şimdi işin Php kısmına geçelim.

// burada mysql'e bağlanmış olalım.

$result = mysql_query( "SHOW TABLES FROM test" );

if (! $result) {
	echo "Sorguda hata meydana geldi 
"; echo 'mysql error: ' . mysql_error(); } else { $row = array(); while ( $row = mysql_fetch_row( $result ) ) { echo "Tablo ismi : ".$row[0]."
"; } } mysql_free_result( $result );

SHOW TABLES FROM test querysinin ardından, LIKE parametresi ekleyerek, sonucu daraltabiliriz. Ardından da sonuçları php ile parse ederek, aradığımız isimdeki tablonun olup olmadığını kontrol edebiliriz. (SHOW TABLES FROM test LIKE ‘%min%’ gibi)

İkinci yöntemimiz ise, mysql’deki information_schema databasei içerisindeki TABLES tablosundaki bilgiler. Bu tabloda TABLE_SCHEMA sütununda veritabanı isimleri TABLE_NAME sütununda ise tablo isimleri yer almaktadır.

SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = ‘{database ismi}’ AND table_name = ‘{tablo ismi}’ şeklinde çalıştıracağımız sorgudan gelen sonuç ile istediğimizi elde etmiş olacağız. Yapalım;

// burada mysql'e bağlanmış olalım.

$result = mysql_query( "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='test' AND table_name='test1'" );

if (! $result) {
	echo "Sorguda hata meydana geldi 
"; echo 'mysql error: ' . mysql_error(); } else { $count = mysql_num_rows($result); if($count == 1){ // tablo var, gerekli işlemler } else { // tablo yok, gerekli işlemler } } mysql_free_result( $result );

uzun süre calisan mysql processleri oldurmek

Sunucunuzda bazı durumlarda, mysql veritabanınızda işlemler yığılmaya başlıyor olabilir.

Bu durum için bir arkadaşımın yazmış olduğu basit bir php scripti mevcut. Dilerseniz işinizi kolaylaştırabilir.

Script, verdiğiniz süreden daha büyük süre değerine sahip mysql processleri yakalayıp, bunları KILL ediyor (öldürüyor).
* kullanıcı adı kısmına root, root şifresi yazan kısma da root şifrenizi yazarak çalıştırabilirsiniz.

 

<?
var_dump(mysql_connect("localhost", "{kullanici_adi}", "{root_sifresi}"));
$result = mysql_query("SHOW FULL PROCESSLIST");
$i=0;
while ($row=mysql_fetch_array($result)) {
  $process_id=$row["Id"];
  if ($row["Time"] > 5000 ) {
    $sql="KILL $process_id";
    $i++;
    mysql_query($sql);
  }
}
echo $i." adet islem sonlandirilmistir";
?>

mysql acik baglantilari ve processleri goruntuleme

mysql’e konsoldan bağlandıktan sonra show status like ‘Conn%’ komutunu çalıştırdığımızda açık olan bağlantıyı görüntüleyebiliriz.

mysql> show status like 'Conn%';
+-----------------------+---------+
| Variable_name | Value |
+-----------------------+---------+
| Connections     |  78     |
+-----------------------+---------+
1 row in set (0.00 sec)

Aynı şekilde eğer show status like ‘%onn%’ komutunu çalıştırdığımızda da bu sefer connection ile ilgili diğer alanların da sonuçları gelir karşımıza.

mysql> show status like '%onn%';
+-------------------------------------+----------+
| Variable_name                | Value |
+-------------------------------------+----------+
| Aborted_connects          |     1     |
| Connections                   |    78    |
| Max_used_connections   |     1    |
| Ssl_client_connects        |    0      |
| Ssl_connect_renegotiates |   0     |
| Ssl_finished_connects    |     0     |
| Threads_connected        |     1     |
+-------------------------------------+----------+
7 rows in set (0.00 sec)

Bunlara ek olarak bir de process list görüntüleyebiliriz, onu da şu komutla gerçeklememiz mümkün; show processlist

mysql> show processlist;
+----+------+--------------+-------+---------------+--------+--------+-------------------------+
| Id | User | Host      | db   | Command | Time | State  | Info                   |
+----+------+---------------+---------+------------+------+-----------+-------------------------+
| 77 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+---------------+---------+-------------+------+----------+-------------------------+
1 row in set (0.02 sec)

Mysql ile işlem yaparken bu son komutu çalıştırdığınızda, daha farklı sonuçlar alabileceğinizi deneyerek görebilirsiniz.