Takip et

MySQL Veri Dizinini Ubuntu 16.04’te Yeni Bir Konuma Taşıma

MySQL Veri Dizinini Ubuntu 16.04’te Yeni Bir Konuma Taşıma Giriş MySQL veri dizinini (datadir) varsayılan konumundan başka bir yere taşımak, v

MySQL Veri Dizinini Ubuntu 16.04’te Yeni Bir Konuma Taşıma

Giriş

MySQL veri dizinini (datadir) varsayılan konumundan başka bir yere taşımak, veritabanı yöneticileri için yaygın bir gereklilik olabilir. Bu işlem, genellikle disk alanı yönetimi, performans iyileştirmeleri, farklı depolama türlerini kullanma (örneğin, daha hızlı SSD’ler veya daha büyük HDD’ler), yedekleme stratejileri veya güvenlik politikaları gibi çeşitli nedenlerle gündeme gelir. Ubuntu 16.04 gibi bir Linux dağıtımında bu işlem, özellikle AppArmor gibi güvenlik mekanizmaları nedeniyle dikkatli adımlar gerektirir.

Bu kapsamlı teknik makale, MySQL veri dizinini Ubuntu 16.04 sunucusunda güvenli ve etkili bir şekilde yeni bir konuma taşıma sürecini adım adım açıklamaktadır. Amacımız, veri kaybı riskini en aza indirerek ve olası sorunları önleyerek bu işlemi başarıyla tamamlamanızı sağlamaktır. Makale boyunca, her adımın nedenini açıklayacak, ilgili komutları sunacak ve sık karşılaşılan sorunlara çözüm önerileri getireceğiz. Bu rehber, temel Linux komut bilgisine ve sunucu yönetimi deneyimine sahip okuyucular için tasarlanmıştır.

Önkoşullar ve Hazırlık

MySQL veri dizinini taşıma işlemine başlamadan önce, sorunsuz bir geçiş sağlamak için bazı önkoşulları yerine getirmek ve gerekli hazırlıkları yapmak kritik öneme sahiptir. Bu bölüm, dikkat etmeniz gereken temel noktaları ve yapmanız gereken hazırlıkları detaylandırmaktadır.

Sistem Gereksinimleri

Bu rehber, Ubuntu 16.04 işletim sistemi üzerinde çalışan bir MySQL sunucusuna odaklanmaktadır. MySQL’in sunucunuza kurulu ve çalışır durumda olduğunu varsayıyoruz. İşletim sistemi sürümünün doğruluğu ve MySQL’in düzgün çalıştığından emin olmak, sonraki adımların başarısı için önemlidir.

Root Yetkisi

Veri dizinini taşımak, MySQL yapılandırma dosyalarını değiştirmek ve AppArmor politikalarını güncellemek gibi işlemler, süper kullanıcı (root) yetkisi gerektirir. Bu nedenle, sudo komutunu kullanabilen bir kullanıcıyla oturum açtığınızdan veya doğrudan root kullanıcısı olarak çalıştığınızdan emin olun.

Yeterli Disk Alanı

Yeni veri dizini konumunda, mevcut MySQL veri dizininin tamamını barındıracak kadar yeterli boş disk alanı bulunmalıdır. Taşıma işlemi sırasında, eski dizin silinene kadar hem eski hem de yeni konumda verilerin bir kopyası bulunacağından, en az iki katı kadar boş alana sahip olmanız önerilir. Yeni disk alanının performans özellikleri (IOPS, gecikme süresi) mevcut diskten daha iyi veya en azından aynı seviyede olmalıdır, aksi takdirde performans düşüşleri yaşanabilir.

Yeni disk bölümünün veya dizininin doğru şekilde bağlandığından ve erişilebilir olduğundan emin olun. Örneğin, /mnt/new_data_drive gibi bir konum kullanabilirsiniz.

Yedekleme

Bu, taşıma işleminin en kritik adımıdır. Herhangi bir veri kaybını önlemek için, taşıma işlemine başlamadan önce mevcut tüm MySQL veritabanlarınızın eksiksiz bir yedeğini almanız ZORUNLUDUR. İki ana yedekleme türü vardır: mantıksal ve fiziksel yedekleme.

Mantıksal Yedekleme (mysqldump)

Mantıksal yedekleme, veritabanı şemalarını ve verileri SQL ifadeleri olarak dışa aktarır. Bu, veritabanının yapısını ve içeriğini kaydetmenin en yaygın yollarından biridir ve genellikle daha küçük veritabanları için tercih edilir.

mysqldump -u root -p --all-databases > /path/to/secure/backup/all_databases_backup.sql

