23 Temmuz 2015 Perşembe

Mysql Int ile bigint arası fark nedir?


Mysql'de int ile bigint arası fark; int 4 byte yer kaplarken, bigint 8 byte yer kaplamaktadır. Maximum int sayısalabileceği sayı 4,294,967,295 maksimum bigint alabileceği sayı ise 18,446,744,073,709,551,615 dir. Eğer int(10) ile bigint(10) arası fark nedir diye soracaksanız fark sadece kapladıkları yer ve alabildikleri maksimum sayı değerleridir. Int (10) ile bigint(20) arası fark da aynı şekildedir. (5) ile (10) arasındaki fark sadece zerofill kullandığınız zaman ortaya çıkmaktadır. Zerofill bildiğiniz üzere (5) yazdığı halde 2 basamaklı sayı girdiğinizde sayının başına 3 kez 0 ekleme özelliğidir. Boyutsal olarak bir fark yoktur. Ayrıca maksimum int değeri girdiğimizde (4) gibi değil (10) olarak saklayacaktır. Aşağıdaki örnekleri yapınca bu farkı anlayacaksınız.
 
















 







Int ile bigint arasında ise sadece boyutsal ve alabileceği maksimum minimum rakamlar ile ilgili fark vardır. int(10) ile bigint(20) yi karşılaştırılsak;
iki farklı tip kolona da alabilecekleri taşacak sayısal değerleri girdik;













 
int maksimum 10 basamaklı sayısal değer almaktadır. Bigint ise maksimum 19 basamaklı değer almaktadır. (+ ve – değerler de aynı şekilde)

22 Temmuz 2015 Çarşamba

Mysql ile UpdateXML ve ExtractValue



Mysql veritabanında elimizde uzun xml içerikler içeren bir tablo var ve bu tablo üzerinde xml içerik üzerinde bir değişiklik yapmak isteyebiliriz. Bu durumda mysql'in UpdateXML fonksiyonunu kullanarak koca! xml içeriği içerisinden bir xml etiketi içeriğini değiştirebiliriz. İnternette birçok örnek var fakat hepsinde hatalı yazım bulunmakta =D xml'i yanlış yazdıklarından dolayı update işlemini gerçekleştirince xml kolon içeriğimiz NULL olmaktadır. Bende dedim düzgün bir örnek yazıyım.

İlk önce xml veri içerecek bir tablo oluşturalım. 

CREATE TABLE football ( 
           ID int(11) NOT NULL PRIMARY KEY,
           info TEXT
) ENGINE=InnoDB DEFAULT 
CHARSET=utf8 COLLATE=utf8_unicode_ci;

Şimdi de verileri ekleyelim.

