PHP ile Dinamik Sorgular

PHP ile Dinamik Sorgular,

Bazen sql ile herşeyi yapamayabiliriz. Daha seri ve
spesifik bir şekilde sorguları gönderip sonuclarına göre
belli tablolalara insert ,delete veya update yaptırabiliriz.
Bunu bir örnekle anlatmaya Çalışayım.

Ürnek: Bu php scriptinde amacımız yüz binlerce satırlık satislar tablomuzdan
bütün satışları Çekip, satis_detay tablosundan her satısın tutar bilgisini alıp,
satis_toplam tablosunda toplam_tutar kolonuna update etmek.

// Burada database mize connect yapıyoruz.

$satisConnect=mysql_connect(“localhost”, “root”,”123456â?²);
mysql_select_db(“satis”,$satisConnect);

// Burada satislar tablomuzdan satıslarımızı Çekiyoruz.

$sql=“select musteri_kodu,tarih,urun_kodu from satis.satislar
where tarih>=“2009-02-01â?²”;

// mysql_query() fonksiyonuzla query mizi Çalıştırıp sonucu $result değişkenine
atıyoruz.

$result=mysql_query($sql,$satisConnect);

// Burada select sonucunda gelecek her satır iÇin dönecek while döngüsü
kuruyoruz. Ve gelen her satır iÇin gelen datayı değişkenlere atıyoruz.

while($row=mysql_fetch_assoc($result)){
$tarih=$row[‘tarih’];
$musteri_kodu=$row[‘musteri_kodu’];
$urun_kodu=$row[‘urun_kodu’];

// Burada ise 2.query mizi gönderiyoruz fakat where condition kısmında
1.queryden gelen sonucları kısıt olarak veriyoruz.

$sql2=“select
musteri_kodu,
satıs_tarih,
urun_kodu,
urun_detay,
toplam_tutar
from satis.satis_detay
where
museri_kodu=“.$musteri_kodu.” and
urun_kodu=“.$urun_kodu.” and
tarih=““.$tarih.””“;

// Burada 2.query”, mysql_query() fonksiyonu ile Çalıştırıp, sonucu
$result2 değişkenine atıyoruz.

$result2=mysql_query($sql2,$satisConnect);

// Burada 2.query nin sonucu, her satır iÇin alacak 2.while döngümüzü kuruyoruz ve
dönen değerleri yeni değişkenlerimize atıyoruz.

while($row2=mysql_fetch_assoc($result2)){
$musteri_kodu2=$row2[‘musteri_kodu’];
$tarih2=$row2[‘tarih’];
$urun_kodu2=$row2[‘urun_kodu’];
$urun_detay=$row2[‘urun_detay’];
$toplam_tutar=$row2[‘toplam_tutar’];

// Burada satis_toplam tablomuza update yapacak 2.query mizi gönderiyoruz. Where
condition kısmında 2.Qery mizden gelen değerleri kısıt olarak veriyoruz.

$sql3=“update satis.satis_toplam
set toplam_tutar=$toplam_tutar
where urun_kodu=“.$urun_kodu2 .” and
musteri_kodu=“.$musteri_kodu2 .” and
tarih=““.$tarih2.””“;

// Burada ise update işlemi yapılıyor.

mysql_query($sql3,$satisConnect) or die(“e: “.mysql_error());

}
}
?>

Bu scripti satisHesapla.php ismiyle kaydettikten sonra konsoldan
php -f satisHesapla.php komut satırını girerek Çalıştırabilirsiniz.

Böylece Çok pratik bir şekilde ,sql ile saatlerimizi alacak bir işlemi
Çok kısa bir süre iÇinde halletmiş oluyoruz.

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

Mysql Table Partition (LIST Partition Ürnekleri)

Mysql Table Partition (LIST Partition Ürnekleri),

Table Partiton Üeşitlerinde List Partition’u şimdi örneklerle anlamaya Çalışalım.

List Partition:

