ในบทความนี้ เราจะเรียนรู้วิธีเปลี่ยน MySQL Data Directory หรือย้ายข้อมูล MySQL Database ไปยังตำแหน่งใหม่ สถานการณ์นี้อาจใช้เมื่อฐานข้อมูลเติบโตอย่างรวดเร็ว หรือด้วยเหตุผลด้านความปลอดภัยบางประการ เราต้องการย้ายไดเร็กทอรีข้อมูล ไปยังตำแหน่งใหม่
ข้อกำหนดเบื้องต้น
- เครื่อง Ubuntu ที่มีผู้ใช้ที่ไม่ใช่รูทที่มีสิทธิ์ Sudo
- ติดตั้ง MySQL และใช้งานได้
- ไดรฟ์ข้อมูลหรือตำแหน่งใหม่ที่เราต้องการย้ายตำแหน่งข้อมูลฐานข้อมูล ตำแหน่งใหม่จะเป็น /mnt/data_vol/MySQL เนื่องจาก data_vol คือไดรฟ์ข้อมูลที่เชื่อมต่อกับเครื่องหรือเซิร์ฟเวอร์ใหม่
การเปลี่ยนตำแหน่งโฟลเดอร์ข้อมูล MySQL
ก่อนที่เราจะดำเนินการต่อ เราจะหาตำแหน่งปัจจุบันของไดเร็กทอรีข้อมูลก่อน
$ mysql –u root –pOutput:ป้อนรหัสผ่าน:ยินดีต้อนรับสู่มอนิเตอร์ MySQL คำสั่งลงท้ายด้วย; หรือ \g.ID การเชื่อมต่อ MySQL ของคุณคือ 472Server เวอร์ชัน:5.6.30-0ubuntu0.14.04.1 (Ubuntu) ลิขสิทธิ์ (c) 2000, 2016, Oracle และ/หรือบริษัทในเครือ สงวนลิขสิทธิ์ Oracle เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle Corporation และ/หรือบริษัทในเครือ ชื่ออื่นๆ อาจเป็นเครื่องหมายการค้าของเจ้าของที่เกี่ยวข้อง พิมพ์ 'help;' หรือ '\h' เพื่อขอความช่วยเหลือ พิมพ์ '\c' เพื่อล้างคำสั่งอินพุตปัจจุบัน.mysql>
เมื่อได้รับพร้อมท์ให้ใส่รหัสผ่านรูทของ MySQL โปรดป้อนรหัสผ่าน เรียกใช้คำสั่งด้านล่างเพื่อทราบไดเร็กทอรีข้อมูลการทำงานปัจจุบันสำหรับ MySQL
Mysql> เลือก @@datadir;Output:+-----------------+| @@datadir |+----------------+| /var/lib/mysql/ |+----------------+1 แถวในชุด (0.00 วินาที)
จากผลลัพธ์จะแสดงว่าฐานข้อมูล MySQL ใช้ /var/lib/MySQL เป็นโฟลเดอร์เริ่มต้นเป็นไดเร็กทอรีข้อมูล ก่อนที่เราจะแก้ไขอะไรก่อนอื่น เราจะตรวจสอบความสมบูรณ์ของข้อมูล เราจะหยุด MySQL และตรวจสอบสถานะ
$ sudo systemctl หยุด mysql
เนื่องจาก systemctl จะไม่แสดงผลใดๆ สำหรับคำสั่งบริการ
$ sudo systemctl status mysqlOutput:mysql.service - MySQL Community Server โหลดแล้ว:โหลดแล้ว (/lib/systemd/system/mysql.service; เปิดใช้งาน; ค่าที่ตั้งไว้ล่วงหน้าของผู้ขาย:เปิดใช้งาน) ใช้งาน:ไม่ใช้งาน (ไม่ทำงาน) ตั้งแต่วันจันทร์ 2016-09- 12 13:57:43 น. IST; 1 วินาทีที่แล้ว กระบวนการ:17669 ExecStartPost=/usr/share/mysql/mysql-systemd-start post (code=exited, status=0/SUCCESS) กระบวนการ:17668 ExecStart=/usr/sbin/mysqld (code=exited, status=0 /SUCCESS) กระบวนการ:17664 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID:17668 (code=exited, status=0/SUCCESS)Sep 12 13 :55:14 ubuntu-16 systemd[1]:กำลังเริ่มต้น MySQL Community Server...Sep 12 13:55:15 ubuntu-16 systemd[1]:เริ่มต้น MySQL Community Server.Sep 12 13:57:40 ubuntu-16 systemd [1]:กำลังหยุดเซิร์ฟเวอร์ชุมชน MySQL...12 ก.ย. 13:57:43 น. ubuntu-16 systemd[1]:หยุดเซิร์ฟเวอร์ชุมชน MySQL แล้ว
ครั้งหนึ่งเรายืนยันว่าหยุด MySQL เราจะย้ายข้อมูลไปยังตำแหน่งใหม่ ในการย้ายข้อมูล เราจะใช้ Rsync กับ –a ตัวเลือกที่รักษาสิทธิ์ของไฟล์ข้อมูลและ –v ซึ่งแสดงเอาต์พุตแบบละเอียด
ด้านล่างนี้คือคำสั่งแบบเต็มเพื่อย้ายข้อมูลไปยังตำแหน่งใหม่ –
$ rsync –av /var/lib/mysql /mnt/data_vol/OutPut:sending incremental file listmysql/mysql/auto.cnfmysql/debian-5.7.flagmysql/ib_buffer_poolmysql/ib_logfile0mysql/ibqlqlfile1mys /columns_priv.MYDmysql/mysql/columns_priv.MYImysql/mysql/columns_priv.frmmysql/mysql/db.MYDmysql/mysql/db.MYImysql/mysql/db.frmmysql/x.00s.mysql... frmmysql sys / / x @ 0024user_summary_by_file_io.frmmysql sys / / x @ 0024user_summary_by_file_io_type.frmmysql sys / / x @ 0024user_summary_by_stages.frmmysql sys / / x @ 0024user_summary_by_statement_latency.frmmysql sys / / x @ 0024user_summary_by_statement_type.frmmysql sys / / x @ 0024wait_classes_global_by_avg_latency.frmmysql / sys/x@0024wait_classes_global_by_latency.frmmysql/sys/x@0024waits_by_host_by_latency.frmmysqlsys//[email protected]_by_user_by_latency.frmmysql/sys/x@0024waits_global_by_latency.1.00 น. โดยขนาด 132,983, 00,998, 00,8,998, เท่ากับ 0024, 0024 waits_global_by_latency.หลังจาก rsync ย้ายโฟลเดอร์ข้อมูลไปยังตำแหน่งใหม่ได้สำเร็จ ด้วยเหตุผลด้านความปลอดภัย เราจะเก็บโฟลเดอร์ข้อมูลไว้จนกว่าจะยืนยันว่าข้อมูลอยู่ที่ตำแหน่งใหม่ เราจะเปลี่ยนชื่อไดเร็กทอรีข้อมูลปัจจุบันจาก /var/lib/mysql เป็น /var/lib/mysql_backup ด้านล่างเป็นคำสั่งเปลี่ยนไดเร็กทอรีข้อมูลปัจจุบัน
ด้านล่างนี้เป็นคำสั่งเปลี่ยนไดเร็กทอรีข้อมูลปัจจุบัน –
$ sudo mv /var/lib/mysql /var/lib/mysql_backupตอนนี้ เราจะเปลี่ยนไดเร็กทอรีข้อมูลเริ่มต้น สำหรับการเปลี่ยนแปลง เรามีหลายวิธี แต่เราจะแก้ไขไฟล์ mysqld.cnf ซึ่งอยู่ใน /etc/mysql/mysql.conf.d/mysqld.cnfพี>
ในการแก้ไข mysqld.cnf ด้านล่างนี้คือคำสั่ง
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnfOutput:[mysqld_safe]socket =/var/run/mysqld/mysqld.socknice =0[mysqld]## * การตั้งค่าพื้นฐาน#ผู้ใช้ =mysqlpid -file =/var/run/mysqld/mysqld.pidsocket =/var/run/mysqld/mysqld.sockport =3306basedir =/usrdatadir =/mnt/data_vol/mysql/tmpdir =/tmplc-messages-dir =/usr/share /mysqlskip-external-lockingการเปลี่ยนการตั้งค่านามแฝง Apparmor
นอกจากนี้ เราจำเป็นต้องแก้ไขไฟล์ /etc/apparmor.d/tunables/alias
ที่ด้านล่างของไฟล์ เราจำเป็นต้องเพิ่มบรรทัดต่อไปนี้ในกฎนามแฝง
$ sudo vi /etc/apparmor.d/tunables/aliasOutput:# -------------------------------- ----------------------------------## ลิขสิทธิ์ (C) 2010 Canonical Ltd.## โปรแกรมนี้ฟรี ซอฟต์แวร์; คุณสามารถแจกจ่ายซ้ำและ/หรือ# แก้ไขได้ภายใต้เงื่อนไขของเวอร์ชัน 2 ของใบอนุญาต GNU General Public# ที่เผยแพร่โดย Free Software Foundation## ------------------ ------------------------------------# นามแฝง กฎสามารถใช้เพื่อเขียนเส้นทางใหม่และทำหลังจากแก้ไขตัวแปร # ตัวอย่างเช่น ถ้า '/usr' อยู่บนสื่อที่ถอดออกได้:# alias /usr/ -> /mnt/usr/,## หรือถ้าฐานข้อมูล mysql ถูกเก็บไว้ใน /home:# alias /var/lib/mysql/ -> / หน้าแรก/mysql/,นามแฝง /var/lib/mysql/ -> /mnt/data_vol/mysqlเมื่อแก้ไขไฟล์แล้ว เราต้องรีสตาร์ท apparmor
ด้านล่างนี้เป็นคำสั่งให้รีสตาร์ท apparmor
เนื่องจากเราได้เปลี่ยนไดเร็กทอรีข้อมูลเริ่มต้น เราจำเป็นต้องเรียกใช้คำสั่งด้านล่างซึ่งจะสร้างโครงสร้างโฟลเดอร์ไดเร็กทอรีขั้นต่ำเพื่อส่งผ่านสภาพแวดล้อมของสคริปต์
$ sudo mkdir /var/lib/mysql/mysql –p
ตอนนี้เราจะเริ่มบริการ mysql ใหม่
$ sudo systemctl start mysqlตอนนี้เราจะตรวจสอบสถานะของบริการ MySQL ด้วยคำสั่งด้านล่าง
$ sudo systemctl status mysqlOutput:mysql.service - MySQL Community Server โหลดแล้ว:โหลดแล้ว (/lib/systemd/system/mysql.service; เปิดใช้งาน; ค่าที่ตั้งไว้ล่วงหน้าของผู้ขาย:เปิดใช้งาน) ใช้งาน:ใช้งานอยู่ (ทำงาน) ตั้งแต่วันจันทร์ 2016-09- 12 14:17:27 น. IST; 23 วินาทีที่แล้ว กระบวนการ:18481 ExecStartPost=/usr/share/mysql/mysql-systemd-start post (code=exited, status=0/SUCC Process:18477 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (รหัส) =ออก สถานะ=0/SUCCES Main PID:18480 (mysqld) งาน:28 (จำกัด:512) หน่วยความจำ:137.3M CPU:329msCGroup:/system.slice/mysql.service └─18480 /usr/sbin/mysqldSep 12 14 :17:26 ubuntu-16 systemd[1]:กำลังเริ่ม MySQL Community Server...Sep 12 14:17:27 ubuntu-16 systemd[1]:เริ่มการทำงานของ MySQL Community Serverเพื่อให้แน่ใจว่าไดเร็กทอรีข้อมูลใหม่มีการเปลี่ยนแปลง เราจะเรียกใช้คำสั่งด้านล่าง
$ mysql -uroot -pOutput:ป้อนรหัสผ่าน:ยินดีต้อนรับสู่มอนิเตอร์ MySQL คำสั่งลงท้ายด้วย; หรือ \g.ID การเชื่อมต่อ MySQL ของคุณคือ 3Server เวอร์ชัน:5.7.13-0ubuntu0.16.04.2 (Ubuntu)Copyright (c) 2000, 2016, Oracle และ/หรือบริษัทในเครือ สงวนลิขสิทธิ์ Oracle เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle Corporation และ/หรือบริษัทในเครือ ชื่ออื่นๆ อาจเป็นเครื่องหมายการค้าของเจ้าของที่เกี่ยวข้อง พิมพ์ 'help;' หรือ '\h' เพื่อขอความช่วยเหลือ พิมพ์ '\c' เพื่อล้างคำสั่งอินพุตปัจจุบัน.mysql> เลือก @@datadir+----------------------+| @@datadir |+----------------------+| /mnt/data_vol/mysql/ |+-----------------+1 แถวในชุด (0.00 วินาที)mysql>เมื่อเรายืนยันว่าไดเร็กทอรีข้อมูลมีการเปลี่ยนแปลง เราจะลบไดเร็กทอรีข้อมูลเริ่มต้นซึ่งอยู่ที่ /var/lib/mysql_backup ด้านล่างนี้คือคำสั่งให้ลบไดเร็กทอรีฐานข้อมูลเก่า
$ sudo rm –rf /var/lib/mysql_backupในการกำหนดค่าและขั้นตอนข้างต้น เราได้เรียนรู้ที่จะย้ายไดเร็กทอรีข้อมูล MySQL ไปยังตำแหน่งใหม่ ซึ่งจะช่วยให้เรารักษาความปลอดภัยหรือจัดเก็บข้อมูลเพิ่มเติมไปยังตำแหน่งอื่นได้