INSERT INTO football VALUES (1,"
<footballmatch number='1'>       
<team>Fenerbahçe   
    <number>1</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>17</number>
    <name>Luis   
          <lastname>Nani</lastname>
          <f>R</f>
    </name>
</player>
<sets>   
    <apperance>7</apperance>
    <goal>3</goal>
    <assists>12</assists>  
</sets>
</footballmatch>");
INSERT INTO football VALUES (2,"
<footballmatch number='2'>       
<team> Fenerbahçe  
    <number>1</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>11</number>
    <name>Robin   
          <lastname>Van Persie</lastname>
          <f>L</f>
    </name>
</player>
<sets>   
    <apperance>5</apperance>
    <goal>11</goal>
    <assists>1</assists>  
</sets>
</footballmatch>");
INSERT INTO football VALUES(13,"
<footballmatch number='3'>       
<team> Salatasaray  
    <number>6</number>
    <division>Türkiye Süper Lig</division>
</team>
<player>  
    <number>55</number>
    <name>Sabri   
          <lastname>Sarıoğlu</lastname>
          <f>R</f>
    </name>
</player>
<sets>   
    <apperance>11</apperance>
    <goal>5</goal>
    <assists>0</assists>  
</sets>
</footballmatch>");

Update işlemini yapalım. Ama önce tablomuzdaki Sabri Sarıoğlunun verilerini görelim. Sonra update yapalım. Sonra tekrar çıktısına bakarak üzerindeki değişikliği görebiliriz.

| ID | info|
+----+-------+
| 13 |  <footballmatch number='3'>        
           <team> 6alatasaray   
                 <number>6</number>
                 <division>Türkiye Süper Lig</division>
            </team>
            <Player>   
                 <number>55</number>
                 <name>Sabri    
                      <lastname>Sarıoğlu</lastname>
                      <f>R</f>
                  </name>
             </Player>
             <sets>    
                   <apperance>11</apperance>
                   <goal>5</goal>
                   <assists>0</assists>

             </sets>
             </footballmatch>     |
UPDATE football SET info=UpdateXML(info,'/footballmatch/sets/assists','<assists>2</assists>')
WHERE ID=13;
| ID | info|
+----+-------+
| 13 |  <footballmatch number='3'>        
           <team> 6alatasaray   
                 <number>6</number>
                 <division>Türkiye Süper Lig</division>
            </team>
            <Player>   
                 <number>55</number>
                 <name>Sabri    
                      <lastname>Sarıoğlu</lastname>
                      <f>R</f>
                  </name>
             </Player>
             <sets>    
                   <apperance>11</apperance>
                   <goal>5</goal>
                   <assists>2</assists>
             </sets>
             </footballmatch>     |

Ayrıca UpdateXML içinde uzun uzun '/footballmatch/sets/goal' yazmak yerine '//goal' yazarak da güncelleme yapabiliriz. Fakat bu sefer tüm 2. nesil xml etiketlerindeki assists değerlerinin hepsi güncellenecektir. Mesela hem <Player> hemde <sets> içinde <goal> var ise ikisi de güncellenecektir. Burada sadece sets içinde <goal> olduğundan tek bir yer değişmektedir. Sıradaki örneğimiz Uçan Hollandalı Van Persie için gelsin...

mysql> select * from football WHERE ID=2;;+----+--+
| ID |   info       |
+----+---------+
|  2 |  <footballmatch number='2'>        
                 <team> FENERBAHÇE   
                      <number>1</number>
                     <division>Türkiye Süper Lig</division>
                </team>
                <Player>   
                       <number>11</number>
                       <name>Robin    
                             <lastname>Van Persie</lastname>
                             <f>L</f>
                      </name>
                 </Player>
                <sets>    
                      <apperance>5</apperance>
                      <goal>11<goal>
                      <assists>1</assists>
                </sets>
            </footballmatch>    |
UPDATE football SET MATCH_INFO=UpdateXML(MATCH_INFO,'//goal','<goal>20<goal>') WHERE ID=2;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from football WHERE ID=2;;+----+--+
| ID |   info       |
+----+---------+
|  2 |  <footballmatch number='2'>        
                 <team> FENERBAHÇE
                      <number>1</number>
                     <division>Türkiye Süper Lig</division>
                </team>
                <Player>   
                       <number>11</number>
                       <name>Robin    
                             <lastname>Van Persie</lastname>
                             <f>L</f>
                      </name>
                 </Player>
                <sets>    
                      <apperance>5</apperance>
                      <goal>20<goal>
                      <assists>1</assists>
                </sets>
            </footballmatch>    |
Sadece güncellediğimiz xml etiketini görmek istiyorsak ExtractXML fonksiyonunu kullanabiliriz. Örnek olarak 6alatasaray'lı reis Sabri'nin 2 assists ve 5 gol performansını verelim.


mysql> SELECT ExtractValue(MATCH_INFO,'/footballmatch/sets/assists') AS ASSISTS 
                FROM football WHERE ID=13;
+  ---------    +
|   ASSISTS |
+  ---------     +
|         2         |
+  ---------     +
1 row in set (0.00 sec)


mysql> SELECT ExtractValue(MATCH_INFO,'//goal') AS GOALS
                FROM football WHERE ID=13;
+  ---------    +
|   GOALS   |
+  ---------     +
|         5         |
+  ---------     +
1 row in set (0.00 sec)

Böylece yazımı bitiriyorum. Herkese saygılar sevgiler. Son olarak Hulk'un yaptığı gibi, ırkçılara sadece öpücük yolluyoruz...

Hulk: 'Sadece öpücük gönderiyorum'

7 Temmuz 2015 Salı

MariaDB Galera Cluster Kurulumu


DBA yolunda ilerlerken karşıma yeni bir görev geldi. MariaDB cluster kurulumu! Bunun içi Galera Cluster kurulumu yapmam gerekti. Peki nedir Galera Cluster?

 
MariaDB Galera Cluster; MariaDB için senkronizasyon olarak çalışan birden fazla node yapılı bir cluster tasarımıdır. Sadece Linux sistemlerinde çalışmaktadır. XtraDB ve InnoDB depolama sistemlerini desteklemektedir. Myisam için; wsrep_replicate_myisam özelliğini araştırınız.

Özellikleri;
  • Senkron çoğaltma
  • Active-active çok yapılı topoloji
  • Herhangi bir cluster node'una okuma ve yazma
  • Otomatik olarak cluster üyeliğine eklenim ve iptal olan node'lar otomatik olarak cluster yapısından çıkartılır. node ekleneceği zaman kolayca otomatik olarak cluster sisteme eklenebilir.
  • satır seviyesinde paralel replikasyon
  • Direct client connections, doğal MySQL görünüm
 Yararları;
  • Lag bağımı yok
  • Transaction kaybı yok
  • Read & write aynı anda olabilme özelliği
  • Küçük seviyede istemci gecikmeleri


Galera Cluster için Gerekli Sistem Özellikleri


Swap Alanı: Galera cluster ile normal bir MariaDb Server için gerekli hafızadan az harcar.

Node eklemek için;

$ mysqld --wsrep_cluster_address=gcomm://192.168.0.1  # DNS names work as well
192.168.0.1 birinci node'un adresi. Burada ikinci node'a yazarak ilk node'a bağlanıyoruz.

Cluster yeniden başlatmak için;

gcomm://<node1 address>,<node2 address>,...?pc.wait_prim=no

gcomm default olarak kullanılmaktadır. Bir ayrı özellik ise; dummy. Bu  boş-test cluster için kullanılmaktadır..

MariaDB Galera Cluster kurulumu

  • gerekli paketleri indirilmeli ve kurulmak. Önceden belirtilmiş.
        
sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
  • Tüm node'larda Mysql server var ise silinmelidir.
     
    yum erase mysql-server mysql mysql-devel
    sudo apt-get remove --purge mysql-server mysql-client mysql-common
    rm -rf /var/lib/mysql
  • Her üç node'da IP'leri ayarlamalı sonra ping ile test edilmeli. vi /etc/hosts'da:
           127.0.0.1 localhost ...
           ::1 localhost ….

            ip1 hostname1
            ip2 hostname2

  • Setenforce 0 ile Selinux deactivite ediniz. Iptables kapat firewall kapatınız.
Ubuntu'da firewall kapatma

You can save existing firewall rules as follows:$ sudo iptables-save > firewall.rules
Finally, type the following commands to stop firewall:
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
ufw kapat
$ sudo ufw disable

  • Ubuntu olmayan makinelerede repositoy oluşturma işlemi: 
     vi /etc/yum.repos.d/mariadb.repo


64 bit'te

[mariadb]
name = MariaDB
gpgcheck=1

32 bit'te

[mariadb]
name = MariaDB
gpgcheck=1


UBUNTU İÇİN BU İŞLEM YERİNE
sudo add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/ubuntu trusty main'


  • Sonrasında tüm cluster node'larda Mariadb ve galera yazılım paketlerini tüm node'larda yüklenir.
     
    yum install MariaDB-Galera-server MariaDB-client rsync galera

UBUNTU İÇİN BU İŞLEM YERİNE

sudo apt-get update && sudo apt-get install -y rsync galera mariadb-galera-server

Ubuntu'da eğer Galera Cluster version 10.0.20 kurulcaksa galera yazılan yerler galera-3 olmalı. Ve repository'de 5.5 yazan yer 10.0 olmalıdır.
  • mysql_secure_installation ile mysql root passport'u ayarla.
  • Veritabanına giriniz ve bir kullanıcı ayarlayınız. Bu kullanıcı tüm node'lar ile iletişime izinli kullanıcı olacak.


mysql -u root -p

DELETE FROM mysql.user WHERE user='';
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'dbpass'; dbpass:db parolanız
GRANT USAGE ON *.* to cluster_user@'%' IDENTIFIED BY 'securepass'; securepass:şifreniz
GRANT ALL PRIVILEGES ON *.* TO cluster_user@'%';
FLUSH PRIVILEGES;
quit


  • mysql -u cluster_user -p ile giriş yap. show database ile veritabanına bağlantıyı test et.
  • Ubuntu olan sistemler için UBUNTU İÇİN BU İŞLEM YERİNE kısmına bakınız. Ubuntu olmayan sistemlerde; tüm cluster'da vi /etc/my.cnf.d/server.cnf da [mariadb-10.0] dizininin alt kısmına bu bilgileri gir. wsrep_node_addres= node sisteminin IP adresi ve wsrep_cluster_address=”gcomm://node1IPsi,node2IPsi,node3IPsi olmalı. wsrep_node_name=nodeadı olmalıdır.



[mariadb-10.0]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=”gcomm://node1IPsi,node2IPsi,node3IPsi”
wsrep_cluster_name='node'
wsrep_node_adress='nodeadress'
#wsrep_sst_method=xtrabackup
wsrep_sst_method=rsync
wsrept_sst_auth=cluster_user:securepass

tüm cluster'lara aynı şekilde uygulayınız.

UBUNTU İÇİN BU İŞLEM YERİNE
  • /etc/mysql/conf.d/mariadb.cnf dosyasında gerekli değişiklikleri yapınız.
[mysqld]
#mysql settings 
binlog_format=ROW 
default-storage-engine=innodb 
innodb_autoinc_lock_mode=2 
query_cache_size=0 
query_cache_type=0 
bind-address=0.0.0.0 
#galera settings 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
wsrep_cluster_name="koha_wsrep_cluster" 
wsrep_cluster_address="gcomm://node1IPsi,node2IPsi" 
wsrep_sst_method=rsync
 
Bu işlemi her cluster node'una uygulayınız. 

  • Tüm node'larda Servisleri durdurun. sudo service mysql stop
  • cluster'ın ilk node'u çalıştırın. sudo service mysql start --wsrep-new-cluster … Sonra diğer cluster node'larında da çalıştır service mysql start ile.
  • Sonra cluster yapısını kontrol edecez. Mysql girişi yap
mysql -u root -p 

mariadb> show status like 'wsrep%'”

mariadb> 'SELECT VARIABLE_VALUE as "cluster size" 
          1>  FROM INFORMATION_SCHEMA.GLOBAL_STATUS 
          2>  WHERE VARIABLE_NAME="wsrep_cluster_size"'

mariadb> show variables like 'wsrep%'\G  dedikten sonra wsrep_cluster_name ve wsrep_cluster_address değerlerini kontrol edebilirsiniz.


İkinci node'u bağlamak için;

node2# service mysql start
[ ok ] Starting MariaDB database server: mysqld . . . . . . . . . ..
[info] Checking for corrupt, not cleanly closed and upgrade needing tables..
node1:/home/debian# ERROR 1045 (28000): 
Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)

Bu hata es geçilebilir.
Sonraki node'ları bağladıktan sonra show status like 'wsrep%' ile wsrep_cluster_size'a bakılmalıdır. Değeri kaç node varsa o sayı olmalıdır. Böylece 2-3 veya daha fazla node'un bağlandığı görülür.

  • Şimdi bir veritabanı oluşturup test yapalım. Show databases ile hangi veritabanları var onları kontrol ediniz.
    Birinci node'da create database testdatabase; dedikten sonra show database ile veritabanlarına bakınız. Ikinci node'da da show database ile veritabanlarına bakınız. Aynı şekilde varsa üçüncü node'da da bakınız. Veritabanı diğer node'larda da oluşmuş ise doğru bağlantı!
create table emp(number int, name varchar2(10)); ile bir node'da tablo oluşturulur. Sonra bu tablo diğer node'larda bu tablo oluştu mu kontrol ediniz.
Herhangi bir node'da drop database testdatabase dediğinde diğer node'Larda da o database yok olacaktır.

Yazı bitti. Saygılar sevgiler...
Ahmet Melih Başbuğ