SQL Notları: partitioning, replication

MySQL, büyük veri kümelerini yönetmek ve yüksek kullanılabilirlik sağlamak için çeşitli yöntemler sunar. Bu yazıda, **bölümleme (partitioning)** ve **çoğaltma (replication)** kavramlarını ele alacağız. Bu teknikler, veritabanı performansını artırmak ve veri güvenliğini sağlamak için oldukça önemlidir.

### Bölümleme (Partitioning)

Bölümleme, büyük tabloları daha küçük ve yönetilebilir parçalara ayırma işlemidir. Bu, sorgu performansını artırabilir ve veri yönetimini kolaylaştırabilir. MySQL’de üç temel bölümleme türü vardır: **RANGE**, **LIST** ve **HASH**.

#### 1. RANGE Bölümleme
RANGE bölümleme, belirli bir aralıktaki değerlere göre verileri bölümlemek için kullanılır. Örneğin, bir mağaza zincirindeki çalışanları mağaza kimlik numaralarına göre bölümleyebilirsiniz:

“`sql
ALTER TABLE employees PARTITION BY RANGE (store_id) (
   PARTITION p0 VALUES LESS THAN (6),
   PARTITION p1 VALUES LESS THAN (11),
   PARTITION p2 VALUES LESS THAN (16),
   PARTITION p3 VALUES LESS THAN MAXVALUE
);
“`

Bu örnekte, `store_id` değerine göre çalışanlar dört farklı bölüme ayrılmıştır.

#### 2. LIST Bölümleme
LIST bölümleme, belirli bir değer listesine göre verileri bölümlemek için kullanılır. Örneğin, mağazaları bölgelere göre bölümleyebilirsiniz:

“`sql
ALTER TABLE employees PARTITION BY LIST(store_id) (
   PARTITION pNorth VALUES IN (3, 5, 6, 9, 17),
   PARTITION pEast VALUES IN (1, 2, 10, 11, 19, 20),
   PARTITION pWest VALUES IN (4, 12, 13, 14, 18),
   PARTITION pCentral VALUES IN (7, 8, 15, 16)
);
“`

Bu örnekte, her bölgeye ait mağaza kimlik numaraları belirli bölümlere atanmıştır.

#### 3. HASH Bölümleme
HASH bölümleme, verileri belirli bir sayıda bölüme eşit olarak dağıtmak için kullanılır. Bu yöntem, bölümleme işlemini otomatik olarak gerçekleştirir:

“`sql
CREATE TABLE employees (
   id INT NOT NULL,
   fname VARCHAR(30),
   lname VARCHAR(30),
   hired DATE NOT NULL DEFAULT ‘1970-01-01’,
   separated DATE NOT NULL DEFAULT ‘9999-12-31’,
   job_code INT,
   store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;
“`

Bu örnekte, `store_id` sütununa göre veriler dört bölüme eşit olarak dağıtılır.

### Çoğaltma (Replication)

Çoğaltma, bir veritabanı sunucusundaki verilerin bir veya daha fazla sunucuya kopyalanması işlemidir. Bu, yüksek kullanılabilirlik ve yedekleme sağlar. MySQL’de **Master-Slave** çoğaltma yapısı yaygın olarak kullanılır.

#### Master-Slave Çoğaltma Kurulumu

1. **Master Sunucu Yapılandırması:**
  – Master sunucuda bir kullanıcı oluşturun ve çoğaltma izinleri verin:
    “`sql
    CREATE USER ‘repl_user’@’%’ IDENTIFIED BY ‘password’;
    GRANT REPLICATION SLAVE ON *.* TO ‘repl_user’@’%’;
    FLUSH PRIVILEGES;
    “`
  – `my.cnf` dosyasına aşağıdaki satırları ekleyin:
    “`ini
    server-id = 1
    log-bin = mysql-bin.log
    binlog-do-db = your_database
    “`
  – MySQL sunucusunu yeniden başlatın.

2. **Slave Sunucu Yapılandırması:**
  – `my.cnf` dosyasına aşağıdaki satırları ekleyin:
    “`ini
    server-id = 2
    master-host = master_ip_address
    master-user = repl_user
    master-password = password
    replicate-do-db = your_database
    “`
  – MySQL sunucusunu yeniden başlatın.

3. **Verileri Slave’e Kopyalama:**
  – Master sunucuda verileri kilitleyin ve yedek alın:
    “`sql
    FLUSH TABLES WITH READ LOCK;
    mysqldump your_database -u root -p > backup.sql;
    “`
  – Yedeği Slave sunucuya aktarın:
    “`bash
    mysql -u root -p your_database < backup.sql
    “`

4. **Çoğaltmayı Başlatma:**
  – Master sunucuda log dosyası ve pozisyon bilgisini alın:
    “`sql
    SHOW MASTER STATUS;
    “`
  – Slave sunucuda çoğaltmayı başlatın:
    “`sql
    CHANGE MASTER TO MASTER_HOST=’master_ip_address’, MASTER_USER=’repl_user’, MASTER_PASSWORD=’password’, MASTER_LOG_FILE=’mysql-bin.000001′, MASTER_LOG_POS=130;
    START SLAVE;
    “`

### Çoğaltma Hataları ve Çözümleri

Çoğaltma sırasında hatalar oluşabilir. Örneğin, bir sorgu Slave’de çalıştırılamazsa çoğaltma durdurulabilir. Bu tür hataları atlamak için aşağıdaki komut kullanılabilir:

“`sql
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
“`

Ancak, bu tür hataları atlamak veri tutarsızlığına neden olabileceğinden dikkatli olunmalıdır.

### Sonuç

MySQL’de bölümleme ve çoğaltma, büyük veri kümelerini yönetmek ve yüksek kullanılabilirlik sağlamak için güçlü araçlardır. Doğru yapılandırıldığında, bu teknikler veritabanı performansını önemli ölçüde artırabilir ve veri güvenliğini sağlayabilir. Bu yöntemleri uygularken, veri tutarlılığını korumak ve olası hataları dikkatlice yönetmek önemlidir.