其實這不算是 WordPress 的技巧拉,只是大家在用 WordPress 時很常使用 MySQL 或是 MariaDB 資料庫軟體作為網站資料庫。但是如果今天你不小心把資料庫軟體玩壞,或是出一大堆令人問號的問題時,要如何快速讓資料庫軟體恢復正常呢?答案就是打掉重練。
通常遇到的問題是權限的問題,例如密碼忘記等等,但這個到是不需要打掉重練,但如果是一直你解不出來的問題,又希望資料庫軟體可以快點恢復正常…,那就只有重練一途了。
聽到這裡可能覺得很可怕,但其實不可怕,而且方法很簡單,只要下幾行指令就可以了。前提是,當然要記得先備份你所有的資料庫內容,這樣之後還可以還原回去。
我示範操作的軟體是 MariaDB 10.2 版,是最新版,系統則是 Ubuntu 16.04。但注意,MariaDB 在操作指令時,根 MySQL 是一樣的軟體名稱,在操作指令時不用把 mysql 換成 mariadb,而 MySQL 或是 MariaDB 在 Ubuntu 裡面執行時,軟體名稱固定用「mysql」而不是「mysqld」。
至於為什麼不要用 MySQL,原因我有在這一篇文章裡面說明過,可以參考看看。
確認釋法要打掉重練 MySQL 或 MariaDB
在真的打掉重練之前,先把在你操作 MySQL 或 MariaDB 時他在終端機輸出的錯誤訊息拿去 Google 搜尋一次。通常遇到的錯誤會是「ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES/NO)」。發生的時機點通常是資料庫太多人讀取(線上有很多人同時在逛你的網頁)造成超出機器負載,結果資料庫就當機了。
不過發生的原因還有很多種,而且我不會解釋,但是我這裡提供解法。
重新啟動 MySQL 或 MariaDB
STEP 1
先關掉 MySQL 或 MariaDB。
sudo systemctl disable mysql sudo service mysql stop
STEP 2
再啟動一次 MySQL 或 MariaDB。
sudo service mysql start sudo systemctl enable mysql
STEP 3
接著測試是否可以登入進去 MySQL 或 MariaDB。
sudo mysql -u root -p
如果你有設定 root 的密碼,請記得輸入,不然就是直接按下「Enter」。若成功的話應該會是以下訊息。
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4670 Server version: 10.2.14-MariaDB-10.2.14+maria~xenial-log mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
不行的話請換下個步驟。
強制使用安全模式進入 MySQL 或 MariaDB
如果還是行不通,我們先嘗試把資料庫裡面所有的東西都備份起來吧,以防萬一。
不過你要知道你的 WordPress 在你的資料庫軟體裡面建立的資料表名稱叫做什麼,以及你在資料庫裡面的帳號密碼名稱是什麼,這個可以去「wp-config.php」檔案裡面查閱。
// ** MySQL 設定 - 您可以從主機服務提供商獲取相關資訊。 ** // /** WordPress 的資料庫名稱,請更改 "database_name_here" */ define('DB_NAME', '資料庫裡的資料表名稱'); /** MySQL 資料庫使用者名稱,請更改 "username_here" */ define('DB_USER', '你的資料庫帳戶名稱'); /** MySQL 資料庫密碼,請更改 "password_here" */ define('DB_PASSWORD', '你的資料庫帳戶密碼');
但如果連這個都不知道也不用傷心,我們就直接把整個資料庫裡面的所有表格都備份起來就可以了。然後嘗試修復帳戶的密碼。
STEP 1
首先先用前面的步驟關閉 MySQL 或 MariaDB,但不要再啟動了。首先我們用安全模式登入 MySQL 或 MariaDB。
sudo mysqld_safe --skip-grant-tables --skip-networking &
STEP 2
之後我們開始備份你的資料庫。如果是整個資料庫備份下來。我推薦這個方式。
sudo mysqldump -u root --all-databases > /[你的資料庫備份位置]/[你的資料庫備份檔案名稱].sql
如果是備份其中的某個表格。
sudo mysqldump -u root --databases [你要備份的資料表名稱] > /[你的資料庫備份位置]/[你的資料庫備份檔案名稱].sql
這裡因為「-p」選項會強制要求輸入密碼,所以不加上。而注意這裡的「>」不要打錯了,這代表著進行方向。
注意「.sql」副檔名是固定的,請不要改動。
這時如果還是出現類似的錯誤「ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES/NO)」
那我們就進行密碼重設的階段,再備份資料。
STEP 3
在安全模式下用「root」登入 MySQL 或 MariaDB。
sudo mysql -u root
STEP 4
輸入以下指令允許改新密碼。
MariaDB [(none)]> FLUSH PRIVILEGES;
STEP 5
輸入以下指令改「root」的新密碼。
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '[新密碼]';
不過如果你是老一點的版本,MySQL 5.7.5 和 MariaDB 10.1.20 之前的話。
MariaDB [(none)]> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('[新密碼]');
萬一無法成功,沒有跳出「Query OK, 0 rows affected」等等訊息的話,請換這個。
MariaDB [(none)]> UPDATE mysql.user SET authentication_string = PASSWORD('[新密碼]') WHERE User = 'root' AND Host = 'localhost';
成功的話要跳出這個訊息。
Query OK, 0 rows affected
STEP 6
重新啟動 MySQL 或 MariaDB。
sudo systemctl disable mysql sudo service mysql stop sudo service mysql start sudo systemctl enable mysql
之後再重新進行備份。
另外,如果走完以上步驟後還是不成功,請嘗試以下方式。
STEP 7
然後授權帳戶可以使用這個資料表。
MariaDB [(none)]> GRANT all ON *.* TO root@'localhost' IDENTIFIED BY '[你的 root 密碼]';
如果以上有點搞混的話,請私訊粉絲團沒有關係,或在下面留言讓我看看發生什麼問題。
強制重新安裝 MySQL 或 MariaDB
如果以上解法都不行,但資料庫檔案已經有的話,那建議直接重裝 MySQL 或 MariaDB 最快。
STEP 1
刪除光你所有的 MySQL 或 MariaDB 檔案。
sudo rm -r /etc/mysql/mysql.conf.d/ sudo killall mysqld sudo rm -rf /var/lib/mysql sudo apt-get purge mysql* mariadb* -y sudo rm -rf /etc/mysql sudo rm -rf /var/lib/mysql sudo rm -rf /var/lib/mysql-files sudo rm -rf /var/lib/mysql-keyring sudo apt-get purge mysql-server mariadb-server* mysql-common -y sudo apt-get autoremove sudo apt-get update
STEP 2
之後重新安裝 MySQL 或 MariaDB。我會建議安裝最新的,而套件庫來源在他們的官網都找得到,台灣也有設分點,所以不用擔心下載安裝會太久。這裡我推薦使用 MariaDB。
套件庫來源可以去這裡看看。
請參考: 1. MariaDB - Setting up MariaDB Repositories - MariaDB
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.2/ubuntu xenial main'
這樣應該會進行下載金鑰的動作,並在套件庫新增 MariaDB 的套件來源。
Executing: /tmp/tmp.FMXwFOobSh/gpg.1.sh --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 gpg: requesting key C74CD1D8 from hkp server keyserver.ubuntu.com gpg: key C74CD1D8: public key "MariaDB Signing Key <signing-key@mariadb.org>" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)
STEP 3
之後下指令安裝。
sudo apt-get install phpmyadmin mariadb-server mariadb-client -y
這裡會跑的有點久,然後他會要求你設定資料庫的密碼,我建議設定一下。
確認密碼。
之後再跑一陣子後,他會問你說「是否要設定 phpmyadmin」,這時請選擇「No」。
之後還要跑一陣子才會完成。
Preparing to unpack .../php-tcpdf_6.0.093+dfsg-1ubuntu1_all.deb ... Unpacking php-tcpdf (6.0.093+dfsg-1ubuntu1) ... Selecting previously unselected package phpmyadmin. … Setting up mariadb-server-core-10.2 (10.2.13+maria~xenial) ... Setting up socat (1.7.3.1-1) ... Setting up mariadb-server-10.2 (10.2.13+maria~xenial) ... 2018-03-26 20:46:04 139709376772288 [Note] /usr/sbin/mysqld (mysqld 10.2.13-MariaDB-10.2.13+maria~xenial) starting as process 22676 ... 2018-03-26 20:46:04 139709376772288 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins … Creating config file /etc/php/7.0/mods-available/pdo.ini with new version … Processing triggers for libapache2-mod-php7.0 (7.0.28-0ubuntu0.16.04.1) ...
STEP 4
最後記得要幫資料庫新建你 Wodrpess 設定檔案「wp-config.php」裡面所寫的資料庫帳號登入名稱和密碼,當然你可以自己改成別的,但要記得改你的 WordPress 設定檔案,重點是要和資料庫符合就對了。
sudo mysql -u root
STEP 5
登入之後新建帳戶和密碼,自己要記得。
MariaDB [(none)]> CREATE DATABASE [資料表名稱,要用英文。記得你原本用什麼就用什麼,因為備份檔案也用同樣名稱]; MariaDB [(none)]> GRANT ALL PRIVILEGES ON [資料表名稱,要用英文].* TO '[新帳戶名稱]'@'localhost' IDENTIFIED BY '[新帳戶名稱的新密碼]'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> EXIT;
STEP 6
接著用你原有的備份資料庫檔案還原回去到你的資料庫裡面。如果是整個備份檔案。
sudo mysql -u root -p < /[你的資料庫備份位置]/[你的資料庫備份檔案名稱].sql
如果是單一資料表復原。
sudo mysql -u root -p [資料表名稱] < /[你的資料庫備份位置]/[你的資料庫備份檔案名稱].sql
注意「<」不要打錯了,這個就代表往哪個方向。 到這裡就告一段落了,你的網站應該資料都回來了才對。
硬碟空間滿
這個也會導致 MySQL 和 MariaDB 的啟動失敗,如果你在啟動 MySQL 或 MariaDB 時出錯,用「journalctl -xe」指令查看狀況,出現
No space left on device mysql...
之類的錯誤訊息,基本上是分割空間已經沒有多個空間使用,只能請你加大硬碟了。
參考資料: 1. MySQL 指令、語法及管理 @ 來吧~~~電腦 :: 隨意窩 Xuite日誌 2. 解決 MYSQL 登入時,ERROR 1045 (28000) using password: NO 的方法 3. sql - MySQL Error: : 'Access denied for user 'root'@'localhost' - Stack Overflow 4. MySql 修改 root 密碼必勝方法 - Soul & Shell Blog 5. 12.04 - How to run mysql command from terminal? - Ask Ubuntu 6. sql - MySQL Won't let User Login: Error 1524 - Stack Overflow 7. Can't reset MySQL (MariaDB) root password - Super User 8. mysql - Mariadb not working just after install on Ubuntu 16.04 - Ask Ubuntu 9. How To Reset Your MySQL or MariaDB Root Password | DigitalOcean