Ürnek: Aşağıdaki müşteri tablomuzda id,unvan,adi,soyadi,kodu kolonları mevcuttur.
Burada yapmak istediğimiz kodu kolonundaki değerlere göre tabloyu 4 parÇaya bölmek.
kodu 1,3,5,7,9,10 olanlar p0 bölümüne, 11,13,15 olanlar p1 bölümüne , 17,19,20 olanlar
p2 bölümüne ,21,23,25 olanlar p3 bölümüne atılacaktır.

CREATE TABLE musteri (
id INT NOT NULL,
unvan VARCHAR(30),
adi VARCHAR(30),
soyadi VARCHAR(30),
kodu int
)
PARTITION BY LIST(kodu) (
PARTITION p0 VALUES IN (1,3,5,7,9,10),
PARTITION p1 VALUES IN (11,13,15),
PARTITION p2 VALUES IN (17,19,20),
PARTITION p3 VALUES IN (21,23,25)
);

Bu tabloyu create ettikden sonra insertler geldikÇe Mysql, kodu kolonunu değerlerine
göre gelen dataları uygun bölümlere yerleştirecektir.

PARTITION p3 VALUES IN (21,22,23,24,25) yerine
VALUES LESS THAN(MAXVALUE)
ibaresi kullanarak ta 25 den büyük kodlar gelirse bunları da
p3 bölümünde tutmasını sağlayabiliriz. Aksi durumda siz 26 kodlu bir satır insert
etmeye kalktığınızda uygun partition bulunamadı hatası alırsınız.

Range Partition makalesinde belirttiğim gibi örnek talebleriniz olursa
yorum kısmından talep etmeniz yeterlidir.

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

Oracle Makaleleri Çok Yakında

Merhabalar,

www.mysqlsupport.net olarak sitemizde oracle da yerini alacaktır.
Üok yakında Oracle 10g ,Oracle 11g hakkında makelelere bu kategori altından
ulaşabileceksiniz.

Tayfur BÖLER
Database Administrator

PHP MYSQL

Merhabalar,

Üok yakında Php ile dinamik sql sorguları hakkında makalelere bu kategori
altından erişebileceksiniz.

Tayfur BÖLER
Database Administrator

Linux Makaleleri Çok Yakında

Merhabalar,

Linux hakkında makalelere kısa bir süre sonra bu kategori altından erişebileceksiniz.

Faydalı Olması Dileğiyle.

Tayfur BÖLER

Database Administrator

Mysql Table Partition (RANGE Partition Ürnekleri)

Mysql Table Partition 2,

şimdi örneklerle table partitionu anlamaya başlayalım.

RANGE Partition: Aşağıdaki örnekte personel isimli tablomuz
id,adi,soyadi,isBasiTarih,isSonuTarih,isKodu kolonlarına sahiptir.
Bu tablomuzda yapmak istediğimiz isKoduna göre
5 den küÇük isKodlarına sahip olan satırlar p0 parÇasına,
5 ile 10 arası isKodlarına sahip olan satırlar p1 parÇasına,
10 ie 15 arası isKodlarına sahip olan satırlar p2 parÇasına,
15 ile 20 arası isKodlarına sahip olan satırlar p3 parÇasına atılmasıdır.

CREATE TABLE personel (
id INT NOT NULL,
adi VARCHAR(30),
soyadi VARCHAR(30),
isBasiTarih DATE NOT NULL DEFAULT ‘1970-01-01’,
isSonuTarih DATE NOT NULL DEFAULT ‘9999-12-31’,
isKodu INT NOT NULL
)
PARTITION BY RANGE (isKodu) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20)
);

Bu tabloyu yarattıkdan sonra /var/lib/mysql/(db ismi) altına baktığımızda,

personel#P#p0.MYD
personel#P#p0.MYI
personel#P#p1.MYD
personel#P#p1.MYI
personel#P#p2.MYD
personel#P#p2.MYI
personel#P#p3.MYD
personel#P#p3.MYI

