MySQL veri dizini nasıl değiştirilir?


158

Varsayılan MySQL veri dizinimi başka bir yola değiştirmek mümkün müdür? Veritabanlarına eski konumdan erişebilecek miyim?


3
Win8'deki sistem varsa bu soru için cevap var mı?
Jonathan M


Mac kullanıcısı için tek ihtiyacınız olan bu ve @ user1341296'nın cevabındaki 1-4 adım.
shellbye

Yanıtlar:


270
  1. Aşağıdaki komutu kullanarak MySQL'i durdurun:

    sudo /etc/init.d/mysql stop
  2. /var/lib/mysqlAşağıdaki komutu kullanarak mevcut veri dizinini (varsayılan olarak bulunur ) kopyalayın :

    sudo cp -R -p /var/lib/mysql /newpath
  3. MySQL yapılandırma dosyasını aşağıdaki komutla düzenleyin:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Girdisini arayın ve yeni veri dizininin datadiryolunu (olması gereken /var/lib/mysql) değiştirin.

  5. Terminalde şu komutu girin:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. İle başlayan satırları arayın /var/lib/mysql. /var/lib/mysqlYeni yolla satırlarda değişiklik .

  7. Dosyayı kaydedip kapatın.

  8. AppArmor profillerini şu komutla yeniden başlatın:

    sudo /etc/init.d/apparmor reload
  9. MySQL komutunu yeniden başlatın:

    sudo /etc/init.d/mysql restart
  10. Şimdi MySQL'e giriş yapın ve daha önce sahip olduğunuz veritabanlarına erişebilirsiniz.


33
Yukarıdakiler benim için problemi Ubuntu 12.04'te (Kesin) çözemedi. Ben bir / alic / var / lib / mysql / -> / newpath /, "bir satır eklemek için /etc/apparmor.d/tunables/alias dosyasını düzenlemek gerektiğini öğrendim Bu ile, herhangi bir ihtiyacım yoktu diğer AppArmor dosyalarındaki değişiklikler. "/Etc/init.d/apparmor restart" ile AppArmor ve "restart mysql" ile MySQL yeniden başlatıldıktan hemen sonra çalıştı.
mak

2
Apparmor, CentOS ile ilgili değildir. Bunun yerine SELinux var. Devre
Noam

12
mak'ın baskısında (gerekli) satır sonunda virgül unutmayınalias /var/lib/mysql/ -> /newpath/,
Michael

4
Michel'in yukarıdaki yorumunun ne kadar önemli olduğunu vurgulayamıyorum: TRMAING COMMA EKLE ve bazı nöronları kurtar. Kapaklar için üzgünüm.
alx

2
Benim için çalışmıyor. Job için mysql.service başarısız oldu. Mysqld'i yeniden başlatmaya çalışırken ayrıntılar için bkz. 'Systemctl status mysql.service' ve 'journalctl -xn', hata ise diskin dolu olmasıdır. 500 GB boş alan var ...
Frank H.

17

Hızlı ve kolay:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

Düzen /etc/my.cnfdosyası ve altında [mysqld]bu satırı ekleyin:

datadir=/new/dir/for/mysql/

CageFS kullanıyorsanız (CloudLinux ile veya CloudLinux olmadan) ve MySQL dizinini değiştirmek istiyorsanız, yeni dizini bu dosyaya eklemeniz GEREKİR:

/etc/cagefs/cagefs.mp

Ve sonra şu komutu çalıştırın:

cagefsctl --remount-all

1
Duyduğuma sevindim: P
sMyles

Çok teşekkürler ve bunu yaptığım gibi tamamen betiğini yazmak isterseniz şunu kullanabilirsiniz: sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / etc / my.cnf
berimbolo

Bu benim için işe yaramadı. Bunu ve diğer birçok alternatifi denedim. Kullanıcının tek yolunun bu olduğunu söylediğinde user3338098 ile aynı sonuca geliyorum: serverfault.com/questions/503887/…
Volksman

@Volksman, tüm bu bağlantıyı kaldırmak ve yeniden yüklemek zorunda kalıyor ... hem MySQL hem de MariaDB'nin ikisi de datadir yapılandırmasını desteklediği için ikinizin de başka bir sunucuya özgü sorunu var. sorunsuz sunucu
sMyles

