在 Ubuntu 16.04 裡完整移除 MySQL 或 MariaDB 資料庫並恢復資料 | WordPress 技巧

在 Ubuntu 16.04 裡完整移除 MySQL 或 MariaDB 資料庫並恢復資料 | WordPress 技巧

其實這不算是 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

這裡會跑的有點久,然後他會要求你設定資料庫的密碼,我建議設定一下。

remove-mysql-mariadb-completely-and-recover
作者ヤンヤン編輯於 2018 / 3 / 26

確認密碼。

remove-mysql-mariadb-completely-and-recover
作者ヤンヤン編輯於 2018 / 3 / 26

之後再跑一陣子後,他會問你說「是否要設定 phpmyadmin」,這時請選擇「No」。

remove-mysql-mariadb-completely-and-recover
作者ヤンヤン編輯於 2018 / 3 / 26

之後還要跑一陣子才會完成。

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