8 farklı fiziksel dosya görürüz. .MYD ler asıl dataların tutulduğu dosyalar,
.MYI dosyaları ise indexlerin tutulduğu dosyalar olarak karşımıza Çıkar.
Son kısımda PARTITION p3 VALUES LESS THAN (20) yerine,
PARTITION p3 VALUES LESS THAN MAXVALUE demiş olsaydık
isKodu 20 den büyük olanlar p3 parÇasında toplanmaya başlanacaktı.
şimdi tabloya insertler yapıldıkÇa Mysql otomatik olarak işKodu kolonundaki
değere göre gelen datayı otomatik olarak gitmesi gereken partitiona gönderir.
Range Partition da select yaparken where condititon kullanmakta fayda vardır.

Select * from personel where isKodu>=10 and isKodu<=15;

şeklinde bir sql Çalıştırdığımızda Mysql 4 partition iÇinden arama yapmayacak,
verdiğimiz koşul hangi partition iÇindeyse (p2) gidip o partitionda arama
yapıp sonucu oldukÇa hızlı bir şekilde getirecektir.

Kendi local sistemimde de range partition kullanmaktayım.Ve oldukÇa yüksek performans
almaktayım. Benim range partition tablomda 1.700.000.000 (Bir milyar yedi yüz milyon) satır
data mevcut. Bu tablomu tarih kolonuna göre haftalık periyodlarda 2 yıllık range partition tablo yaptım.
Toplamda 104 partition’a sahip.Ve data büyüklüğü 270 GB ,inanabiliyormusunuz
tek tablonun büyüklüğü 270 gb ve gayet performanslı sorgular Çıkartabiliyorum.
Günlük ortalama 3- 3.5 milyon satır data insert yapılıyor bu tabloya. 1.5 yıl oldu henüz patlamadı:)

Neyse konuyu fazla dağıtmadan devam edelim. Atıyorum yukarıdaki partition tabloyu oluşturdunuz
ve kullanmaya başladınız ama ileride ihtiyaÇ doğdu yeni partitionlar eklemek gerekti tabloya bu durumda
add partition yapabilirsiniz.

alter table personel
add partition (PARTITION p4 VALUES LESS THAN(25));

şeklinde tablonuza yeni partitionlar ekleyebilirsiniz.

Eğer RANGE partitionlarla ilgili yeni örnekler isterseniz makalenin yorum kısmında
belirtirsiniz. Bende elimden geldiğince örnekleri Çoğaltırım.

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

Mysql Table Partition

Mysql Table Partition,

Büyük bir tabloyu herhangi bir kolondaki değerlere göre parÇalara bölmeye table partition denir.
Table parititon da datalar fiziksel olarak farklı dosyalarda tutulur.Hatta farklı disklerde tutma
sanşımız da vardır.Bu özelliği Mysql 5.1 versiyonu ile kazanmıştır.

SHOW VARIABLES LIKE ‘%partition%’;

Komut satırını kullanarak da kullandığınız Mysql sürümünün partitioning özelliğine
sahip olup olmadığı anlarsınız. Partition özelliği, hem Myisam table enginede
hem de innodb table enginede kullanılabilir.

Table Partitionun 4 Çeşit yapısı mevcuttur.

RANGE Partitioning
LIST Partitioning
HASH Partitioning
KEY Partitioning


RANGE Partitioning:
Aralığa göre bölümleme de diyebiliriz. En yaygın kullanılan modeldir.
Bir kolondaki değere göre belli aralıklarla parÇalara ayırma.

LIST Partitioning: Range partitiona benzemekle beraber en büyük farkı belli bir kolondaki
değerleri net olarak seÇerek parÇalara ayırma. Ürnek verecek olursak,
sehirler diye bir tablomuz olduğunu düşünün ve bu tabloda plaka kodu diye bir
kolonumuzun olduğunu varsayalım.

PARTITION BY LIST(plaka_kodu) (
-> PARTITION p0 VALUES IN (34),
-> PARTITION p1 VALUES IN (44,23,35),
.
.
.
-> );

Burada 34(istanbul) plaka kodu olanları p0 diye bir bölümün iÇine, 44,23,35(malatya,elazığ,izmit)
plaka kodu olanları ise p1 bölümünün iÇine atmış olduk.

