Mysql Data Dizininin Yerinin Değiştirilmesi
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYd8MW5X' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
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, linux/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. freebsd için ise, mysql başlangıç betiğinde küçük bir değişiklik yapılabilir. İkinci olarak da, hem linux'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, linux/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. freebsd'lerde ise, aynı iş mysql'in başlangıç scriptinde küçük bir değişiklik yaparak gerçekleştirilebiliyor.
centos 5.2'de my.cnf dosyasının editlenmesi
Linux'lar için (centos ü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 komut ve çıktısı şu şekilde:
Komut:
# 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.
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.
freebsd ü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.
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.
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.
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
Trackbacks
Yorumda bulunun.
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]
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]
Basardim!, Komut sadece bu kadarcik:
ln -s GidilecekYol KisayolAdi
neden yapamadim? tatile mi cikmaliyim? huh!
Makale icin tesekkurler. :)
[Cevapla]
Bunun adina sürmenaj deniyor ve her sistemcinin başına geliyor. Yalnız değilsiniz :)
[Cevapla]
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]
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]
Ç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]