@ Evet, kaldır ve yükle ama / var / lib / mysql başka bir yere monte edildikten sonra yani bir / var'ın aksine bir mega bölüm daha önce monte edildi. Sistemlerimizle ilgili belirli bir sorun varsa, bunun olduğunu anlamak harika olurdu. Bu, 8x HDD'li RAID 10 ile Centos 7 OS'nin yeni bir stok standart kurulumundaydı, ancak genellikle bu tür disk dizisi ayrıntıları yazılıma şeffaftır.
Volksman

15

geçerli verileri yeni dizine kopyalamanız ve my.cnfMySQL'inizi değiştirmeniz gerekir .

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

Sunucu çalışmazken veritabanını kopyalamanız gerekir .


Yapamadığım şey bu. Dizini değiştirmek istiyorum ancak yeni dizinde yeni veritabanları oluşturmak istiyorum. Hem eski dizine hem de yeni dizin veritabanlarına erişmek istiyorum.
MySQL DBA

1
@ MySQL DBA: Eğer ln -sstatik sembolik bir vaşak kullanırsanız, bunu yapmaz mı?
RageZ

Bu komutun kullanımıyla biraz kafam karıştı. Daha önce açıkladığım gibi, yeni dizinde yeni veritabanları oluşturmak istiyorum. Symlink ile mümkün mü?
MySQL DBA

1
yeni bir dizin oluşturabilir, dosyanın yeni dizinde görünmesini sağlamak için sembolik bağlantıyı kullanabilir vemy.cnf
RageZ


14

Önce mysql sunucusunu durdurmalısınız. Örneğin

# /etc/init.d/mysql stop

Bundan sonra eski veri dizinini (örn. / Var / lib / mysql) dahil etmelisiniz. üzerinden yeni dizininize ayrıcalıklar

# cp -R -p /var/lib/mysql /new/data/dir

şimdi /etc/mysql/my.cnfyeni verilerde değişiklik yapabilir ve sunucuyu yeniden başlatabilirsiniz

# /etc/init.d/mysql restart


7

Benim gibi debian iseniz ve mysql dir evinize veya / home / ... bir yol taşımak istiyorsanız, çözüm:

  • "Sudo service mysql stop" ile MySQL'i durdur
  • "datadir" değişkenini "/etc/mysql/mariadb.conf.d/50-server.cnf" içindeki yeni yola değiştirin
  • / Var / lib / mysql yedeğini yapın: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • şu dizini sil: "sudo rm -R / var / lib / mysql"
  • Verileri yeni dizine taşı: "cp -R -p / path_to_my_backup / path_new_dir
  • "Sudo chown -R mysql: mysql / path_new_dir" ile erişimi değiştir
  • "ProtectHome" değişkenini "/etc/systemd/system/mysqld.service" adresindeki "false" ile değiştirin
  • "Sudo systemctl daemon-reload" ile yeniden systemd
  • "Hizmet mysql yeniden başlatma" ile mysql yeniden başlat

Bir gün mariadb belgelerinde benim için çözüm bulmak için. Umarım bu yardımcı olur!


/Etc/systemd/system/mysqld.service dosyası burada değil. Nereye bakacağım hakkında bir fikrin var mı?
Ron Piggott

1
Kullananlar için mariadb hizmet dosya bulunmaktadır /lib/systemd/system/mariadb@.service
Ron Piggott

5

Makinemde bir veritabanı tutmak istedim, ancak harici sabit diskimde bir veri var ve ikisini kullanma arasında geçiş yapmak istedim.

Mac kullanıyorsanız ve Homebrew kullanarak MySQL yüklediyseniz, bunun sizin için çalışması gerekir. Aksi takdirde, datadirmakinenizdeki MySQL için uygun yerleri değiştirmeniz yeterlidir .

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

Daha sonra geri dönmek istediğinizde şunları yapın:

mv mysql mysql.remote

mv mysql.local mysql

ve yerel veritabanınızı tekrar kullanıyorsunuz. Umarım yardımcı olur.


