Merhaba arkadaşlar uzun bir aradan sonra mysql’de replikasyon yaptığımızda verilerin (aslında id diye belirttiğimiz benzersiz alanların) çakışmaması için ne yapılması gerektiğini(MySQL Auto-Increment Replikasyonu) ele alacağız.

Oldukça basit bir kullanımı var. Kaç veritabanı sunucusu olduğu ve hangi sırada olduğunu belirteceğiz. Ardıdan işlemi tamamlamış olacağız.

MySQL Auto-Increment Replikasyonu Başlıyoruz:

my.cnf ve my.ini dosyamızı açıyoruz.(Varsayılan Konum: Ubuntu: /etc/my.cnf; Windows: C:/ProgramData/MySQL/MySQL Server x.x/my.ini)

auto_increment_increment
auto_increment_offset

Bu iki satırı ekleyerek işlemi tamamlayacağız. Fakat bunu bütün replikasyondaki sunucularımıza yapmamız gerekiyor.

auto_increment_increment Kaç tane sunucumuz varsa onu yazıyoruz.
auto_increment_offset Her sunucuya benzersiz index numarası diyebiliriz. 3 tane replikasyonda cihazımızın olduğunu düşünürsek; sırayla 1-2-3 vermemiz gerekiyor.

3 serverimiz olduğunu ve bunlara A,B,C diye isimlendirdiğimizi varsayıyorum.

A Server

 

B Server

 

C Server

 

Configrasyon dosyalarını bu şekilde ayarladıktan sonra hepsini restart ediyoruz.

Burda gerçekleşen işlemi bahsetmek gerekirse;

AI=(AI_increment*artan AI)+AI_offset
(AI=autoincrement değeri)

Yani 3 serverda da;

Server A=(3*1)+1 //4
Server B=(3*1)+2 //5
Server C=(3*1)+3 //6

Server A=(3*2)+1 //7
Server B=(3*2)+2 //8
Server C=(3*2)+3 //9

Bu şekilde sürekli artarak gidecektir. Görüldüğü üzere asla farklı serverler asla birbiri ile çakışmayacaktır.

Daha fazla bilgi için: http://dev.mysql.com/doc/refman/5.7/en/replication-options-master.html

Biraz karışık anlattım sanırım; affola 🙂

Merhaba arkadaşlar, daha önce Master-Slave replikasyonu anlatmaştık. Bu yazımızda Master-Master replikasyonu anlatacağız.

MySQL için 2(iki) tür replikasyon türü bulunmaktadır.

  1. Master-Slave Replikasyon
  2. Master-Master Replikasyon

Master Master Replikasyon

Master Master replikasyonda; herhangi bir master sunucuda yapılan değişiklik diğer master sunucuya aynı şekilde aktarılır.

Master sunucularımızın iplerini belirliyoruz.

Master Sunucu 1(Master1): 192.168.1.17
Master Sunucu 2(Master2): 192.168.1.18

MySQL portuna(varsayılan 3306) izin veriyoruz.

 

MySQL’i durduruyoruz.

 

Master Sunucu Ayarları
my.cnf veya my.ini dosyasını açıyoruz.(Varsayılan Konum: Ubuntu: /etc/my.cnf; Windows: C:/ProgramData/MySQL/MySQL Server x.x/my.ini)

Windows için bir IDE veya metin editörü ile açıyoruz. Konfigrasyon dosyasının içinde

