Ubuntu下MySQL資料庫遷移
確定MySQL資料庫檔案位置
MySQL 命令
show variables like '%dir%';
注:用Ubuntu的apt包管理工具安裝的mysql資料庫,預設將資料庫檔案儲存在/var/lib/mysql目錄下
停止服務
sudo /etc/init.d/mysql stop
或者
service mysql stop
拷貝檔案
sudo cp -a /var/lib/mysql /mnt/data/
注:使用cp複製命令將原資料庫目錄檔案複製到新的目錄,好處是。。萬一遷移失敗,恢復工作相對簡單一點,等確認遷移成功再來刪掉原資料庫目錄檔案也不遲。為了不影響複製過來資料庫目錄檔案許可權和使用者使用者組歸屬問題,使用cp命令時要加上-a
關鍵步驟
修改配置檔案
一共需要改3個檔案 需要root許可權
第一個 my.cnf檔案
vim /etc/mysql/my.cnf
將其中[mysqld]標籤下的datadir屬性值改為新資料庫目錄路徑如:/data/mysql
第二個 usr.bin.mysqld檔案
vim /etc/apparmor.d/usr.sbin.mysqld
找到其中的
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
兩行許可權宣告,可以在前面加上#好註釋掉。然後對照格式,加入新路徑的許可權宣告:
/data/mysql/ r,
/data/mysql/** rwk,
第三個 abstractions/mysql檔案
vim /etc/apparmor.d/abstractions/mysql
同樣也是將新資料庫檔案路徑中的socket檔案許可權新增進去,同時可以刪除或者註釋掉全路徑中申請的許可權,效果如下
# ------------------------------------------------------------------
#
# Copyright (C) 2002-2006 Novell/SUSE
# Copyright (C) 2013 Christian Boltz
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
# License published by the Free Software Foundation.
#
# --------------------------------------------------------
#/var/lib/mysql/mysql.sock rw,
/data/mysql/mysql.sock rw, #照貓畫虎 自己的路徑
/{var/,}run/mysql/mysql.sock rw,
/usr/share/{mysql,mysql-community-server,mariadb}/charsets/ r,
/usr/share/{mysql,mysql-community-server,mariadb}/charsets/*.xml r,
最後別忘了重啟一下服務
配置檔案修改成功後就可以重啟資料庫,重啟資料庫之前需要先重新載入apparmor配置檔案,使用下面命令重新載入:
sudo /etc/init.d/apparmor restart
過載成功就可以使用下面命令啟動資料庫:
sudo /etc/init.d/mysql start
關於啟動失敗
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
話說不會偷懶的程式設計師不是好程式設計師,因為有N多臺機器要我改,不可能一個一個來搞,那會蠢死去。所以研究了一下 弄了個測試指令碼共享一下也方便有需要的童鞋。PS:改之前千萬記得備份。備份真的是個好習慣
/etc/init.d/mysql stop;
sudo cp -a /var/lib/mysql /data/; #成功之後可以刪掉原目錄的檔案
sed -i '42s?/var/lib?/data?' /etc/mysql/my.cnf;
sed -i '32s?/var/lib?/data?' /etc/apparmor.d/usr.sbin.mysqld;
sed -i '33s?/var/lib?/data?' /etc/apparmor.d/usr.sbin.mysqld;
sed -i '12s?/var/lib?/data?' /etc/apparmor.d/abstractions/mysql;
/etc/init.d/apparmor restart;
/etc/init.d/mysql start;
service mysql restart #為了生效,保險起見 還是再重啟一下服務 強迫症