1
bu tam olarak belirtildiği gibi soruya değinmiyor - ancak bu tam olarak aradığım şeydi - ve my.cnf'in boşlukları iyi işlemediği bir kenar durumu / hata işlemenin düzgün bir yoludur: bugs.mysql.com /bug.php?id=26033 . Bu geçici çözümü bu hata raporuna bağlayacağım.
gabe


5

İlk durak mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

Ardından /etc/mysql/my.cnf
Start mysqld'inizdeki datadir'i değiştirin

Notlar:
# 1: muhtemelen SELinux ayarlarınızı yapmanız gerekir (sorun durumunda SELinux devre dışı bırakıldığında deneyin), Apparmor (Ubuntu) da sorun olabilir.

# 2: bkz. MySQL DB Kurulumunu Kurma


4

İlk önce MySQL'inizi durdurun

sudo service mysql stop

mysql verilerini yeni konuma kopyalayın.

sudo cp -rp /var/lib/mysql /yourdirectory/

apparmor kullanıyorsanız, aşağıdaki dosyayı düzenleyin ve aşağıdakileri yapın

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

/ Var / lib / by / yourdirectory dizininin yerini değiştirin / sonra dosyaya yoksa follwoing öğesini ekleyin

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

Dosyayı komutla kaydedin

:wq

My.cnf dosyasını düzenleyin

sudo vim /etc/mysql/my.cnf

Where / var / lib / by / yourdirectory / öğesini değiştirin ve ardından komut ile kaydedin

:wq

sonunda mysql başlat

sudo service mysql start

@ raid0, optimizasyon ici hakkında daha fazla bilgi



belki bu diğer dağıtım için işe yaramaz, ancak ubuntu kullanıyorsanız, bu benim için iyi çalışıyor ve ben raid0 etkinleştirmek için her yüklü yeni ubuntu sunucusu için yol değiştirir.
naddame

2
İnsanların bunu küçümsediğini biliyorum, ama bunun günümü kurtardığını söylemek istiyorum. Teşekkürler!
Daniel Loureiro

3

Bu çözüm, Workbench kullanarak Windows 7'de çalışır. Bunu yapmak için Yönetici ayrıcalıklarına sahip olmanız gerekir. Verilerinizi gerçekten depolamak istediğiniz yere bir bağlantı (kısayol gibi) oluşturur

Workbench'i açın ve INSTANCE - Başlatma / Kapatma'yı seçin Sunucuyu durdurun

Junction Master'ı https://bitsum.com/junctionmaster.php adresinden yükleyin.

C: \ ProgramData \ MySQL \ MySQL Server 5.6 klasörüne gidin

Veri'ye sağ tıklayın ve "TAŞI ve sonra da LINK klasörü ..." seçeneğini seçin. "Yeni veri dizininiz burada tırnak işaretleri olmadan" uyarı noktasını kabul edin MOVE AND LINK

Şimdi "Yeni veri dizininiz burada tırnak işaretleri olmadan" bölümüne gidin

Verilere sağ tıklayın Güvenlik sekmesine gidin Düzenle'ye tıklayın Ekle Ekle AĞ HİZMETİ'ne tıklayın ve Adları Kontrol Et'e tıklayın Tamam'a Tam Denetimine İzin Ver onay kutusuna tıklayın ve ardından Tamam'a tıklayın

Workbench'e geri dönün ve sunucuyu başlatın

Bu yöntem benim için Windows 7 Enterprise'da MySQL Workbench 6.2 kullanarak çalıştı.


2

@ User1341296'nın dediği gibi her şey, artı ...

Değiştirmemeniz daha iyi olur /etc/mysql/my.cnf Bunun yerine yeni dosya oluşturmak istersiniz /etc/mysql/conf.d/ext.cnf(herhangi bir ad, ancak uzantı olmalıdır cnf)

Ve değişikliğinizi içine koyun:

[mysqld]
datadir=/vagrant/mq/mysql

Böylece

  • Mevcut dosyayı değiştirmeniz gerekmez (otomasyon komut dosyaları için daha kolay)
  • MySQL sürümü (ve yapılandırmaları!) Güncellemesinde sorun yok.

2

Windows kullanıcısıysanız ve tüm yanıtların Linux Kullanıcıları için olduğunu öğrenmek üzere buraya geldiyseniz hayal kırıklığına uğramayın! Benim yaptığım gibi zaman kaybetmene izin vermeyeceğim.

