網站因故需要遷移到不同主機。
原來架構在 Mariadb 上的 WordPress 要如何無損的搬家呢?
總體來說,就以下三部曲:
- 資料庫備份
- 新主機上的 Mariadb 安裝與設定
- 資料庫匯入到新主機
mysqldump -u [資料庫使用者名稱] -p [WordPress資料庫名稱] > [備份檔案名稱.sql]
資料庫備份部份,對我來說,因為是每天固定時間備份,所以算完成。
apt -y install mariadb ## 安裝Mariadb
sudo mysql_secure_installation ## 初始化安全設定,刪除預設執中不必要的設定
mysql -u root -p ## 登入 mariadb
>> CREATE USER '資料庫使用者名稱'@'localhost' IDENTIFIED BY '密碼'; ## 用這個使用者來取代 root 操作資料庫
>> GRANT ALL PRIVILEGES ON *.* TO '資料庫使用者名稱'@'localhost' WITH GRANT OPTION; ## 賦予該使用者最高權限
>> FLUSH PRIVILEGES; ## 套用權限
>> exit; ##離開 mariadb
mysql -u [資料庫使用者名稱] -p ## 用新[資料庫使用者名稱] 重新登入 mariadb
>> DROP USER 'root'@'主機名稱'; ##刪除 root
>> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ## 建立 wordpress 資料庫
>> exit; ##離開 mariadb
資料庫刪除 root 部份,主要也是因為 安全考量。
mysql -u [資料庫使用者名稱] -p [WordPress資料庫名稱] < [備份檔案名稱.sql]
正常來說,這樣資料庫便已完成搬家。
底下補充遇到一些問題,以及如何解決。
- [資料庫使用者名稱] 密碼忘記了
- 放置 mysql 的空間滿了
- /home/var/lib/mysql (來源目錄):
- /var/lib/mysql (掛載點):
- none (檔案系統類型):
- bind (掛載選項):
- 0 (dump 備份選項):
- 0 (fsck 檢查順序):
sudo systemctl stop mairadb.servicce ## 先停止 mariadb 運作
sudo mysqld_safe --skip-grant-tables --skip-networking & ## 以安全模式啟動 mariadb
mysql -u [資料庫使用者名稱] -p ## 以無密碼方式登入資料庫
>> ALTER USER '[資料庫使用者名稱]'@'localhost' IDENTIFIED BY '[新密碼]'; ## 更改新密碼
>> FLUSH PRIVILEGES; ## 套用變動
>> exit; ## 登出資料庫
sudo kill -9 $(ps aux | grep mysql | grep -v grep | awk '{print $2}') ## 停止mariadb
sudo systemctl start mariadb ## mariadb 啟動
mysql 資料庫的硬碟空間滿了,不夠用了!
最快的解決方式,便是搬到足夠空間的目錄底下,例如: /home/var/lib/mysql 。
sudo systemctl stop mairadb.servicce ## 先停止 mariadb 運作
sudo mkdir -p /home/var/lib/mysql ## 建立目錄
sudo chown -Rf mysql:mysql /home/var/lib/mysql ## 設定目錄使用者與權限
sudo chmod -Rf 700 /home/var/lib/mysql
sudo rsync -avz /var/lib/mysql /home/var/lib/ ## 搬移目錄
sudo ls -l /home/var/lib/ ## 檢查目錄權限
將以下加入 /etc/fstab ,然後掛載起來
/home/var/lib/mysql /var/lib/mysql none bind 0 0
sudo systemctl daemon-reload
sudo mount -a
sudo systemctl start mariadb ## mariadb 啟動
以上 /etc/fstab 作法,目的是讓系統在開機時自動執行目錄掛載。
各欄位的詳細意義如下:
資料實際存放的新位置。
系統與應用程式(例如:Mariadb)預期要讀取資料的原始舊位置。
因為是將目錄掛載到另一個目錄,而非掛載實際的磁碟分割區,所以不適用特定的檔案系統格式(如 ext4),填寫 none。
這是這行設定的核心關鍵。bind 的作用是將一個已經存在於檔案系統中的目錄(子樹)「鏡像」或「綁定」到另一個掛載點上。
為何不用軟連結 (ln -s)?
軟連結只是一個指標檔案,某些安全機制(如 vsftpd 的 chroot、AppArmor、SELinux)會拒絕或無法正確解析軟連結所指向的實際路徑。而 bind mount 在作業系統核心層級會讓這兩個路徑看起來完全等同於同一個實體目錄,完美欺騙程式,解決權限阻擋問題。
設定為 0 表示不被 dump 指令備份。
設定為 0 表示開機時不需要進行檔案系統檢查。
簡單來說,這些設定就是讓 Mariadb 以為它還是在讀寫 /var/lib/mysql,但實際上資料是寫入 /home 的新目錄中,且能安全避開系統的軟連結限制。