如何在 CentOS 和 Ubuntu 上將 MySQL 數據目錄移動到新位置

      網友投稿 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

      如何在 CentOS 和 Ubuntu 上將 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小時內刪除侵權內容。

      上一篇:word敲空格文字不后退怎么辦(word 按空格不往后退)
      下一篇:當高管拒絕投資于組織變革管理
      相關文章
      亚洲乱码一二三四区麻豆| 亚洲国产精品成人AV在线| 亚洲 欧洲 日韩 综合在线| 精品亚洲麻豆1区2区3区| 亚洲va无码手机在线电影| 亚洲中文字幕无码一区| 亚洲第一区精品观看| 亚洲国产精品免费观看| 亚洲中文无码线在线观看| 亚洲日本视频在线观看| 亚洲国产人成网站在线电影动漫 | 亚洲自偷自偷在线成人网站传媒 | 在线观看亚洲AV每日更新无码| 亚洲一区在线视频| 97久久国产亚洲精品超碰热| 亚洲乱码卡三乱码新区| 亚洲午夜在线播放| 亚洲人成欧美中文字幕| 亚洲精品精华液一区二区| 亚洲av成人中文无码专区| 韩国亚洲伊人久久综合影院| 亚洲 综合 国产 欧洲 丝袜| 亚洲午夜AV无码专区在线播放| 亚洲一区二区三区无码影院| 亚洲中文字幕无码永久在线| 精品久久久久久亚洲| 亚洲情a成黄在线观看动漫尤物| 久久久久亚洲AV成人片| 亚洲成a人片毛片在线| 亚洲日本久久一区二区va| 亚洲乱码国产乱码精华| 国产亚洲情侣久久精品| 亚洲综合色视频在线观看| 亚洲人成图片小说网站| 亚洲人成电影在线天堂| 亚洲国产成AV人天堂无码| 亚洲色大成网站www久久九| 国产亚洲精品第一综合| 亚洲一区二区三区无码中文字幕| 亚洲av伊人久久综合密臀性色| 久久久久亚洲Av无码专|