Çözümden önce biraz saçmalık konuşması:

MySQL, oluşturduğunuz farklı veritabanlarının verilerini depolamak için bir Veri dizini kullanır. Sonunda, Veritabanları sınıflarında öğrendiğiniz Veritabanı vaatlerinin sağlam olmasını sağlamak için bunları uygulama ve dosya biçiminde bazı eklenmiş jugglery ile dosyalar şeklinde saklamak zorundadır.

Şimdi, gelecekte oluşturabileceğiniz büyük veritabanlarını depolamak için yeterli alan olduğundan emin olmak istersiniz ve böylece düşündünüz ki, Hey! Daha fazla alana sahip başka bir sürücüye koymak istiyorum.

Böylece aşağıdakileri yaparsınız.

Adım - 1 : MySQL hizmetini durdurma.

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Adım - 2 : Geçerli Veri dizinini bulma

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Varsayılan olarak, burada adlı bir klasör olmalıdır Data , bu MySQL tarafından varsayılan ayarda kullanılan (daha iyi bir yer bulamamışlarsa), ancak bunu kontrol edelim.

bulmak my.iniDosya , tam orada olmalı.

Bir düzenleyicide açın (Notepad ++ belki).

datadirDosyada bulmak için bir CTRL + F yapın .

Burada belirtilenler, MySQL tarafından veri dizini için kullanılmakta olan gerçek konumdur. Değiştirmek istediğiniz budur.

Adım - 3 : Yeni bir veri dizini ile değiştirilmesi.

Yeni veri dizininizin W: __ MySQL_Data olmasını istediğinizi varsayalım. Diyelim değişim datadirdeğeri my.inibu değere dosyasına. Hatırlamak zorunda kalmamak için önceki değeri açık tutun.

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

Şimdi xcopyvarsayılanı kopyalamak için datadirdüğmelerini kullanın W:\. Komut istemini başlat (Pencere + R, cmd, Enter)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

Ve kopyalanan klasörü datadirdeğiştirdiğiniz yeni değere yeniden adlandırın . Buraya:W:/__MySQL_Data

Neden sadece kopyalamıyorsunuz? Çünkü bu SOĞUK değil! Bu, kopyalanan klasördeki izinleri kaybetmenize yardımcı olmaz, böylece yeniden başlattığınızda MySQL80aptalca bir hata vermez: "Yerel Bilgisayardaki MySQL80 hizmeti başlatıldı ve sonra durdu. Bazı hizmetler otomatik olarak durursa başka hizmetler veya programlar tarafından kullanılmıyor. " - Nezaket: Microsoft

Adım - 4 : Hizmeti yeniden başlatma

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

Adım - 5 : Bitti! Şimdi işine dön !!


1
Bu yararlı ama uyarı için teşekkürler: my.ini, izinlerini değiştirmediğiniz sürece normal bir kullanıcı tarafından yazılamaz. Oh ve ProgramData gizli bir klasördür, bu yüzden görmek için Explorer klasör ayarlarını değiştirmeniz gerekir.
JonP

1

Makineleri yükseltirken, kutudan kutuya hareket ederken sık sık bunu yapmam gerekir. / Var / lib / mysql dosyasını daha iyi bir konuma taşımanın yanı sıra, genellikle eski DB tablolarını eski bir MySQL kurulumundan geri yüklemem gerekir. Bunu yapmak için...

  1. MySQL'i durdurun. Yukarıdaki talimatları uygulayın, gerekli.
  2. Veritabanı dizinlerini (eski kurulumunuzun her veritabanı için bir tane olacak) yeni DATADIR konumuna kopyalayın. Ancak "mysql" ve "performance_schema" dizinlerini atlayın.
  3. Kopyalanan veritabanı dizinleri arasında izinleri düzeltin. Sahiplik mysql: mysql, dizinler 700 ve dosyalar 660 olmalıdır.
  4. MySQL'i yeniden başlatın. Yüklemenize bağlı olarak, eski sürüm DB dosyaları güncellenmelidir.

aşağı oy için üzgünüm, bu çözüm doğru olabilir, denemedim.
user3338098

1