HASH Partitioning:
Btree yerine, hash mantığına göre dataların tutulduğu partitioning yöntemidir.
Ve bir kolondaki değere matematiksel fonksiyon uygulandıktan sonra dönen tamsayı değerine göre
dataları hashing mantığında indexleyen ve parÇalara bölen yapıdır.

KEY Partitioning:
Hash partitioninge benzer ve hash algoritmasını kullanılır. Tabloda key olarak
tanımladığımız kolonlar iÇin uygulanır.(primary key,uniq key…)

şimdiye kadar Mysql table partition ile ilgili bir fikir edinmiş olduk.
Bir sonraki yayınlayacağım Mysql Table Partition 2 adlı makalede de bol bol örneklerle
konuyu anlamış olacağız.

Bir sonraki makaleler de görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

Mysql Videolu Dersler

www.mysqlsupport.net olarak Türkiyede bir ilki daha gerÇekleştirip,
TürkÇe anlatımlı, görüntülü mysql dersleri, Mysql Videolu Dersler kategorisi altında
yakında yayına girecektir.

Faydalı olması dileğiyle,

Tayfur BÖLER
Database Administrator

Mysql Master-Master Replication

Mysql Master-Master Replication

Master-Slave Replication da hertürlü veri girişleri, updateler, deleteler,
yeni tablo oluşturma işlemleri vs Master database de yapılırdı. Slave
database sadece read only şeklinde kullanılır ve sadece select işlemleri
bu database”e yönlendirildi. Master-Maser replication da ise her iki master database
de de insert/update/delete vs işlemleri yapılır ve neredeyse her iki database
kendini anlık olarak eşler. Hem Master-Master hem de Master – Slave
Replication Asenkron replicationdur. Data eşleşmesini binary logları
kullanarak yapar.Yani Log-Based bir yapıya sahiptir. Senkron Replication
yani Cluster”ı ise bir sonraki makalemde detaylı olarak anlatacağım.

şimdi Master-Master replication”u nasıl yaparıza bakmaya başlayalım.

Ve adım adım işlemleri yapalım:

Elimizde 192.168.1.21 ve 192.168.1.22 ip li 2 tane mysql server kurulu
makinamız olmuş olsun. deneme isimli database”i replice edelim.

1. Adım: Her iki makinada da,

#bind-address = 127.0.0.1
#skip-networking ifadelerini /etc/mysql/my.cnf conf dosyasından kaldırıyoruz.
Yani başına # işareti koymamız yeterli.

2. Adım:

Server1:

GRANT REPLICATION SLAVE ON *.* TO “slaveUser2â?²@”%” IDENTIFIED BY “password”;
FLUSH PRIVILEGES;

Server1 de yukarıdaki replication userını tanımlıyoruz.Ve
/etc/init.d/mysql restart komutunu verek Server1â?²i restart ediyoruz.

Server2:

GRANT REPLICATION SLAVE ON *.* TO “slaveUser1â?²@”%” IDENTIFIED BY “password”;
FLUSH PRIVILEGES;

Server2 de yukarıdaki replication userını tanımlıyoruz.Ve
/etc/init.d/mysql restart komutunu verek Server2â?²i restart ediyoruz.

3. Adım:

Server1:
/etc/mysql/my.cnf de

[mysqld]
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = 192.168.1.22 (Master 2 serverın ip sini yazıyoruz)
master-user = slaveUser1 (Master 2 de oluşturduğumuz replicasyon userının adını yazıyoruz)
master-password = password (Master 2 de oluşturduğumuz replicasyon userının passwordunu yazıyoruz)
master-connect-retry = 60
replicate-do-db = deneme

log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = deneme

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

/etc/init.d/mysql restart komutunu verek Server1â?²i restart ediyoruz.

4. Adım:

Server2:

[mysqld]
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = 192.168.1.21 (Master 1 “in ipsini yazıyoruz.)
master-user = slaveUser2 (Master 1 de oluşturduğumuz replicasyon userının adını yazıyoruz)
master-password = password (Master 1 de oluşturduğumuz replicasyon userının passwordunu yazıyoruz)
master-connect-retry = 60
replicate-do-db = deneme

