ฉันจะย้ายไดเรกทอรีข้อมูล MySQL ได้อย่างไร


57

ฉันกำลังพยายามที่จะย้ายไดเรกทอรีข้อมูลของฐานข้อมูล MySQL /array2/ของฉันเป็นดิสก์อาร์เรย์ที่สองที่ผมมีเป็นจุดเชื่อมต่อ

ปัญหาที่ฉันมีคือฉันได้ลองทุกอย่างแล้วหลังจากที่ฉันแก้ไขตำแหน่งของ datadir ใน my.cnf mysql จะไม่เริ่มทำงานอีกครั้ง

สิ่งที่ฉันได้รับคือ:

start: Job failed to start

คำตอบ:


62

ลืมเกี่ยวกับเกราะของแอพ

สำหรับทุกคนที่มีความสนใจฉันได้ทำสิ่งต่อไปนี้เพื่อย้ายโฟลเดอร์

หยุดเซิร์ฟเวอร์ mysql:

stop mysql

สร้างไดเรกทอรีใหม่:

mkdir /array2/mysql

คัดลอกเฉพาะโฟลเดอร์ฐานข้อมูล:

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

สำรองmy.cnfไฟล์:

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

แก้ไขmy.cnfไฟล์:

nano /etc/mysql/my.cnf

เปลี่ยนการกล่าวถึง datadir เก่าและซ็อกเก็ตทั้งหมดเป็นตำแหน่งใหม่ของคุณ

ของฉันกลายเป็น:

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

อัปเดตการอนุญาตไดเรกทอรี:

chown -R mysql:mysql /array2/mysql

เปลี่ยนชื่อไดเรกทอรีเก่า:

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

สร้าง symlink ในกรณีที่:

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

ให้ AppArmor รู้เกี่ยวกับ datadir ใหม่:

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

โหลดโปรไฟล์ apparmor อีกครั้ง

sudo /etc/init.d/apparmor reload

จากนั้นเริ่ม mysql:

start mysql

นี่เป็นคำตอบที่ดี แต่คุณอาจต้องอีกหนึ่งขั้นตอนเพื่อให้ลูกค้าเชื่อมต่อกับ mysql เพิ่มกลุ่มใหม่ที่มีหนึ่งบรรทัดภายใต้ ... [clients] socket = / array2 / mysql / mysql.sock โดยที่ socket = ส่วนที่ชี้ไปยังตำแหน่งใหม่ของไฟล์ mysql.sock ของคุณ
Night Owl

1
หากคุณไม่ต้องการที่จะใส่ใจที่จะผสาน/etc/apparmor.d/usr.sbin.mysqldทุกครั้ง MySQL ได้รับการปรับปรุงคุณสามารถเพิ่ม/array2/mysql/** rwk,การ/etc/apparmor.d/local/usr.sbin.mysqldแทน Mysql จะยังสามารถเข้าถึง dir ข้อมูลเก่าได้ แต่นั่นอาจไม่ใช่ปัญหา
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. ทำไมโฟลเดอร์ฐานข้อมูลเท่านั้น?
int_ua

สำหรับทุกคนที่ย้าย datadir ของพวกเขาไปที่ ZFS (เหมือนที่ฉันทำ) ให้แน่ใจว่าคุณเพิ่ม: innodb_use_native_aio=0ใน[mysqld]ส่วนของmy.cnfไฟล์ของคุณเนื่องจาก ZFS บน linux ไม่รองรับ AIO dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley

23

ฉันพบว่า AppArmor เป็นผู้ร้ายโดยตรวจสอบsyslogและสามารถเปลี่ยนตำแหน่งmysqlข้อมูลได้สำเร็จโดยทำตามขั้นตอนนี้

โปรดทราบว่าในไฟล์ที่แก้ไขด้านล่าง+จะมีการเพิ่มบรรทัดที่ขึ้นต้นด้วยและบรรทัดที่ขึ้นต้นด้วย-ถูกลบออก คุณไม่ควรพิมพ์ / วาง+สัญลักษณ์เมื่อเพิ่มบรรทัดลงในไฟล์เหล่านี้

ฉันโคลนmysqlไดเรกทอรีไปยังตำแหน่งใหม่:

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

จากนั้นฉันจะแก้ไขdatadirบรรทัดใน/etc/mysql/my.cnf:

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

จากนั้นฉันก็แก้ไข/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,

mysqlจากนั้นฉันเริ่มต้นใหม่


13

ระวัง.

หากคุณมีตาราง InnoDB คุณต้องคัดลอกไปที่ไฟล์ibdata*และib_logfile*หรือคุณจะไม่สามารถใช้ตาราง คุณจะได้รับ:

'Table' databaseName.tableName 'ไม่มีอยู่'

ข้อผิดพลาด

เรียกใช้คำสั่ง copy นี้เพื่อคัดลอกไฟล์ibdata*และib_logfile*

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

นี่ควรเป็นความเห็นไม่ใช่คำตอบที่สมบูรณ์
Postadelmaga

4

ฉันลองอีกวิธีหนึ่งเพื่อให้บางคนเห็นว่ามีประโยชน์:

คัดลอกด้วยสิทธิ์เหมือนเดิม:

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

สำรองข้อมูล (ในกรณีที่มีข้อผิดพลาด):

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

สร้างไดเรกทอรีว่างเปล่าใหม่แทนที่เก่า:

mkdir /var/lib/mysql

ผูกติดตั้งตำแหน่งใหม่เพื่อเก่า:

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

หวังว่าจะช่วยใครบางคนเพราะการเชื่อมโยงไม่ได้ช่วยฉันได้และนี่เป็นวิธีที่ง่ายที่สุด


3

หากคุณย้าย datadir ของคุณคุณไม่เพียง แต่จะต้องให้สิทธิ์ datadir ใหม่ แต่คุณต้องประกันไดเรกทอรีหลักทั้งหมดได้รับอนุญาต

ฉันย้ายข้อมูลของฉันไปยังฮาร์ดไดรฟ์ซึ่งติดตั้งใน Ubuntu เป็น

/media/*user*/Data/

