Bagaimana cara saya memindahkan direktori data MySQL?

57

Saya mencoba untuk memindahkan direktori data database MySQL saya ke array disk kedua yang saya miliki sebagai mount point /array2/.

Masalah yang saya alami adalah saya telah mencoba segalanya dan setelah saya memodifikasi lokasi datadir di my.cnf mysql tidak akan mulai lagi.

Yang saya dapatkan adalah:

start: Job failed to start
Jonny Flowers
sumber

Jawaban:

62

Lupa tentang aplikasi armor.

Bagi siapa pun yang tertarik, saya melakukan yang berikut untuk memindahkan folder.

Hentikan server mysql:

stop mysql

Buat direktori baru:

mkdir /array2/mysql

Salin HANYA folder database:

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

Cadangkan my.cnffile:

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

Edit my.cnffile:

nano /etc/mysql/my.cnf

Ubah semua sebutan datadir dan soket lama ke lokasi baru Anda

Milik saya menjadi:

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

Perbarui izin direktori:

chown -R mysql:mysql /array2/mysql

Ganti nama direktori lama:

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

Buat symlink, untuk berjaga-jaga:

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

Biarkan AppArmor tahu tentang datadir baru:

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

Muat ulang profil apparmor

sudo /etc/init.d/apparmor reload

Kemudian mulai mysql:

start mysql
Jonny Flowers
sumber
Ini adalah jawaban yang bagus tetapi Anda mungkin perlu satu langkah lagi untuk memungkinkan klien terhubung ke mysql. Tambahkan grup baru dengan satu baris di bawahnya ... [klien] socket = / array2 / mysql / mysql.sock di mana socket = porsi menunjuk ke lokasi baru file mysql.sock Anda.
Night Owl
1
Jika Anda tidak mau repot untuk menggabungkan /etc/apparmor.d/usr.sbin.mysqldsetiap kali mysql menerima update, Anda dapat menambahkan /array2/mysql/** rwk,untuk /etc/apparmor.d/local/usr.sbin.mysqldgantinya. Mysql masih akan memiliki akses ke dir data lama, tapi itu mungkin bukan masalah.
drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Mengapa hanya folder basis data?
int_ua
Bagi siapa pun yang memindahkan datadir mereka ke ZFS (seperti yang saya lakukan), pastikan Anda juga menambahkan: innodb_use_native_aio=0di [mysqld]bagian my.cnffile Anda , karena ZFS di linux tidak mendukung AIO. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley
23

Saya menemukan bahwa AppArmor adalah pelakunya dengan memeriksa syslog, dan berhasil mengubah mysqllokasi data dengan mengikuti proses ini.

Harap perhatikan bahwa, dalam file yang diedit di bawah ini, baris yang dimulai dengan +ditambahkan, dan baris yang dimulai dengan -dihapus. Anda seharusnya tidak benar-benar mengetik / menempel +tanda ketika menambahkan baris ke file-file ini.

Saya mengkloning mysqldirektori ke lokasi baru:

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

Kemudian saya mengedit datadirbaris /etc/mysql/my.cnf:

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

Kemudian saya mengedit /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,

Kemudian saya memulai kembali mysql.

Brian Moore
sumber
13

Waspadalah.

Jika Anda memiliki tabel InnoDB Anda HARUS menyalin ibdata*dan ib_logfile*file atau Anda tidak akan dapat menggunakan tabel. Kamu akan mendapatkan:

'Table' databaseName.tableName 'tidak ada'

kesalahan.

Jalankan perintah salin ini untuk menyalin ibdata*dan ib_logfile*file.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
dave
sumber
ini harus menjadi komentar, itu bukan jawaban yang lengkap
Postadelmaga
4

Saya hanya mencoba cara lain, yang mungkin berguna bagi beberapa orang:

salin dengan izin utuh:

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

cadangan (jika terjadi kesalahan):

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

buat direktori kosong baru menggantikan yang lama:

mkdir /var/lib/mysql

bind mount lokasi baru ke yang lama:

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

Harapan yang membantu seseorang, karena menghubungkan tidak bekerja untuk saya, dan ini adalah cara paling sederhana

snapfractalpop
sumber
3

Jika Anda memindahkan datadir Anda, Anda tidak hanya perlu memberikan izin datadir baru, tetapi Anda harus memastikan bahwa semua direktori induk memiliki izin.

Saya memindahkan datadir saya ke hard drive, yang dipasang di Ubuntu sebagai:

/media/*user*/Data/

dan datadiraku adalah Database .

Saya harus menetapkan izin ke 771 untuk masing-masing direktori media, pengguna dan Data:

sudo chmod 771 *DIR*

Jika ini tidak berhasil, cara lain Anda dapat membuat mysql berfungsi adalah dengan mengubah pengguna di /etc/mysql/my.cnf untuk me-root; meskipun tidak ada keraguan beberapa masalah dengan melakukan itu dari perspektif keamanan.

Kohjah Breese
sumber
2

Saya lebih suka menggunakan opsi mount dengan bind jadi saya menghindari perubahan lebih lanjut dalam konfigurasi Apparmor dan Mysql.


Sebagai contoh:

Misalkan saya ingin memindahkan semuanya /var/www. Katakanlah dir ini adalah lingkungan dev saya dan sudah terpasang di partisi yang berbeda

  1. Pertama-tama kita harus menghentikan mysql :

    sudo systemctl stop mysql.service
    
  2. Kami memindahkan file (menjaga izin)

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

    Ini akan menghasilkan direktori /var/www/mysql/dengan semua konten.

  3. Kami menghapus semua yang ada di direktori lama:

    sudo rm -r /var/lib/mysql/*
    
  4. Kami memasang direktori baru dengan bindopsi di yang lama.
    edit /etc/fstabdan tambahkan baris ini:

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

    Ini akan me-mount /var/www/mysqldi dir kosong kita /var/lib/mysql
    . bindOpsi di sini melakukan keajaiban, itu akan diisi /var/lib/mysqldengan konten /var/www/mysqljadi untuk mysql dan apparmor itu akan menjadi seperti tidak ada yang berubah.

  5. Sekarang kita lakukan mount:

    sudo mount -a
    

    dan mulai kembali mysql.

Postadelmaga
sumber
0

Anda sadar jika Anda mengikuti perintah kata demi kata dari jawaban yang diterima itu akan gagal?

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

Akan menyalin / var / lib / mysql ke / array2 / mysql / mysql.

Ketika Anda mengatur file konfigurasi Anda, Anda sebaiknya meletakkan di / array2 / mysql / mysql sebagai direktori atau jika tidak mysqld Anda akan gagal untuk memulai.

Perintah salin yang lebih baik adalah:

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

Hanya senilai 2 sen saya.

Ellison Chan
sumber