Bu komut, tüm veritabanlarını yedekleyecektir. Yedeği, taşıdığınız diskten farklı bir yerde (örneğin, harici bir depolama birimi veya başka bir sunucu) sakladığınızdan emin olun.

Fiziksel Yedekleme (rsync/tar)

Fiziksel yedekleme, MySQL veri dizininin doğrudan kopyalanmasıdır. Bu, özellikle büyük veritabanları için daha hızlı bir geri yükleme yöntemi sunar. Taşıma işlemi sırasında kullanacağımız rsync komutu, aslında bir tür fiziksel yedekleme görevi görecektir. Ancak, yine de ayrı bir fiziksel yedekleme almak ekstra güvenlik sağlar.

# MySQL servisini durdurun
sudo systemctl stop mysql

Veri dizinini kopyalayın

sudo rsync -av /var/lib/mysql /path/to/secure/backup/mysql_physical_backup

MySQL servisini başlatın (sadece yedekleme amaçlı durdurulduysa)

sudo systemctl start mysql

Bu fiziksel yedekleme, veri dizinindeki tüm dosyaları (InnoDB günlük dosyaları, tablo dosyaları vb.) kopyalar.

Mevcut Veri Dizinini Belirleme

MySQL’in şu anda hangi veri dizinini kullandığını bilmek önemlidir. Bu bilgiyi birkaç farklı yolla edinebilirsiniz:

1. MySQL Komut Satırından:

mysql -u root -p
    SHOW VARIABLES LIKE 'datadir';
    EXIT;

Bu komut, datadir değişkeninin değerini gösterecektir. Çoğu Ubuntu kurulumunda bu /var/lib/mysql/ şeklindedir.

2. MySQL Yapılandırma Dosyalarından:
MySQL yapılandırma dosyaları genellikle /etc/mysql/my.cnf veya /etc/mysql/mysql.conf.d/mysqld.cnf konumunda bulunur. Bu dosyalarda datadir değişkenini arayarak mevcut dizini bulabilirsiniz.

