Ana Sayfa » *nix » Mysql Data Dizininin Yerinin Değiştirilmesi

Mysql Data Dizininin Yerinin Değiştirilmesi


BerbatKötüİdare EderGüzelHarika (Toplam 2 oy. 5 puan üzerinden ortalama 4,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...
logo_mysql Mysql sunucunuzun datalarını bulunduğu diskte yer sıkıntısı çekmeniz durumunda , ilgili data dizinini daha büyük alana sahip bir diske taşımak isteyebilirsiniz. Böyle bir durumda izleyebileceğiniz iki yol bulunuyor. Birincisi, /GUNU dağıtımlar için mysql'in ana yapılandırma bilgilerinin tutulduğu my.cnf isimli dosyada tanımlanabilen datadir özelliğini kullanmaktır. için ise, mysql başlangıç betiğinde küçük bir değişiklik yapılabilir. İkinci olarak da, hem 'lar için hem de BSD'ler için geçerli olmak üzere, yapılandırma dosyalarına dokunmadan, ilgili dizini yeni diske taşımak ve orjinal datadir'ı buraya linklemektir.

Bu yazıda, mysql verilerinin durduğu dizinin, bir başka alana nasıl taşınabileceği anlatılmaktadır.  Yazıda, her iki yöntem de kullanılarak taşıma işlemi yapılacaktır. Size en kolay gelen adımı takip edebilirsiniz.

ALTERNATİF 1 – conf dosyalarını editlemek

Bu yöntemde, /GNU'lar için farklı, BSD tabanlı OS'ler için farklı yollar mevcut. Linux'larda /etc altında bulunan ana yapılandırma dosyası olan my.cnf isimli dosyada datadir parametresini kullanarak, verilerin tutulacağı dizin belirtilebiliyor. 'lerde ise, aynı iş mysql'in başlangıç scriptinde küçük bir değişiklik yaparak gerçekleştirilebiliyor.

5.2'de my.cnf dosyasının editlenmesi

Linux'lar için ( üzerinde) my.cnf dosyasını editleyerek, veri dizini değiştirme işini şöyle yapabilirsiniz:

Herşeyden önce, mysql ana dizininin yerini saptamanız gerekiyor. Öntanımlı olarak mysql'in ana dizini Linux/GNU OS'ler için /var/lib/mysql dizinidir. Ancak ilgili dizin bahsedilen yerde yoksa,  mysql sürecinin durumunu kontrol etmek için kullandığımız ps çıktısında, dizinin yeri de görüntülenmektedir.

İlgili ve çıktısı şu şekilde:

:

# ps -aux |grep mysql

Çıktı da şu şekilde görünmektedir.

mysql ... /usr/libexec/mysqld --defaults-extra-file=/var/lib/mysql/my.cnf

Bold olarak belirtilmiş yerde görüldüğü üzere, mysql ana dizini /var/lib/mysql olarak görünüyor.

Dizinin yerini saptadıktan sonra, değişkliği yapmadan önce mysql'i stop etmeniz gerekir.

# /etc/rc.d/init.d/mysqld stop

Mysql stop sonrası değişikliği yapabiliriz.

Favori editorünüz ile, /etc altında duran my.cnf dosyasını editleyin.

NOT: my.cnf dosyası ön tanımlı olarak /etc altında my.cnf ismi ile durmaktadır; Eğer bu dosyayı bulamıyorsanız, kurulum sırasında oluşturulan 4 adet örnek my.cnf dosyasından sizin için uygun olanı my.cnf ismi ile /etc dizinine kaydedebilirsiniz. find / -name *.cnf komutu ile dosyaların yerini saptayabilirsiniz.

Ben vi kullanıyorum:

# vi /etc/my.cnf

Ön tanımlı olarak gelen bu dosya bir kaç satırdan oluşuyor; burada  datadir parametresini görebilirsiniz. İlgili parametrenin karşısına, verilerinizi tutacağınız dizinin tam adını yazın:

[mysqld]
datadir=/yeni-mysql-dizini/mysql
socket=/var/lib/mysql/mysql.sock

Yeni veri dizinini belirledikten sonra, yapılması gereken şey, mysql'in orjinal data dizinini, yeni belirlediğimiz yere almaktır.

Warning UYARI: Mysql datalarını, yeni yerine alırken cp komutu kullanarak kopyalama yapmanızı öneririm. mv ile move ederseniz verilerinizi kaybetme riskiniz olabilir.

Aşağıdaki gibi kopyalama işini yapın.

cp -pr /var/lib/mysql /yeni-mysql-dizini/

Kopyalama işlemi bittikten sonra, mysql sunucusunu çalıştırabiliriz.

# /etc/rc.d/init.d/mysqld start

Herşey yolunda gittiyse, mysql verileri artık yeni yerinde tutulacaktır.

üzerine mysql startup scriptinin editlenmesi

FreeBSD'lerde öntanımlı mysql data dizini /var/db/mysql dir.Ancak emin olmak için, ps -aux süreci kontrol ederek mysql data dizininin yerini saptayabilirsiniz:

Komut:

# ps -aux |grep mysql

Çıktı da şu şekilde görünmektedir.

mysql ... /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf

Bold olarak belirtilmiş yerde görüldüğü üzere, mysql ana dizini /var/db/mysql olarak görünüyor.

Şimdi mysql'i stop ediyoruz.

# /usr/local/etc/rc.d/mysql-server stop

Daha sonra da, mysql'in startup scripti olan /usr/local/etc/rc.d/mysql-server isimli dosyayı editliyoruz.

# vi /usr/local/etc/rc.d/mysql-server

Dosyanın içerisine göz attığınız zaman, bir datadir değişkeninin set edilmiş olduğunu görürsünüz.

Orjinal şekli şöyledir:

: ${mysql_enable="NO"}
: ${mysql_limits="NO"}
: ${mysql_dbdir="/var/db/mysql"}
: ${mysql_args=""}

Bold ile işaretlenmiş satırdaki path'i yeni dizini gösterecek şekilde set edelim:

: ${mysql_enable="NO"}
: ${mysql_limits="NO"}
: ${mysql_dbdir="/yeni-mysql-dizini/mysql"}
: ${mysql_args=""}

Bundan sonra da,  /var/db/mysql olan orjinal data dizinini, yeni dizine taşıyalım.

Warning UYARI: Mysql datalarını, yeni yerine alırken cp komutu kullanarak kopyalama yapmanızı öneririm. mv ile move ederseniz verilerinizi kaybetme riskiniz olabilir.

Aşağıdaki gibi kopyalama işini yapın.

# cp -pr /var/db/mysql /yeni-mysql-dizini/

Artık, mysql'i yeniden çalışltırabiliriz.

# /usr/local/etc/rc.d/mysql-server start

Herşey yolunda gittiyse, işlem tamamlandı demektir.

ALTERNATİF 2 – Data dizinine sembolik link oluşturmak

Son olarak, işletim sisteminden bağımsız olarak izlenebilecek diğer yöntem ise, mysql veri dizinini, yeni yerine taşıyıp, eski mysql dizinini, yeni dizine linklemektir. Böylece, mysql default data dizinine yazdığını sanırken, aslında veri başka bir dizinde tutulmaktadır.

Kullandığınız OS ne olursa olsun, işlem adımları aynıdır.

Mysql'inizi stop ettikten sonra, mysql'in data dizinini, yeni yerine taşıyın.

Warning UYARI: Sembolik link oluşturacağımız için burada move komutunu kullanacağız. Ancak komutu kullanmadan önce ilgili dizini yedeklemeyi unutmayın.

Dizini taşıyalım. (Yukarıda da bahsedildiği gibi Linux/GNU dağıtımların bir çoğunda default data dizini /var/lib/mysql; FreeBSD'lerde ise /var/db/mysql‘dir )

# mv /var/db/mysql /yeni-mysql-dizini/

Daha sonra, link oluşturalım.

# ln -s /yeni-mysql-dizini/mysql /var/db/mysql

Mysql'inizi yeniden başlattığınız zaman, veri dizinin yeri de değişmiş olacaktır. İşlemlerin sorunsuz gidip gitmediğini test etmek için, mysql sunucunuzda yeni bir db oluşturup, oluşturulan db'ye ait dosyaların, belirlediğiniz yeni yerde var olup olmadığına bakabilirsiniz.

Visited 2.854 times, 1 visit(s) today
Kategoriler: *nix,ipucu,Mysql |

Bu yazılar da ilginizi çekebilir:


- MySQL: InnoDB Database Ebatının Küçültülmesi – Shrink ibdata1
- Mysql Server İçin Root Şifresi Tanımlamak
- MySQL Full-Text Search Minimum Length Limitini Değiştirmek
- MySQL Repair MyISAM Table – BozulmuşTabloların Onarılması
- MySQL Database Schema Export

Yorumlar


  1. Alican Cakil | (Aralık 21st, 2010 7:47 pm)

    Merhaba,

    MySQL dizinimi diger diskime tasiyarak I/O dan kar etmeyi planliyorum. Bu baglamda, tasimaya baslamadan ln -s ile ilgili alistirma yapmayi denedim.

    Sizin “ln -s /yeni-mysql-dizini/mysql /var/db/mysql” parametrenizden esinlenerek;

    ln -s /disk2/test/git /disk2/test/bunuac
    komutunu kullaniyorum. Buna gore:

    cd /disk2/test/git dedigimde;
    cd /disk2/test/bunuac klasorunu acmasi gerekiyor.

    ancak git dosyasi ustteki komut sonrasi /disk2/test/ altinda olmasi lazim ancak o dosya /disk/dosya/bunuac icinde. Orada ne isi var? garip :D

    cok fazla deneme yaptim kafayi yaktim sanirim :)

    [Cevapla]

    Alican Cakil tarafından yanıtlandı.

    Tamam, yerini degistirelim o zaman dedigimde;

    /disk2/test/bunuac altina girip,
    mv git ..
    diyerek bir ust dizine cikartiyorum.
    Simdi ne goreyim?

    15 Dec 21 19:49 git -> /disk2/test/git

    What’s wrong with me? :(

    [Cevapla]

    Alican Cakil tarafından yanıtlandı.

    Basardim!, Komut sadece bu kadarcik:
    ln -s GidilecekYol KisayolAdi

    neden yapamadim? tatile mi cikmaliyim? huh!
    Makale icin tesekkurler. :)

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Bunun adina sürmenaj deniyor ve her sistemcinin başına geliyor. Yalnız değilsiniz :)

    [Cevapla]

    Alican Cakil tarafından yanıtlandı.

    Ilk basta belirttigim gibi, bunu yapmamin nedeni disk alanimda yer olmamasi degil, I/O hizindan kar etmek.

    Bu baglamda, tasidim dizin haricinde baska ne onerirsiniz acaba?

    Tesekkurler.

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Selamlar,

    Disk I/O’yu dusurmek icin ilgili disk bolumunu noatime paramterleri ile mount edebilirsiniz.

    Nasil yapilabileceğini surada anlatmistim:
    http://www.syslogs.org/noatime-disk-io-optimizasyonu/

    Ozellikle cok miktarda kucuk dosyada yazma/okuma islemi yapiliyorsa noatime parametresi baya tasarruf sağlayacaktır.

    [Cevapla]

  2. LeViS | (Mayıs 25th, 2014 11:55 pm)

    Çağrı bey selamlar. Geçmişte bu anlatımınız beni çok büyük bir dertten kurtarmıştı. Yine derdime çare ararken daha önce favorilerime eklediğim bu yazınız aklıma geldi. Sitenizde aradım bulamadığım için bu yazınız altına yazıyorum.

    Benim my.cnf dosyasındaki değerlerle ilgili bir kaç komut için yardıma ihtiyacım var.

    Tansiye için şu iki scripti kullanıyorum ama sanırım onların bana ne demek istediklerini çözemiyorum.

    ./tuning-primer.sh
    ./mysqltuner.pl

    Örneğin sorunlu kısımlardam bir tanesi şu;

    ==========
    QUERY CACHE
    Query cache is enabled
    Current query_cache_size = 128 M
    Current query_cache_used = 39 M
    Current query_cache_limit = 4 M
    Current Query cache Memory fill ratio = 30.77 %
    Current query_cache_min_res_unit = 4 K
    Query Cache is 25 % fragmented
    Run “FLUSH QUERY CACHE” periodically to defragment the query cache memory
    If you have many small queries lower ‘query_cache_min_res_unit’ to reduce fragmentation.
    MySQL won’t cache query results that are larger than query_cache_limit in size
    ============

    Acaba ne tür bir değişiklik yapmam gerekiyor ki diğer bazı bölümler gibi fine yazısını göreyim.

    [Cevapla]

Trackbacks

Yorumda bulunun.