HTTP 狀態消息
1541
2025-04-01
默認情況下,MySQL 數據庫將創建在 /var/lib/mysql 目錄下。
如果您正在運行一個不占用太多空間的小型數據庫,這可能沒問題。但是在生產中,對于較大的數據庫,根分區下可能沒有足夠的空間。
在這種情況下,您可能希望將 MySQL 數據庫從根分區移動到不同的分區。
要更改 MySQL 目錄,在較高級別上,您必須執行以下三個步驟:
將 MySQL 數據庫文件從 /var/lib/mysql 移動到不同的分區
使用新的目錄位置修改 my.cnf 文件
更新安全設置以反映目錄更改:在 CentOS 或 RedHat 上,修改 SELinux 設置。在 Ubuntu 或 Debian 上,修改 AppArmor 設置。
本教程詳細介紹了如何執行上述三個步驟將 MySQL 數據移動到不同的目錄。
備份當前的 MySQL
在您執行任何操作之前,請停止 MySQL 數據庫并對您的數據庫進行冷備份。
默認情況下,MySQL 將數據庫放在 /var/lib/mysql 目錄下。將此 mysql 目錄復制到其他位置進行備份。
service mysqld stop cp -r /var/lib/mysql /backup/mysql
或者,如果您愿意,可以使用mysqldump 進行 MySQL 數據庫備份。
將 MySQL 數據目錄移動到不同的分區
在這個例子中,我的根分區是 /dev/sda1,它沒有太多空間用于默認的 /var/lib/mysql 目錄。但是,我在 /dev/sdb1 磁盤上有 /data 分區,它有很多空間。
因此,我會將 MySQL 數據庫從 / 分區移動到 /data 分區。
創建以下目錄并將mysql數據從/var/lib移動到/data/var/lib,如下所示。
mkdir -p /data/var/lib cd / var / lib mv mysql/data/var/lib/
需要考慮的幾點:
您還可以將 mysql 目錄移動到 /data/var/lib/ 目錄,并從 /var/lib 創建一個指向 /data/var/lib 的符號鏈接。但是,在這種特殊情況下,我更喜歡上述簡單的移動目錄而不使用符號鏈接以避免混淆。
如果可能,嘗試使用 move 命令移動目錄(而不是復制)。當您執行復制時,SELinux 上下文將丟失,您必須稍后手動設置(如下所述)。但是,當您移動時,適用于 MySQL 的 SELinux 上下文會保持原樣,您不必擔心更改它。
此外,如果您復制了目錄(而不是移動),請確保適當更改所有權。如果沒有,您可能會收到此錯誤消息:MySQL 錯誤:1017Can't find file: (errno: 13)
chown -R mysql:mysql /data
修改 my.cnf 并啟動 MySQL
在 /etc/my.cnf 文件中,需要修改 datadir 和 socket 參數,并將它們指向新目錄,如下所示。
# vi /etc/my.cnf datadir=/data/var/lib/mysql socket=/data/var/lib/mysql/mysql.sock
最后,重啟 MySQL 數據庫。
# service mysqld start Starting mysqld: [ OK ]
如果您的 my.cnf 文件中已經定義了 tmpdir 參數,請同時更改該參數的目錄:
tmpdir = /data/var/lib/mysql
更改 my.cnf 文件中的 datadir 和 socket 后,如果 MySQL 沒有啟動,或者失敗并顯示權限被拒絕的錯誤消息,那么您需要按照以下部分的說明設置 SELinux(或 AppArmor)。
MySQL 的 SELinux 上下文類型
使用 ls -Z 命令查看 SELinux 上下文。在移動目錄之前,以下是我的 MySQL 數據庫上的 SELinux 上下文。在本例中,“thegeekstuff”是/var/lib/mysql 目錄下的MySQL 數據庫。
正如您在此處看到的,mysqld_db_t 是 SELinux 上下文類型。
# ls -Z /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 thegeekstuff -rw-rw----。mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1 -rw-rw----。mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0 ..
將目錄移動到新位置后,您應該會看到確切的 SELinux 作為移動前的內容。
ls -Z /data/var/lib/mysql
注意:如果您復制了目錄(而不是移動),您會注意到它已更改。在這種情況下,請按照以下說明更改 SELinux 上下文。
當 SELinux 上下文錯誤時,您將在審核日志(或 /var/log/messages)中看到以下錯誤消息(或類似的內容)
# cat /var/log/audit/audit.log: type=AVC msg=audit(1447281394.928:20831): avc: denied { read } for pid=21346 comm="mysqld" name="mysql" dev=sda1 ino=5506027 scontext=unconfined_u:system_r:mysqld_tcontext=uun02 :object_r:var_lib_t:s0
此外,當 MySQL DB 無法啟動時,您將在 mysqld.log 文件中看到以下內容。
# cat /var/log/mysqld.log: mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql [Warning] Can't create test file /var/lib/mysql/devdb..lower-test /usr/libexec/mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13) [ERROR] Aborting [Note] /usr/libexec/mysqld: Shutdown complete
CentOS / RedHat 上 MySQL 的 SELinux 設置(選項 1)
使用 chcon 命令,您可以更改新目錄中的 SELinux 上下文類型,如下所示。
chcon -R -t mysqld_db_t /data
在上面的命令中:
chcon 是改變 SELinux 上下文的命令
-R 選項將遞歸更改給定目錄和所有子目錄的上下文。
-t 選項用于指定應該設置的 SELinux 上下文類型。在本例中,我們將其設置為 mysqld_db_t 類型。
/data 是將在其上執行此命令的目錄。
注意:從頂級目錄 /data(而不是 mysql 目錄)開始更改上下文,這將包括 mysql 目錄和所有子目錄和文件。
CentOS / RedHat 上 MySQL 的 SELinux 設置(選項 2)
使用 restorecon 命令,您可以將 SELinux 上下文恢復到正確的類型。但是,在這種情況下,您應該通過將 mysqld_db_t 類型添加到 SELinux 上下文映射來通知 SELinux 什么是正確的上下文。
要將 SELinux 類型添加到上下文映射,請使用 semanage 命令。安裝包含 semanage 命令的 policycoreutils-python 包。
yum -y install policycoreutils-python
接下來,執行以下命令在新目錄上設置 SELinux 上下文映射。
semanage fcontext -a -t mysqld_db_t "/data(/.*)?"
在上面的命令中,我們將 mysqld_db_t 添加到 /data 目錄下所有子目錄和文件的上下文映射中。
最后,使用 restorecon 命令,它將適當的 SELinux 上下文恢復到新的 /data 目錄。
restorecon -Rv /data
驗證移動的新 /data 目錄和 mysql 子文件夾是否具有正確的 SELinux 上下文。
# ls -Z /data/var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 thegeekstuff -rw-rw----。mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1 -rw-rw----。mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0 ..
注意:您還可以將 -e 選項與 fcontext 一起使用。這將使 /data 及其子目錄的上下文標簽與 /var/lib/mysql 的上下文標簽相同
semanage fcontext -a -e /var/lib/mysql /data
在 Ubuntu / Debian 上為 MySQL 設置 AppArmor
將 MySQL 數據目錄移動到新位置后,如果不執行以下操作,在 Ubuntu 上,您將在啟動 mysql 數據庫時收到此錯誤:“(errno: 13)”(權限被拒絕)。
修改usr.sbin.mysqld文件如下圖,添加如下兩行。不要忘記行尾的逗號,這是必需的。
# vi /etc/apparmor.d/usr.sbin.mysqld /data/var/lib/mysql/ r, /data/var/lib/mysql/** rwk,
接下來,執行以下命令為 mysql 重新解析這個新的 apparmor 配置文件,并重新啟動 apparmor。
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld sudo /etc/init.d/apparmor reload
注意:或者,您也可以在 AppArmor 別名文件中添加別名,如下所示。同樣,不要忘記此別名行末尾的逗號。
# vi /etc/apparmor.d/tunables/alias alias /var/lib/mysql/ -> /newpath/,
MySQL 客戶端套接字參數
進行上述更改后,您在從 mysql 客戶端連接時可能會收到此錯誤消息:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
# mysql -u root -pMyPassword ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
如果發生這種情況,請將 –socket 參數傳遞給 mysql 客戶端,并將其指向位于新目錄下的 mysql.sock 文件。
mysql -u root -pMyPassword --socket=/data/var/lib/mysql/mysql.sock
如果您在本地調用 mysql 客戶端,您還可以使用 -h 選項并傳遞 127.0.0.1,如下所示。這也將避免 mysql.sock 錯誤消息。
mysql -u root -pMyPassword -h127.0.0.1
CentOS MySQL Ubuntu
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。