log-bin= /var/log/mysql/mysql-bin.log
binlog-do-db = deneme

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

/etc/init.d/mysql restart komutunu verek Server2â?²i restart ediyoruz.

5. Adım:

Server 2:

stop slave; (problem Çıkarsa reset slave yapın).
(server2 de change master bilgilerini doldururken server1 de SHOW MASTER STATUS; komutu verip bilgileri buraya yazın.)

CHANGE MASTER TO MASTER_HOST=“192.168.1.21â?²,
MASTER_USER=“slaveUser2â?²,
MASTER_PASSWORD=“password”,
MASTER_LOG_FILE=“mysql-bin.000049â?², (Server1 de SHOW MASTER STATUS; komutunun sonucuna göre doldur )
MASTER_LOG_POS=98; (Server1 deSHOW MASTER STATUS; komutunun sonucuna göre doldur )
start slave;

sonra;

LOAD DATA FROM MASTER;

yapın yetki hatası alırsanız
grant ALL on *.* to slaveUser1 komutunu veriniz.

6.Adım:

Server1:

stop salve; yapın.

(Server1 de change master bilgilerini doldururken server2 de SHOW MASTER STATUS; komutu verip bilgileri buraya yazın.)

CHANGE MASTER TO MASTER_HOST=“192.168.1.22â?²,
MASTER_USER=“slaveUser1â?²,
MASTER_PASSWORD=“password”,
MASTER_LOG_FILE=“mysql-bin.000048â?², (Server2 de SHOW MASTER STATUS; komutunun sonucuna göre doldurun. )
MASTER_LOG_POS=98; (Server2 de SHOW MASTER STATUS; komutunun sonucuna göre doldurun. )

start slave yapın.

İşte sonunda Master – Master replication Çalışmaya başlayacaktır.
Her iki servera da /etc/init.d/mysql restart komutunu verirseniz Replicationunuzu kullanmaya
başlayabileceksiniz.

Bir sonraki makaleler de görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

Mysql'de Cursor Kullanımı 2

Mysql’de Cursor Kullanımı 2

Bu procedure de ise ;
Albums tablosundan 3 farklı kolon Çekiliyor ama 3 farklı cursora
(buradaki amaÇ farklı kullanımları görmek) değerler atanıyor. Ve While
döngüsü iÇinde belli kriterlere göre kontroller yapıldıktan sonra songs
kolonu 25 er karakterlere bölünerek td_albumSongs tablosuna
insert yapılıyor.


CREATE DEFINER=`root`@`localhost` PROCEDURE `albumSongs`()
BEGIN
 DECLARE songs TEXT;  Â
DECLARE album varchar(30);
 DECLARE preview varchar(300);
 DECLARE AlID int;
 DECLARE done INT DEFAULT 0;
 DECLARE cur1 CURSOR FOR SELECT albumSongs FROM Albums;
 DECLARE cur2 CURSOR FOR SELECT albumID FROM Albums;
 DECLARE cur3 CURSOR FOR SELECT id FROM Albums ;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
 OPEN cur1;
 OPEN cur2;
 OPEN cur3;
REPEAT
 FETCH cur1 INTO songs;
 FETCH cur2 INTO album;
 FETCH cur3 INTO AlID;
   set @basla=1;
   set @sayac=25;
   set @a=1;
   set @b=101;     set @id=1;
     while (@a<@b) do          Â
insert into td_albumSongs (as_ID,as_sayac,as_albumID,as_songID,as_songPreview)
       values (AlID,@id,album,substring(songs,@basla,@sayac),’url’);
       set @a=@a+1;
       set @basla=@basla+25;
       set @sayac=@sayac+25;        Â
set @id=@id+1;
     end while;
     UNTIL done END REPEAT;
close cur1;
close cur2;
close cur3;
 delete from td_albumSongs2
 where  length(as_songID)=0;
  END$$

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator