Bagaimana cara mengubah direktori data MySQL?

158

Apakah mungkin mengubah direktori data MySQL default saya ke jalur lain? Apakah saya dapat mengakses database dari lokasi lama?

MySQL DBA
sumber
3
Apakah ada jawaban yang tersedia untuk pertanyaan ini jika sistem di Win8?
Jonathan M
1
Untuk windows - lihat di sini: dba.stackexchange.com/questions/24403/…
Dr. Aaron Dishno
Untuk pengguna mac, yang Anda butuhkan adalah ini dan langkah 1-4 dari jawaban @ user1341296.
shellbye

Jawaban:

270
  1. Hentikan MySQL menggunakan perintah berikut:

    sudo /etc/init.d/mysql stop
  2. Salin direktori data yang ada (default berada di /var/lib/mysql) menggunakan perintah berikut:

    sudo cp -R -p /var/lib/mysql /newpath
  3. edit file konfigurasi MySQL dengan perintah berikut:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Cari entri datadir, dan ubah jalur (yang seharusnya /var/lib/mysql) ke direktori data baru.

  5. Di terminal, masukkan perintah:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Cari garis yang dimulai dengan /var/lib/mysql. Ubah /var/lib/mysqlbaris dengan jalur baru.

  7. Simpan dan tutup file.

  8. Mulai ulang profil AppArmor dengan perintah:

    sudo /etc/init.d/apparmor reload
  9. Mulai ulang MySQL dengan perintah:

    sudo /etc/init.d/mysql restart
  10. Sekarang login ke MySQL dan Anda dapat mengakses database yang sama seperti sebelumnya.

pengguna1341296
sumber
33
Di atas gagal menyelesaikan masalah bagi saya di Ubuntu 12.04 (Precise). Saya menemukan bahwa orang perlu mengedit file /etc/apparmor.d/tunables/alias untuk memasukkan baris "alias / var / lib / mysql / -> / newpath /," Dengan ini, saya tidak memerlukan apapun perubahan pada salah satu file AppArmor lainnya. Ini bekerja segera setelah me-restart AppArmor dengan "/etc/init.d/apparmor restart" dan MySQL dengan "restart mysql".
mak
2
Apparmor tidak relevan di CentOS. Ada SELinux sebagai gantinya. Dapat membaca tentang cara menonaktifkan atau mengelola di sini blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam
12
pada edisi mak (yang diperlukan) jangan lupa koma di akhir barisalias /var/lib/mysql/ -> /newpath/,
Michael
4
Tidak bisa cukup menekankan betapa pentingnya komentar Michel di atas: TAMBAHKAN TRAILING COMMA dan simpan beberapa neuron. Maaf tentang tutupnya.
alx
2
Tidak bekerja untuk saya. Saya mendapatkan Pekerjaan karena layanan mysql. gagal. Lihat 'systemctl status mysql.service' dan 'journalctl -xn' untuk detail ketika mencoba me-restart mysqld, dan kesalahannya adalah disk sudah penuh. Ada 500GB ruang kosong ...
Frank H.
17

Cepat dan mudah dilakukan:

# 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/

Edit /etc/my.cnffile, dan di bawah [mysqld]tambahkan baris ini:

datadir=/new/dir/for/mysql/

Jika Anda menggunakan CageFS (dengan atau tanpa CloudLinux) dan ingin mengubah direktori MySQL, Anda HARUS menambahkan direktori baru ke file ini:

/etc/cagefs/cagefs.mp

Dan kemudian jalankan perintah ini:

cagefsctl --remount-all
sMyles
sumber
1
Senang mendengarnya: P
sMyles
Terima kasih, dan untuk menambahkan jika Anda ingin benar-benar skrip ini seperti yang saya lakukan, Anda dapat menggunakan ini: sed -i | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g '/ etc / my.cnf
berimbolo
Ini tidak berhasil untuk saya. Saya mencoba ini dan banyak alternatif lain yang berbeda. Saya sampai pada kesimpulan yang sama dengan user3338098 ketika dia mengatakan ini adalah satu-satunya cara yang berfungsi: serverfault.com/questions/503887/…
Volksman
@Volksman semua tautan mengatakan bahwa ia harus menghapus dan menginstal ulang ... kemungkinan Anda berdua memiliki beberapa masalah spesifik server lainnya, karena baik MySQL dan MariaDB keduanya mendukung konfigurasi datadir, dan saya baru-baru melakukan ini (6 bulan lalu) pada yang lain server tanpa masalah
sMyles
@sMyles ya, itu menghapus dan menginstal tetapi setelah me-mount / var / lib / mysql di tempat lain yaitu partisi mega tidak seperti yang / mount sebelumnya. Jika ada masalah khusus dengan sistem kami, akan sangat bagus untuk mengetahui bahwa ini memang benar. Ini adalah instalasi standar baru Stock Centos 7 OS dengan RAID 10 dengan 8x HDD tetapi biasanya rincian array disk yang transparan untuk perangkat lunak.
Volksman
15

Anda harus menyalin data saat ini ke direktori baru dan mengubah my.cnfMySQL Anda.

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

Anda harus menyalin database ketika server tidak berjalan .

RageZ
sumber
Yah, itulah yang tidak bisa saya lakukan. Saya ingin mengubah direktori tetapi saya ingin membuat database baru di direktori baru. Dan Ingin mengakses direktori lama dan basis data direktori baru.
MySQL DBA
1
@MySQL DBA: jika Anda menggunakan beberapa ln -slynx simbolik statis, bukankah itu akan membuatnya?
RageZ
Yah saya agak bingung dengan penggunaan perintah ini. Seperti yang saya jelaskan sebelumnya saya ingin membuat database baru di direktori baru. Apakah mungkin dengan symlink.
MySQL DBA
1
Anda dapat membuat direktori baru, gunakan tautan simbolis untuk membuat file muncul di direktori baru dan ubahlah Andamy.cnf
RageZ
2
turun memilih karena tidak berfungsi secara terperinci di serverfault.com/a/733998/279553
user3338098
14

Pertama, Anda harus menghentikan server mysql. misalnya

# /etc/init.d/mysql stop

Setelah itu Anda harus menyalin direktori data lama (misalnya / var / lib / mysql) termasuk. hak istimewa ke direktori baru Anda melalui

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

sekarang Anda dapat mengubah /etc/mysql/my.cnfdata baru dan me-restart server

# /etc/init.d/mysql restart
H6.
sumber
5
turun memilih karena tidak berfungsi seperti yang dijelaskan di serverfault.com/a/733998/279553
user3338098
7

Jika seperti saya Anda menggunakan debian dan Anda ingin memindahkan direktori mysql ke rumah Anda atau path di / home / ..., solusinya adalah:

  • Hentikan mysql dengan "sudo service mysql stop"
  • ubah variabel "datadir" ke jalur baru di "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Lakukan backup dari / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • hapus dir ini: "sudo rm -R / var / lib / mysql"
  • Pindahkan data ke dir baru: "cp -R -p / path_to_my_backup / path_new_dir
  • Ubah akses dengan "sudo chown -R mysql: mysql / path_new_dir"
  • Ubah variabel "ProtectHome" dengan "false" pada "/etc/systemd/system/mysqld.service"
  • Muat ulang systemd oleh "sudo systemctl daemon-reload"
  • Mulai ulang mysql dengan "service mysql restart"

Suatu hari untuk menemukan solusi bagi saya pada dokumentasi mariadb. Semoga ini bisa membantu beberapa orang!

Sirac
sumber
File /etc/systemd/system/mysqld.service tidak ada di sini. Tahu di mana aku harus mencari?
Ron Piggott
1
Bagi mereka yang menggunakan MariaDB yang layanan file yang terletak di /lib/systemd/system/[email protected]
Ron Piggott
5

Saya ingin menyimpan database di mesin saya, tetapi juga memiliki data di hard drive eksternal saya, dan beralih antara menggunakan keduanya.

Jika Anda menggunakan Mac, dan menginstal MySQL menggunakan Homebrew, ini seharusnya cocok untuk Anda. Jika tidak, Anda hanya perlu mengganti lokasi yang sesuai untuk MySQL datadirdi komputer Anda.

#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

Kemudian ketika Anda ingin beralih kembali cukup lakukan:

mv mysql mysql.remote

mv mysql.local mysql

dan Anda menggunakan basis data lokal Anda lagi. Semoga itu bisa membantu.

wfbarksdale
sumber
1
ini tidak persis menjawab pertanyaan seperti yang dinyatakan - namun ini persis apa yang saya cari - dan itu adalah cara yang rapi untuk menangani kasus tepi / bug yang my.cnf tidak menangani spasi dengan baik: bugs.mysql.com /bug.php?id=26033 . Saya akan menghubungkan solusi ini pada laporan bug itu.
gabe
turun memilih karena tidak berfungsi seperti yang dijelaskan di serverfault.com/a/733998/279553
user3338098
5

Pertama hentikan mysqld

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

Kemudian ubah datadir di /etc/mysql/my.cnf
Mulai mysqld Anda

Catatan:
# 1: mungkin Anda harus menyesuaikan pengaturan SELinux Anda (coba dengan SELinux dinonaktifkan jika ada masalah), Apparmor (Ubuntu) mungkin juga menjadi masalah.

# 2: lihat Referensi Instal MySQL DB

Murlo
sumber
4

Pertama-tama hentikan mysql Anda

sudo service mysql stop

salin data mysql ke lokasi baru.

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

jika Anda menggunakan apparmor, edit file berikut dan lakukan hal berikut

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

Ganti di mana / var / lib / oleh / yourdirectory / lalu tambahkan follwoing jika tidak ada ke file

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

Simpan file dengan perintah

:wq

Edit file my.cnf

sudo vim /etc/mysql/my.cnf

Ganti di mana / var / lib / oleh / yourdirectory / lalu simpan dengan perintah

:wq

akhirnya mulai mysql

sudo service mysql start

@lihat lebih lanjut tentang raid0, optimasi ici

naddame
sumber
turun memilih karena tidak berfungsi seperti yang terperinci di serverfault.com/a/733998/279553
user3338098
mungkin ini tidak berfungsi untuk distribusi lain, tetapi jika Anda menggunakan ubuntu, ini berfungsi dengan baik untuk saya dan saya mengubah jalur untuk setiap server ubuntu yang baru diinstal untuk mengaktifkan raid0.
naddame
2
Saya tahu orang-orang merendahkan ini, tetapi saya ingin mengatakan kepada Anda bahwa ini telah menyelamatkan hari saya. Terima kasih!
Daniel Loureiro
3

Solusi ini berfungsi di Windows 7 menggunakan Workbench. Anda memerlukan hak Administrator untuk melakukan ini. Ini menciptakan persimpangan (seperti jalan pintas) ke mana pun Anda benar-benar ingin menyimpan data Anda

Buka Workbench dan pilih INSTANCE - Startup / Shutdown Hentikan server

Instal Junction Master dari https://bitsum.com/junctionmaster.php

Arahkan ke C: \ ProgramData \ MySQL \ MySQL Server 5.6

Klik kanan pada Data dan pilih "MOVE dan kemudian LINK folder untuk ..." Terima tujuan Titik peringatan ke "Direktori data baru Anda di sini tanpa tanda kutip" Klik MOVE DAN LINK

Sekarang buka "Direktori data baru Anda di sini tanpa tanda kutip"

Klik kanan pada Data Pergi ke tab keamanan Klik Edit Klik Tambah Jenis LAYANAN NETWORK kemudian Periksa Nama Klik OK Klik kotak centang Izinkan Kontrol Penuh dan kemudian OK

Kembali ke Workbench dan Mulai server

Metode ini bekerja untuk saya menggunakan MySQL Workbench 6.2 pada Windows 7 Enterprise.

rampok
sumber
2

Semuanya seperti @ user1341296 katakan, ditambah ...

Anda lebih baik tidak mengubah /etc/mysql/my.cnf Alih-alih Anda ingin membuat file baru /etc/mysql/conf.d/ext.cnf(nama apa pun, tetapi ekstensi harus cnf)

Dan masukkan perubahan Anda:

[mysqld]
datadir=/vagrant/mq/mysql

Lewat sini

  • Anda tidak perlu mengubah file yang ada (skrip otomatisasi lebih mudah)
  • Tidak ada masalah dengan pembaruan versi MySQL (dan ini konfigurasi!).
Pavel
sumber
2

Jika Anda adalah pengguna Windows dan mendarat di sini untuk mengetahui bahwa semua jawaban untuk Pengguna Linux, jangan kecewa! Saya tidak akan membiarkan Anda membuang waktu seperti yang saya lakukan.

Sedikit omong kosong sebelum solusi:

MySQL menggunakan direktori Data untuk menyimpan data dari berbagai basis data yang Anda buat. Yah, pada akhirnya, itu harus menyimpannya dalam bentuk file dengan beberapa jugglery ditambahkan dalam aplikasi dan format file untuk memastikan janji-janji Database yang Anda pelajari di kelas-kelas Database utuh.

Sekarang Anda ingin memastikan ada cukup ruang untuk menyimpan basis data besar yang mungkin Anda buat di masa depan, dan Anda berpikir, Hei! Saya ingin memasukkannya ke drive lain yang memiliki lebih banyak ruang.

Jadi, Anda melakukan yang berikut ini.

Langkah - 1 : Menghentikan layanan MySQL.

  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)

Langkah - 2 : Mencari tahu direktori Data saat ini

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Secara default, harus ada folder di sini bernama Data, ini adalah yang digunakan oleh MySQL dalam pengaturan default (asalkan mereka belum menemukan lokasi lain yang lebih baik), tetapi mari kita periksa.

Temukan my.inifile, harus ada di sana.

Buka di editor (Notepad ++ mungkin).

Lakukan CTRL + F untuk mencari tahu datadirdalam file.

Apa pun yang disebutkan di sini adalah lokasi aktual yang sedang digunakan oleh MySQL untuk direktori data. Ini yang ingin Anda ubah.

Langkah - 3 : Menggantinya dengan direktori data baru.

Katakanlah Anda ingin direktori data baru Anda menjadi W: __ MySQL_Data. Mari kita ubah datadirnilai dalam my.inifile ke nilai ini. Biarkan nilai sebelumnya dikomentari sehingga Anda tidak harus mengingatnya.

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

Sekarang gunakan xcopyuntuk menyalin default datadirke W:\. Luncurkan command prompt (Window + R, cmd, Enter)

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

Dan ganti nama folder yang disalin ke nilai baru datadiryang Anda ubah. Sini:W:/__MySQL_Data

Mengapa tidak menyalin saja? Nah karena itu bukan COOL !, ini membantu Anda tidak kehilangan izin pada folder yang disalin, sehingga ketika Anda me-restart MySQL80, itu tidak akan memberikan kesalahan bodoh: "Layanan MySQL80 pada Komputer Lokal mulai dan kemudian berhenti. Beberapa layanan berhenti secara otomatis jika mereka tidak digunakan oleh layanan atau program lain. " - Courtesy: Microsoft

Langkah - 4 : Mulai ulang layanan

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

Langkah - 5 : Selesai! Sekarang kembali bekerja !!

Prem KTiw
sumber
1
Terima kasih itu membantu tetapi peringatan: my.ini tidak dapat ditulisi oleh pengguna normal kecuali Anda mengubah izinnya. Oh dan ProgramData adalah folder tersembunyi sehingga Anda harus mengubah pengaturan folder Explorer untuk melihatnya.
JonP
1

Saya sering perlu melakukan ini ketika meningkatkan mesin, bergerak dari kotak ke kotak. Selain memindahkan / var / lib / mysql ke lokasi yang lebih baik, saya sering perlu mengembalikan tabel DB lama dari instalasi MySQL lama. Untuk melakukan ini ...

  1. Hentikan mysql. Ikuti instruksi di atas, itu perlu.
  2. Salin direktori basis data - akan ada satu untuk setiap basis data instalasi lama Anda - ke lokasi DATADIR yang baru. Tetapi hilangkan direktori "mysql" dan "performance_schema".
  3. Izin yang benar di antara direktori basis data yang disalin. Kepemilikan harus mysql: mysql, direktori harus 700, dan file harus 660.
  4. Mulai ulang mysql. Tergantung pada instalasi Anda, file DB versi lama harus diperbarui.
K Markey
sumber
maaf untuk suara turun, solusi ini mungkin benar, belum mencobanya.
user3338098
1

