MySQL veri dizinini nasıl taşırım?


57

MySQL veritabanımın veri dizinini bağlantı noktası olarak sahip olduğum ikinci bir disk dizisine taşımaya çalışıyorum /array2/.

Ben yaşıyorum sorun her şeyi denedim ve my.cnf mysql içinde datadir konumunu değiştirdikten sonra tekrar başlamaz.

Tek aldığım şey:

start: Job failed to start

Yanıtlar:


62

Uygulama zırhını unuttum.

İlgilenen herkes için klasörü taşımak için aşağıdakileri yaptım.

MySQL sunucusunu durdur:

stop mysql

Yeni dizini oluşturun:

mkdir /array2/mysql

SADECE veritabanı klasörlerini kopyalayın:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

my.cnfDosyayı yedekle :

cp /etc/mysql/my.cnf /root/my.cnf.backup

Edit my.cnfdosyasını:

nano /etc/mysql/my.cnf

Eski datadir ve soket ile ilgili tüm sözleri yeni konumunuza değiştirin

Mine oldu:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Dizin izinlerini güncelle:

chown -R mysql:mysql /array2/mysql

Eski dizini yeniden adlandırın:

mv /var/lib/mysql /var/lib/mysql-old

Durumda, bir sembolik bağlantı oluşturun:

ln -s /array2/mysql /var/lib/mysql 

AppArmor'a yeni datadir hakkında bilgi verin:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Apparmor profilleri yeniden yükle

sudo /etc/init.d/apparmor reload

Ardından mysql'i başlatın:

start mysql

Bu iyi bir cevaptır ancak istemcilerin mysql ile bağlantı kurmasına izin vermek için bir adım daha gerekebilir. Altında bir satır olacak yeni bir grup ekleyin ... [istemciler] socket = / array2 / mysql / mysql.sock Burada socket = kısmı mysql.sock dosyanızın yeni konumunu gösterir.
Gece Baykuş

1
Birleştirmek rahatsız edilmek istemiyorsanız /etc/apparmor.d/usr.sbin.mysqldMySQL bir güncelleme aldığında her zaman, sen ekleyebilir /array2/mysql/** rwk,için /etc/apparmor.d/local/usr.sbin.mysqldyerine. Mysql hala eski veri dizinine erişebilecek, fakat bu muhtemelen bir sorun değil.
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Neden sadece veritabanı klasörleri?
int_ua

Kendi datadir'lerini ZFS'ye (benim yaptığım gibi) innodb_use_native_aio=0taşıyan herkes için, ayrıca şunları eklediğinizden emin olun: linux'taki ZFS, AIO'yu desteklemediğinden [mysqld], my.cnfdosyanızın bölümünde . dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley

23

AppArmor'un bunu inceleyerek suçlu olduğunu syslogve mysqlbu işlemi izleyerek veri konumunu başarıyla değiştirebildiğini gördüm .

Lütfen, aşağıda düzenlenen dosyalarda, ile başlayan satırların +eklendiğini ve ile başlayan satırların -kaldırıldığını unutmayın. +Bu dosyalara satır eklerken işaretleri gerçekten yazmamalı / yapıştırmamalısınız .

mysqlDizini yeni konuma kopyaladım :

sudo rsync -av /var/lib/mysql /new_dir

Daha sonra şu datadirsatırı düzenledim /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Sonra düzenledi /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Sonra yeniden başladım mysql.


13

Farkında olmak.

InnoDB tablolarınız varsa ibdata*ve ib_logfile*dosyaların üzerine kopyalamanız gerekir , aksi takdirde tabloları kullanamazsınız. Alacaksın:

'Table' databaseName.tableName 'mevcut değil'

hatalar.

Kopyalamak için bu kopya komutunu çalıştırın ibdata*ve ib_logfile*dosyaları.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

bu bir yorum olmalı, tam bir cevap değil
Postadelmaga

4

Başka bir yolla denedim, bazıları yararlı bulabilir:

izinsiz olarak kopyalayın:

rsync -avzh /var/lib/mysql /path/to/new/place

yedekleme (bir şeyler ters gittiğinde):

mv /var/lib/mysql /var/lib/_mysql

eski yerine yeni bir boş dizin oluşturun:

mkdir /var/lib/mysql

yeni konumu eskiye bağla:

mount -B /path/to/new/place /var/lib/mysql

Bu birine yardımcı olur umarım, çünkü bağlantı, benim için işe yaramadı ve bu en basit yoluydu.


3

Datadir'inizi taşırsanız, yalnızca yeni datadir izinlerini vermeniz gerekmez, ancak tüm üst dizinlerin de izin aldığından emin olmanız gerekir.

Veridirimi Ubuntu'da şu şekilde monte edilen bir sabit sürücüye taşıdım:

/media/*user*/Data/

ve datadir Veritabanlarımdı .

Her medya, kullanıcı ve Veri dizinine 771 izin vermek zorundaydım :

sudo chmod 771 *DIR*

Bu işe yaramazsa, mysql'i çalışmanın bir başka yolu da /etc/mysql/my.cnf içindeki kullanıcıyı root'a çevirmektir; bununla birlikte güvenlik açısından bazı hususların yapılması şüphesizdir.


2

Mount seçeneğiyle bind seçeneğini kullanmayı tercih ettim, böylece Apparmor ve Mysql konfigürasyonunda değişiklik yapmaktan kaçınırım.


Örneğin:

Sanırım her şeyi içine taşımak istiyorum /var/www. Diyelim ki bu dir benim dev ortamım ve farklı bir bölüme monte edilmiş

  1. İlk önce mysql'i durdurmalıyız :

    sudo systemctl stop mysql.service
    
  2. Dosyaları taşıyoruz (izinleri koruyarak)

    sudo rsync -av /var/lib/mysql /var/www
    

    Bu, /var/www/mysql/tüm içeriğe sahip bir dizin oluşturur .

  3. Eski dizindeki her şeyi kaldırırız:

    sudo rm -r /var/lib/mysql/*
    
  4. Yeni dizini bindeskisine bağlı seçenekle monte ediyoruz . bu satırı
    düzenle /etc/fstabve ekle:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Bu, /var/www/mysqlboş dizimize bağlanacak /var/lib/mysql
    Buradaki bindseçenek sihir işlemini gerçekleştirir, mysql ve apparmor için bunun /var/lib/mysqliçeriği ile doldurulur , /var/www/mysqlhiçbir şey değişmemiş gibi olur.

  5. Şimdi montajı yapıyoruz:

    sudo mount -a
    

    ve MySQL'i yeniden başlatın.


0

Kabul edilen cevaptan sözlü komutları yerine getirip getirmediğini fark edersiniz.

cp -R / var / lib / mysql / array2 / mysql

/ Var / lib / mysql dosyasını / array2 / mysql / mysql dosyasına kopyalayacaktır.

Konfigürasyon dosyanızı ayarladığınızda dizini / array2 / mysql / mysql 'ye koymanız iyi olur, yoksa mysqld' niz başlamaz.

Daha iyi kopya komutları:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / kullanıcılar / array2 / mysql

Sadece 2 sent değerinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.