grep "datadir" /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/*.cnf

SELinux/AppArmor Kontrolü

Ubuntu 16.04, sistem güvenliğini artırmak için AppArmor adlı bir güvenlik modülü kullanır. AppArmor, uygulamaların belirli sistem kaynaklarına (dosyalar, dizinler, ağ portları vb.) erişimini kısıtlayan profiller tanımlar. MySQL için de bir AppArmor profili mevcuttur ve bu profil, MySQL’in yalnızca /var/lib/mysql gibi belirli dizinlere erişmesine izin verir. Veri dizinini yeni bir konuma taşıdığımızda, AppArmor profilini de bu yeni konumu içerecek şekilde güncellememiz gerekecektir.

AppArmor’ın durumunu kontrol etmek için:

sudo apparmor_status

Bu komut, yüklü ve etkin AppArmor profillerini listeleyecektir. usr.sbin.mysqld profilinin listelendiğinden emin olun. Eğer AppArmor devre dışıysa, bu adımı atlayabilirsiniz ancak güvenlik riskleri taşıyabilir.

Tüm bu ön hazırlıklar tamamlandığında, MySQL veri dizinini taşıma işlemine güvenle başlayabiliriz.

MySQL Veri Dizinini Taşıma Adımları

Şimdi, MySQL veri dizinini Ubuntu 16.04’te yeni bir konuma taşımak için gereken adımları ayrıntılı olarak inceleyelim. Her adım, olası sorunları önlemek ve veri bütünlüğünü sağlamak için dikkatle uygulanmalıdır.

Adım 1: MySQL Servisini Durdurma

Veri dizinini kopyalamadan önce MySQL servisinin tamamen durdurulması hayati önem taşır. Eğer servis çalışırken veri dosyalarını kopyalamaya çalışırsanız, tutarsız veya bozuk bir veri kopyası elde edebilirsiniz, bu da veri kaybına yol açabilir.

sudo systemctl stop mysql

Servisin başarıyla durdurulduğunu doğrulamak için aşağıdaki komutu kullanın:

sudo systemctl status mysql

Çıktıda “Active: inactive (dead)” veya benzeri bir ifade görmelisiniz.

Adım 2: Veri Dizinini Yeni Konuma Kopyalama

MySQL veri dizinini yeni konuma kopyalamak için rsync komutunu kullanmak en iyi yöntemdir. rsync, dosyaların sahipliklerini, izinlerini, zaman damgalarını ve diğer meta verilerini koruyarak kopyalama yapar, bu da cp komutuna göre daha güvenlidir.

Öncelikle, yeni veri dizininin olacağı ana dizini oluşturun (eğer mevcut değilse). Örneğin, /mnt/mysql_data yeni ana dizinimiz olsun.

sudo mkdir -p /mnt/mysql_data

Şimdi, mevcut MySQL veri dizinini yeni konuma kopyalayın. Varsayılan veri dizini /var/lib/mysql ve yeni hedef dizin /mnt/mysql_data/mysql olsun.

sudo rsync -av /var/lib/mysql /mnt/mysql_data/

* -a: Arşiv modunu etkinleştirir. Bu, dosyaları özyinelemeli olarak kopyalar ve sembolik bağlantıları, özel dosyaları, aygıt dosyalarını, dizinleri, izinleri, sahiplikleri ve zaman damgalarını korur.
* -v: Ayrıntılı çıktıyı etkinleştirir, böylece kopyalanan dosyaları görebilirsiniz.

Kopyalama işlemi tamamlandıktan sonra, yeni dizinin sahiplik ve izinlerinin doğru olduğundan emin olun. MySQL genellikle mysql kullanıcısı ve mysql grubu altında çalışır.

sudo chown -R mysql:mysql /mnt/mysql_data/mysql
sudo chmod -R 700 /mnt/mysql_data/mysql

* chown -R mysql:mysql: Yeni veri dizinindeki tüm dosya ve dizinlerin sahipliğini mysql kullanıcısına ve mysql grubuna atar.
* chmod -R 700: Yeni veri dizinindeki tüm dosya ve dizinlere yalnızca sahibinin okuma, yazma ve çalıştırma izinleri olmasını sağlar. Bu, MySQL veri dizinleri için önerilen güvenli bir izin ayarıdır.

Güvenli bir geri dönüş yolu sağlamak için, eski veri dizinini hemen silmek yerine yeniden adlandırmanız önerilir:

sudo mv /var/lib/mysql /var/lib/mysql_old

Bu, bir sorun çıkması durumunda eski verilere hızlıca geri dönmenizi sağlar.

Adım 3: MySQL Yapılandırma Dosyasını Güncelleme

MySQL’e yeni veri dizini konumunu bildirmek için yapılandırma dosyasını güncellemeniz gerekir. Ubuntu 16.04’te bu dosya genellikle /etc/mysql/mysql.conf.d/mysqld.cnf konumundadır.

Bir metin düzenleyici ile dosyayı açın:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] bölümünü bulun ve datadir satırını yeni konumu gösterecek şekilde değiştirin:

[mysqld]

... diğer ayarlar ...

datadir = /mnt/mysql_data/mysql

... diğer ayarlar ...

Eski datadir satırını yorum satırı yapabilir veya silebilirsiniz. Değişikliği kaydedin ve düzenleyiciden çıkın (Nano’da Ctrl+O, Enter, Ctrl+X).

Adım 4: AppArmor Politikalarını Güncelleme

Ubuntu’daki AppArmor güvenlik modülü, MySQL’in varsayılan dizin dışındaki herhangi bir konuma erişmesini engeller. Bu nedenle, yeni veri dizini konumunu AppArmor profiline eklemeniz gerekir.

MySQL’in AppArmor profili /etc/apparmor.d/usr.sbin.mysqld dosyasında bulunur. Bu dosyayı bir metin düzenleyici ile açın:

sudo nano /etc/apparmor.d/usr.sbin.mysqld

Bu dosyanın içinde, /var/lib/mysql/ ile ilgili satırları bulacaksınız. Bu satırların altına veya yanına, yeni veri dizininizin yolunu eklemeniz gerekir. Örnek olarak, aşağıdaki satırları ekleyebilirsiniz:

# ... mevcut satırlar ...

Allow access to the new data directory

/mnt/mysql_data/mysql/ r, /mnt/mysql_data/mysql/ rwk,

... diğer mevcut satırlar ...

* /mnt/mysql_data/mysql/ r,: MySQL’in yeni ana veri dizinine okuma erişimi sağlar.
/mnt/mysql_data/mysql/* rwk,: MySQL’in yeni veri dizini içindeki tüm dosya ve alt dizinlere okuma, yazma ve kilit (rwk) erişimi sağlar. Bu, veritabanı işlemlerinin düzgün çalışması için gereklidir.

Değişiklikleri kaydedin ve dosyayı kapatın.

AppArmor profilini güncelledikten sonra, değişikliklerin etkili olması için AppArmor servisini yeniden yüklemeniz gerekir:

sudo systemctl reload apparmor

Bu adımın doğru yapılması, MySQL’in yeni konumdaki verilere erişebilmesi için kritik öneme sahiptir. Eğer bu adımı atlarsanız veya yanlış yapılandırırsanız, MySQL servisi başlamayacaktır.

Adım 5: MySQL Servisini Başlatma ve Doğrulama

Tüm yapılandırma değişikliklerini yaptıktan sonra, MySQL servisini başlatabilir ve her şeyin düzgün çalıştığından emin olmak için doğrulama yapabilirsiniz.

MySQL servisini başlatın:

sudo systemctl start mysql

Servisin başarıyla başladığını kontrol edin:

sudo systemctl status mysql

Eğer servis aktif ve çalışır durumda görünüyorsa (“Active: active (running)”), sonraki doğrulama adımlarına geçebilirsiniz. Eğer başlamazsa, hata günlüklerini kontrol etmeniz gerekecektir (bir sonraki bölümde ele alınacaktır).

MySQL’e bağlanın ve datadir değişkeninin yeni konumu gösterdiğinden emin olun:

mysql -u root -p
SHOW VARIABLES LIKE 'datadir';
EXIT;

Çıktıda datadir değerinin /mnt/mysql_data/mysql/ olarak göründüğünden emin olun.

Son olarak, veritabanlarınızın erişilebilir olduğundan ve düzgün çalıştığından emin olmak için basit bir sorgu çalıştırın:

mysql -u root -p -e "SHOW DATABASES;"

Veya belirli bir veritabanındaki bir tablodan veri çekmeyi deneyin:

mysql -u root -p -e "USE your_database_name; SELECT COUNT(*) FROM your_table_name;"

Eğer tüm veritabanlarınız ve tablolarınız beklendiği gibi görünüyorsa ve sorgular sorunsuz çalışıyorsa, taşıma işlemi başarılı olmuştur.

Adım 6: Eski Veri Dizinini Kaldırma

Taşıma işleminin tamamen başarılı olduğundan ve yeni konumdaki MySQL’in sorunsuz çalıştığından emin olduktan sonra, daha önce yeniden adlandırdığınız eski veri dizinini silebilirsiniz. Bu adımı, sistemin bir süre (örneğin birkaç gün) sorunsuz çalıştığını doğruladıktan sonra yapmanız önerilir.

sudo rm -rf /var/lib/mysql_old

UYARI: Bu komut geri alınamaz. Eski dizini silmeden önce %100 emin olun.

Sık Karşılaşılan Sorunlar ve Çözümleri

MySQL veri dizinini taşıma işlemi sırasında çeşitli sorunlarla karşılaşmak mümkündür. İşte en yaygın sorunlar ve bunların nasıl giderileceği:

MySQL Başlamıyor

Bu, taşıma işlemi sırasında en sık karşılaşılan sorundur. MySQL’in başlamamasının birkaç nedeni olabilir:

1. İzinler ve Sahiplik Sorunları: Yeni veri dizininin mysql kullanıcısı ve grubuna ait olduğundan ve doğru izinlere sahip olduğundan emin olun.

sudo chown -R mysql:mysql /mnt/mysql_data/mysql
    sudo chmod -R 700 /mnt/mysql_data/mysql

Ardından MySQL’i tekrar başlatmayı deneyin.

2. AppArmor Politikası Sorunları: AppArmor’ın yeni veri dizinine erişimi engellemesi en yaygın nedendir.
/etc/apparmor.d/usr.sbin.mysqld dosyasını kontrol edin. Yeni dizin yolunun (/mnt/mysql_data/mysql/ ve /mnt/mysql_data/mysql/*) doğru bir şekilde rwk izinleriyle eklendiğinden emin olun.
* AppArmor’ı yeniden yükleyin: sudo systemctl reload apparmor.
* Gerekirse, AppArmor’ı geçici olarak devre dışı bırakarak sorunun AppArmor’dan kaynaklanıp kaynaklanmadığını test edebilirsiniz (ancak bu kalıcı bir çözüm değildir ve güvenlik riskleri taşır):

sudo systemctl stop apparmor
        # MySQL'i başlatmayı deneyin
        sudo systemctl start mysql
        # Eğer MySQL başlarsa, AppArmor profilini düzeltip tekrar etkinleştirin
        sudo systemctl start apparmor

3. MySQL Yapılandırma Dosyası Hatası: /etc/mysql/mysql.conf.d/mysqld.cnf dosyasındaki datadir yolu yanlış olabilir. Dosyayı tekrar kontrol edin ve doğru yolu girdiğinizden emin olun.

4. Disk Alanı Sorunu: Yeni veri dizini konumunda yeterli disk alanı olmadığında MySQL başlamayabilir. df -h komutuyla disk kullanımını kontrol edin.

5. Hata Günlüklerini Kontrol Etme: MySQL’in neden başlamadığına dair en iyi bilgi kaynağı hata günlükleridir.
* MySQL’in kendi hata günlüğü: /var/log/mysql/error.log (veya my.cnf dosyasında belirtilen başka bir konum).
* Sistem günlükleri: sudo journalctl -xe | grep mysql

Bu günlüklerde “Access denied”, “Permission denied”, “Can’t open file” veya “Failed to start” gibi anahtar kelimeleri arayın.

Veri Erişimi Sorunları

MySQL başlamış olsa bile, veritabanlarına veya tablolara erişimde sorunlar yaşanabilir.

1. Bozuk Veri: Servis durdurulmadan kopyalama yapıldıysa veya disk hatası oluştuysa veri bozulmuş olabilir. Bu nedenle yedekleme kritik öneme sahiptir. Eğer veri bozulduysa, yedekten geri yüklemeniz gerekebilir.
2. InnoDB Kurtarma Sorunları: InnoDB motoru, başlatma sırasında kurtarma işlemi yapar. Eğer bu işlem sırasında bir hata oluşursa, MySQL başlamayabilir veya bazı tablolar erişilemez olabilir. Hata günlüklerini kontrol edin.

Performans Düşüşü

Taşıma sonrasında MySQL performansında gözle görülür bir düşüş yaşanıyorsa:

1. Yeni Diskin Performansı: Yeni veri dizininin bulunduğu disk, eski diskten daha yavaş olabilir (örneğin, HDD’den daha yavaş bir harici depolama). Disk I/O performansını test edin.
2. Dosya Sistemi Seçenekleri: Yeni disk bölümünün bağlama seçenekleri (mount options) MySQL performansı için optimize edilmemiş olabilir. Özellikle noatime ve nodiratime gibi seçenekler I/O yükünü azaltabilir. /etc/fstab dosyasını kontrol edin.
3. MySQL Yapılandırması: Yeni donanım özelliklerine göre MySQL yapılandırmanızı (my.cnf) gözden geçirmeniz ve ayarlamanız gerekebilir (örneğin, innodb_buffer_pool_size).

Geri Alma İşlemi

Eğer taşıma işlemi sırasında ciddi bir sorunla karşılaşırsanız ve çözemezseniz, orijinal duruma geri dönmek (rollback) mümkündür.

1. MySQL Servisini Durdurma:

sudo systemctl stop mysql

2. MySQL Yapılandırma Dosyasını Geri Alma:
/etc/mysql/mysql.conf.d/mysqld.cnf dosyasını açın ve datadir satırını orijinal konuma (/var/lib/mysql) geri döndürün.

3. AppArmor Politikalarını Geri Alma:
/etc/apparmor.d/usr.sbin.mysqld dosyasını açın ve eklediğiniz yeni veri dizini yollarıyla ilgili satırları kaldırın veya yorum satırı yapın. Ardından AppArmor’ı yeniden yükleyin:

sudo systemctl reload apparmor

4. Eski Veri Dizinini Geri Yükleme:
Eğer eski veri dizinini yeniden adlandırdıysanız (/var/lib/mysql_old), onu orijinal adına geri taşıyın:

sudo mv /var/lib/mysql_old /var/lib/mysql

Eğer eski dizini sildiyseniz, yedeklerinizden geri yüklemeniz gerekecektir.

5. MySQL Servisini Başlatma:

sudo systemctl start mysql

Servisin başarıyla başladığını doğrulayın ve veritabanlarınızın erişilebilir olduğundan emin olun.

Sonuç

MySQL veri dizinini Ubuntu 16.04 üzerinde yeni bir konuma taşımak, dikkatli planlama ve adım adım uygulama gerektiren kritik bir sistem yönetimi görevidir. Bu rehberde ele alınan adımları ve önlemleri takip ederek, bu işlemi güvenli ve başarılı bir şekilde tamamlayabilirsiniz. Özellikle yedekleme, dosya izinleri, sahiplikler ve AppArmor politikalarının doğru yapılandırılması, veri kaybını önlemek ve MySQL’in sorunsuz çalışmasını sağlamak için hayati öneme sahiptir.

Unutmayın ki her sunucu ortamı benzersiz olabilir, bu nedenle bu adımları kendi sisteminize uyarlarken dikkatli olmanız ve herhangi bir değişiklik yapmadan önce her zaman yedek almanız şiddetle tavsiye edilir. Başarılı bir taşıma işlemi, sisteminizin performansını ve esnekliğini artırarak uzun vadede önemli faydalar sağlayacaktır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version