Kami harus memindahkan MySQL ke /homedirektori karena dipetakan dari disk fisik lain. Untuk membuat hidup lebih sederhana, alih-alih mengubah direktori di my.cnf, kami telah memetakan direktori baru /home/mysqldi tempat direktori asli /var/lib/mysql. Ini bekerja untuk kita seperti jimat (diuji pada CentOS 7.1).

Buat dir baru dan atur izin yang benar.

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

Hentikan MySQL jika berjalan.

systemctl stop mysql

Pindahkan direktori data.

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

Buat tunggangan permanen dan jalankan.

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

Mulai ulang server.

systemctl start mysql
TomS
sumber
1

Jika Anda ingin melakukan ini secara terprogram (tidak ada entri teks manual dengan gedit) di sini adalah versi untuk Dockerfile berdasarkan jawaban user1341296 di atas:

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

Tersedia di hub Docker di sini: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

Richard
sumber
0

Pertama, Anda harus tahu di mana file konfigurasi Anda? dimana file konfigurasi anda?

JIKA Anda menginstal dengan apt-get atau yum install。

file konfigurasi mungkin muncul di

/etc/mysql/my.cnf

datafile dapat muncul di

/ var / lib / mysql

dan apa yang harus Anda lakukan adalah

  1. hentikan mysql
  2. ubah data mysql ke direktori baru
  3. ubah file konfigurasi
  4. muat ulang file konfigurasi
  5. restart mysql

dan kemudian pekerjaan selesai.

Tetapi jika Anda tidak menginstalnya dengan apt atau yum, direcotry mungkin tidak seperti ini, dan Anda dapat menemukan file mysql dengan

dimana mysql

Serigala
sumber
turun memilih karena tidak berfungsi seperti yang terperinci di serverfault.com/a/733998/279553
user3338098
0

Di bawah SuSE 13.1, ini berfungsi dengan baik untuk memindahkan direktori data mysql di tempat lain, misalnya ke / home / example_user /, dan untuk memberinya nama yang lebih informatif:

Di / var / lib /:

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

Saya memulai kembali mysql:

# systemctl restart mysql.service

tetapi curiga bahwa itu pun tidak perlu.

pengguna3346151
sumber
0

Untuk salah satu lingkungan saya mengubah direktori data mysql ke lokasi baru tetapi selama restart server mysql, butuh waktu. Jadi saya memeriksa port, dan menemukan bahwa proses lain mendengarkan pada port mysql. Jadi saya mematikan proses dan me-restart server mysql dan bekerja dengan baik.

Saya mengikuti langkah-langkah berikut untuk mengubah direktori data yang berfungsi sangat baik. ubah direktori data mysql di Linux

santosh tiwary
sumber
Selamat Datang di Stack Overflow! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Tim Diekmann
0

Langkah-langkah di atas adalah dasar dan dasar. Saya mengikuti mereka dan masih mendapat kesalahan "mysql gagal memulai".

Agar folder baru untuk menyimpan data mysql, Anda perlu memastikan bahwa folder tersebut memiliki izin dan kepemilikan mysql: mysql.

Selain itu, perlu memeriksa izin dan kepemilikan direktori induk dari mysql jika memiliki, katakanlah, / data / mysql /. Di sini / data / direktori harus menjadi root: root. Saya memperbaiki kesalahan "mysql gagal memulai" setelah mengubah kepemilikan direktori induk dari / mysql. OS di VM saya adalah RHEL 7.6.

user3325137William
sumber
Saya mencoba selinux di RHEL7.6 dengan mengubah SELINUX = menegakkan ke SELINUX = permisif, tidak berhasil untuk saya.
user3325137William
0

Dimungkinkan juga untuk menghubungkan datadir. Setidaknya di macOS, lingkungan dev.

(homebrew) misalnya

# 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

Mulai ulang mysql.

Maciek Rek
sumber
-1

Jika Anda menggunakan SE linux, atur ke mode permisif dengan mengedit / etc / selinux / config dan mengubah SELINUX = menegakkan ke SELINUX = permisif

tanxiuguang
sumber
seperti yang dijelaskan di sini serverfault.com/questions/503887/... selinux tidak bersalah ada beberapa masalah lain yang mencegah perubahan datadirproperti
user3338098