และ datadir ของฉันคือฐานข้อมูล

ฉันต้องตั้งค่าการอนุญาตเป็น 771 สำหรับแต่ละสื่อผู้ใช้และไดเรกทอรีข้อมูล:

sudo chmod 771 *DIR*

หากวิธีนี้ใช้ไม่ได้อีกวิธีหนึ่งที่คุณสามารถทำให้ mysql ทำงานได้คือเปลี่ยนผู้ใช้ใน /etc/mysql/my.cnf เป็นรูท แม้ว่าจะมีข้อสงสัยบางประเด็นเกี่ยวกับการทำเช่นนั้นจากมุมมองด้านความปลอดภัย


2

ฉันชอบที่จะใช้การเมานท์พร้อมตัวเลือกการเชื่อมโยงดังนั้นฉันจึงหลีกเลี่ยงการเปลี่ยนแปลงเพิ่มเติมในการกำหนดค่า Apparmor และ Mysql


ตัวอย่างเช่น:

/var/wwwสมมติว่าผมต้องการที่จะย้ายทุกอย่างใน ให้บอกว่า dir นี้คือสภาพแวดล้อม dev ของฉันและมันถูกเมาท์ในพาร์ติชั่นอื่น

  1. ก่อนอื่นเราต้องหยุด mysql :

    sudo systemctl stop mysql.service
    
  2. เราย้ายไฟล์ (สงวนสิทธิ์)

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

    สิ่งนี้จะสร้างไดเรกทอรีที่/var/www/mysql/มีเนื้อหาทั้งหมด

  3. เราลบทุกสิ่งในไดเรกทอรีเก่า:

    sudo rm -r /var/lib/mysql/*
    
  4. เราติดตั้งไดเรกทอรีใหม่พร้อมbindตัวเลือกในไดเรกทอรีเก่า
    แก้ไข/etc/fstabและเพิ่มบรรทัดนี้:

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

    นี้จะติด/var/www/mysqlใน dir ที่ว่างเปล่าของเราตัวเลือกที่นี่ไม่มายากลก็จะเติมที่มีเนื้อหาของดังนั้นสำหรับ MySQL และ AppArmor มันจะเป็นอะไรที่เหมือนมีการเปลี่ยนแปลง/var/lib/mysql
    bind/var/lib/mysql/var/www/mysql

  5. ตอนนี้เราทำการติดตั้ง:

    sudo mount -a
    

    และเริ่ม mysql ใหม่


0

คุณรู้หรือไม่ว่าคุณทำตามคำสั่งคำต่อคำจากคำตอบที่ยอมรับมันจะล้มเหลว?

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

จะคัดลอก / var / lib / mysql ไปยัง / array2 / mysql / mysql

เมื่อคุณตั้งค่าไฟล์กำหนดค่าคุณควรวางใน / array2 / mysql / mysql เป็นไดเรกทอรีมิฉะนั้น mysqld ของคุณจะไม่สามารถเริ่มต้นได้

คำสั่งคัดลอกที่ดีกว่าคือ:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / ผู้ใช้ / array2 / mysql

แค่ 2 เซ็นต์ของฉันมีค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.