bu satırlar bulunuyorsa başına diez (#) işareti koyarak etkisizleştiriyoruz. Gerekli ayarları [mysqld] altında gerçekleştiriyoruz;
server-id=x sunucuların birbirinden farklı idye sahip olması gerekiyor.
log-bin=mysql-bin replikasyon işlemi için binary loglarını kullanacağımızı belirtip, aktif ediyoruz.
bin-log-do-db=veritabanıadı hangi veri tabanını/tabanlarını replikasyon olacağını belirtiyoruz. Toplarsak;

MySQL’i tekrar başlatıyoruz.

 

Master sunucu için ayarlarımız bunlar. Diğer master sunucu için master sunucu üzerinde bir kullanıcı oluşturacağız.

Burda MySQL’e bağlanıyoruz, replikasyon işlemleri için kullanıcı oluşturuyoruz. Master sunucusunda log dosyasının pozisyon bilgilerini alıyoruz. Bu bilgiler birazdan gerekecek.

-psifre kısmında dikkat edilmesi gereken, burası bir yazım hatası değildir. Şifrenin 1234 olduğunu varsayarsak -p parametresi ile bitişik yazıyoruz: -p1234

Veritabanımızı dışa aktardık. Diğer Master sunucuda içe aktaracağız.

Veri tabanımızı kitlemiştik, UNLOCK TABLES ile kilidi açmış olduk.

Master2 Sunucu Ayarları

MySQL’i durduruyoruz.

Veritabanını oluşturuyoruz.

Master1 sunucudan aldığımız veritabanı kopyasını içeri aktarıyoruz.

MySQL konfigrasyonunu yapıyoruz. my.cnf veya my.ini dosyasını açıyoruz, aşağıdaki şekilde düzenliyoruz.

Sıra geldi aldığımız pozisyon bilgilerini girmeye.

Buraya kadar yaptıgımız işlemler Master-Slave Replikasyon ile aynı işlemlerdi. Şimdi bir kaç ekleme yapıyoruz. Master2 Sunucuda öncelikle master1 için kullanıcı oluşturup master bilgilerini alıyoruz.

Burdan almış olduğumuz master bilgilerini diğer sunucuda (master1) kullanacağız.

Master 1 Ek Sunucu Ayarları:

MySQL’i başlatıyoruz.

Bitti şimdi test edebilirsiniz.

Genel olarak; Master-Slave replikasyon işleminin aynısı olarak, Master slave replikasyondaki slave sunucya, master; master sunucuya slave özelliğini ekledik.

Kaynak:https://www.digitalocean.com/community/tutorials/how-to-set-up-mysql-master-master-replication

Bir sonraki yazımızda iki sunucunun verilerinin çakışmamasını sağlayacağız.(örneğin internet bağlantısı koptugunda girilen verilerin çakışması)

Merhaba arkadaşlar, bu yazımızda subquery içinde EXISTS ve NOT EXISTS kullanımı inceleyeceğiz.IN ve NOT IN‘e en iyi alternatif.

Kendi yapmış olduğum testlere göre EXISTS ve NOT EXISTS 65 kat daha hızlı. Kullanımı where den sonra exists() veya not exists(subquery) şeklindedir.

İki tablomuzun olduğunu varsayalım, stok ve stok hareket. (stok:ürünlerimiz, ürünlerimizin giriş çıkış kayıtları).

stock tablomuzda ID,STOCKCODE,STOCKNAME alanları olsun,
stocktrans tablomuzda ID,STOCKID,ENTRYPIECE(Giriş miktarı),EXITPIECE(Çıkış miktarı).

Stok tablosunda olup stok hareket tablosunda olmayan kayıtları ve her iki tabloda olan kayıtları bulalım. Tabiki burda in veya not exists kullanmak doğru olmaz ama örnek amaçlı olarak kullanacağız. (join kullanılmalı 🙂 )

Önemli bir not: exists ve not exists subquerisinde SELECT * deymiyle başlamalıdır.

Kullanımı bu şekilde 🙂

Master slave replikasyon. Replikasyon kopyalama, eşlenme anlamına gelmektedir. Veritabanlarında ise; bir yedek bulundurmak, veri güvenliği, veri erişilebilirliği, yüksek düzeylerde IO alan sunucularda sunucu yükünü biraz azaltmak gibi amaçlarla farklı fiziksel/sanal sunucularda senkronize şekilde verilerin kopyalanmasıdır.

Örnek olarak; resmi bir kuruma bir proje yaptınız ve bunun yedeklerini tutmak istediğinizde kullanabileceğiniz bir yöntem.

MySQL için 2(iki) tür replikasyon türü bulunmaktadır.

  1. Master-Slave Replikasyon
  2. Master-Master Replikasyon

Master Slave Replikasyon

Bu mimaride Master sunucuda yapılan değişiklikler slave sunuculara aktarılır. Veri akışı tek yönlüdür. Yani; Master sunucuda yapılan değişiklikler Slave sunuculara aktarılır. Slave sunucuda yaptığımız değişiklikler Master sunucuya aktarılmaz.

Öncelikle sunucularımıza ipleri belirliyoruz.

Master Sunucu : 192.168.2.17
Slave Sunucu : 192.168.2.18

MySQL portuna(varsayılan 3306) izin veriyoruz.

MySQL’i durduruyoruz.

Master Sunucu Ayarları
my.cnf veya my.ini dosyasını açıyoruz.(Varsayılan Konum: Ubuntu: /etc/my.cnf; Windows: C:/ProgramData/MySQL/MySQL Server x.x/my.ini)

Windows için bir IDE veya metin editörü ile açıyoruz. Konfigrasyon dosyasının içinde

bu satırlar bulunuyorsa başına diez (#) işareti koyarak etkisizleştiriyoruz. Gerekli ayarları [mysqld] altında gerçekleştiriyoruz;
server-id=x sunucuların birbirinden farklı idye sahip olması gerekiyor.
log-bin=mysql-bin replikasyon işlemi için binary loglarını kullanacağımızı belirtip, aktif ediyoruz.
bin-log-do-db=veritabanıadı hangi veri tabanını/tabanlarını replikasyon olacağını belirtiyoruz. Toplarsak;

MySQL’i tekrar başlatıyoruz.

Master sunucu için ayarlarımız bunlar. Slave sunucu için master sunucu üzerinde bir kullanıcı oluşturacağız.

Burda MySQL’e bağlanıyoruz, replikasyon işlemleri için kullanıcı oluşturuyoruz. Master sunucusunda log dosyasının pozisyon bilgilerini alıyoruz. Bu bilgiler birazdan gerekecek.

 

-psifre kısmında dikkat edilmesi gereken, burası bir yazım hatası değildir. Şifrenin 1234 olduğunu varsayarsak -p parametresi ile bitişik yazıyoruz: -p1234

Veritabanımızı dışa aktardık. Slave sunucuda içe aktaracağız.

Veri tabanımızı kitlemiştik, UNLOCK TABLES ile kilidi açmış olduk.

Slave Sunucu Ayarları

MySQL’i durduruyoruz.

Veritabanını oluşturuyoruz.

Master sunucudan aldığımız veritabanı kopyasını içeri aktarıyoruz.

MySQL konfigrasyonunu yapıyoruz. my.cnf veya my.ini dosyasını açıyoruz, aşağıdaki şekilde düzenliyoruz.

Burda önemli olan kısım server-id, 2 olarak ayarladım. Yeni bir slave sunucu daha eklemek isterseniz 3 veya daha büyük bir id tanımlamalısınız. Yani benzersiz değer olmalı.Sıra geldi aldığımız pozisyon bilgilerini girmeye.

MySQL’i başlatıyoruz.

Evet sonunda bitirdik 🙂 Şimdi test edebilirsiniz.

Merhaba arkadaşlar; insert or update (INSERT … ON DUPLICATE KEY UPDATE) işlevi, belirtilen unique veya primary keye göre veri yoksa insert işlemi, varsa update işlemi yapar. Bu işlev MySQL 5.0 ile gelmiştir. Daha önceki sürümler desteklemez.

Kod Yapısı:

Burda a unique veya primary key b,c ise normal değerler. Eğer manuel değerler girmek istiyorsak b=VALUES(b) yerine b=’myazarc’ şeklinde olmalıdır.

Hangi unique keye göre güncelleme işlemi yapılacaksa o alan update kısmında belirtilmez.

Daha fazla bilgi: INSERT … ON DUPLICATE KEY UPDATE Syntax