/homeBaşka bir fiziksel diskten eşlendiği için MySQL'i dizine taşımak zorunda kaldık . Canlılaştırmayı kolaylaştırmak için, my.cnf dosyasındaki dizini değiştirmek yerine, yeni dizini /home/mysqlorijinal dizinin yerine eşledik /var/lib/mysql. Bizim için bir cazibe gibi çalışır (CentOS 7.1'de test edilmiştir).

Yeni dizini oluşturun ve doğru izinleri ayarlayın.

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

Çalışıyorsa MySQL'i durdurun.

systemctl stop mysql

Veri dizinini taşıyın.

mv -f /var/lib/mysql/* /home/mysql

Kalıcı bir bağ oluşturun ve yürütün.

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

Sunucuyu yeniden başlatın.

systemctl start mysql

1

Bunu programlı olarak yapmak istiyorsanız (gedit ile manuel metin girişi yok), yukarıdaki user1341296'nın cevabına dayanan bir Dockerfile sürümü:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

Docker hub'ında şu adreste bulabilirsiniz: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/


0

İlk olarak, yapılandırma dosyanızın nerede olduğunu bilmelisiniz. yapılandırma dosyanız nerede?

Apt-get veya yum kurulumu ile yüklediyseniz。

yapılandırma dosyası

/etc/mysql/my.cnf

veri dosyası görünebilir

/ Var / lib / mysql

ve yapmanız gereken şey

  1. MySQL'i durdur
  2. mysql verilerini yeni dizin olarak değiştirme
  3. yapılandırma dosyasını değiştir
  4. yapılandırma dosyasını yeniden yükle
  5. mysql'yi yeniden başlat

ve sonra işler yapıldı.

Ancak apt veya yum ile yüklemediyseniz, direcotry böyle olmayabilir ve mysql dosyalarını bulabilirsiniz

burası mysql



0

SuSE 13.1 altında, mysql veri dizinini başka bir yere taşımak için iyi çalışır, örneğin / home / example_user / ve daha bilgilendirici bir ad vermek için:

/ Var / lib / dizininde:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

MySQL'i yeniden başlattım:

# systemctl restart mysql.service

ama bunun bile gerekli olmadığından şüpheleniyor.


0

Ortamlardan biri için mysql veri dizinini yeni bir konuma değiştirdim, ancak mysql sunucusunun yeniden başlatılması sırasında zaman alıyordu. Bu yüzden portu kontrol ettim ve diğer sürecin mysql portunu dinlediğini buldum. Bu yüzden süreci öldürdüm ve mysql sunucusunu yeniden başlattım ve iyi çalıştı.

Mükemmel çalışan veri dizinini değiştirmek için aşağıdaki adımları izledim. Linux'ta mysql veri dizinini değiştirme


Stack Overflow'a hoş geldiniz! Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Tim Diekmann

0

Yukarıdaki adımlar temel ve temeldir. Onları takip ettim ve hala "mysql başlatılamadı" hatası aldım.

Yeni klasörün mysql verilerini depolaması için, klasörün izinlerine ve mysql: mysql sahipliğine sahip olduğundan emin olmanız gerekir.

Bunun yanı sıra, / data / mysql / dizinine sahipseniz, mysql dosyasının üst dizininin izinlerini ve sahipliğini de kontrol etmesi gerekir. Burada / data / dizini root: root olmalıdır. / Mysql üst dizinin sahipliğini değiştirdikten sonra "mysql başlatılamadı" hatasını düzeltti. VM'imdeki işletim sistemi RHEL 7.6.


SELINUX = zorlayıcı SELINUX = izin verici olarak değiştirerek RHEL7.6'da selinux'u denedim, benim için çalışmadı.
user3325137William

0

Ayrıca, datadir'e bağlanmak da mümkündür. En azından macOS, dev ortamında.

(homebrew) örn.

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

MySQL'i yeniden başlatın.


-1

SE linux kullanıyorsanız, / etc / selinux / config dosyasını düzenleyerek ve SELINUX = zorlama SELINUX = izin verici olarak değiştirerek izin verilen moda ayarlayın


Burada ayrıntılı olarak serverfault.com/questions/503887/... selinux hatalı olmadığı değişen engelleyen başka sorun olduğunu datadirmülkiyet
user3338098
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.