Learning Objectives
- 說明 MySQL 伺服器(mysqld)與用戶端(mysql)的分工
- 在 Ubuntu 24.04 用 apt 安裝 mysql-server,並查看、啟動、停止 mysql 服務
- 說明 Ubuntu 上 root 為什麼用 sudo mysql 登入(auth_socket),並執行 mysql_secure_installation
- 用 CREATE USER 與 GRANT 建立有密碼的管理帳號,指出 MySQL 8 已移除的舊語法
- 在 mysql 用戶端使用分號、\G、\c、\q,並用 SELECT VERSION()、CURRENT_USER() 確認連線
伺服器與用戶端
MySQL 是一套主從式(client-server)的資料庫系統,分成兩個部分:
| 程式 | 角色 | 說明 |
|---|---|---|
mysqld |
伺服器 | 在背景持續執行,負責保存資料、處理查詢、檢查帳號權限。Ubuntu 上以系統服務 mysql 的形式執行 |
mysql |
用戶端 | 命令列工具,把你輸入的 SQL 送給伺服器,再把結果印成表格。也叫做 MySQL monitor |
除了 mysql 命令列,MySQL Workbench、phpMyAdmin、Python 的 PyMySQL 也都是用戶端:它們透過網路或本機的 socket 連到同一個伺服器。
所以「安裝 MySQL」通常指安裝伺服器,連帶裝上命令列用戶端;「登入 MySQL」指用某個帳號從用戶端連上伺服器。
本課以 Ubuntu 24.04 的 mysql-server 套件為主(MySQL 8.0),Windows 的安裝方式放在後面補充。
本軌其他課的範例,輸出都比照這個環境。
原課程的 XAMPP 與現在的做法
早期的課程(MySQL 4.1/5 時代)常用 XAMPP:一個安裝檔同時裝好 Apache、PHP 與 MySQL,root 預設沒有密碼,
mysql -u root 直接就能登入。這個做法現在不建議:
- XAMPP 從 2015 年起附的資料庫是 MariaDB,不是 MySQL。兩者源自同一份程式碼,但 8.0 之後的帳號管理、預設驗證方式、資料字典都已經不同
- root 沒有密碼、還有不需帳號就能登入的匿名帳號,只適合單機練習,不適合放在網路上
- 課程原本的
SET PASSWORD … = PASSWORD('…')、GRANT … IDENTIFIED BY '…'在 MySQL 8.0 都會出現語法錯誤(下面會實際執行看看)
Linux 伺服器上的標準做法是用作業系統的套件管理程式安裝。Ubuntu 24.04 的套件庫提供 MySQL 8.0,
指令是 apt install mysql-server;裝好之後就是系統服務,開機自動啟動,也會跟著系統更新收到安全性修補。
導覽:在 Ubuntu 24.04 安裝 MySQL Server
以下指令在 Ubuntu 24.04 的終端機執行(雲端主機或虛擬機都可以),提示字元 $ 不用輸入。輸出很長的地方只節錄重點,「…」代表省略的內容;版本號、PID、時間等數字是示意,實際以你的主機為準。
-
1
更新套件清單並安裝 mysql-server
apt update先取得最新的套件清單,apt install -y mysql-server安裝伺服器。它會連帶安裝mysql-client-8.0(命令列用戶端)等相依套件。sudo表示以系統管理員權限執行。 -
2
確認版本
mysql --version印出用戶端的版本。0ubuntu0.24.04.1是 Ubuntu 套件自己的修訂編號(示意),前面的8.0.44才是 MySQL 的版本。 -
3
查看服務狀態
伺服器以系統服務
mysql執行。systemctl status的重點是 Active: active (running)(正在執行)與 enabled(開機自動啟動)。按q離開。 -
4
停止、啟動、重新啟動
修改設定檔(第 12 課)之後要重新啟動服務才會生效。這些指令成功時沒有輸出,可以再用
status確認。is-active只印出一個字,適合寫在腳本裡判斷。
root 用 sudo mysql 登入:auth_socket
Ubuntu 的 mysql-server 套件安裝時不會替 root 設定密碼,而是讓 root@localhost 使用 auth_socket 驗證方式:
- 連線時,伺服器透過本機的 Unix socket 查詢「發出連線的作業系統使用者是誰」
- 作業系統使用者是
root(也就是用了sudo),就允許以 MySQL 的 root 登入,不必輸入密碼 - 反過來,用一般帳號執行
mysql -u root -p,輸入什麼密碼都會被拒絕:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
這樣做的好處是 root 沒有密碼可以被猜,只有能使用 sudo 的人才能管理資料庫。所以日常管理有兩種選擇:
- 需要 root 時用
sudo mysql - 另外建立一個有密碼的管理帳號(下面的
admin),給 MySQL Workbench 這類需要帳號密碼的工具使用
帳號寫成 '帳號'@'主機':'root'@'localhost' 只能從這台主機連線;'%' 代表任何主機。
同一個名稱、不同主機是不同的帳號,可以有不同的密碼與權限。
其他平台(Windows 的 MySQL Installer、Oracle 官方的 Linux 套件)則是在安裝時要你設定 root 密碼,root 用一般的密碼驗證。
導覽:第一次登入與 mysql_secure_installation
先用 sudo mysql 登入看看,再執行安全設定。
-
1
用 sudo mysql 登入
出現歡迎訊息與
mysql>提示字元就是登入成功。歡迎訊息第一行提醒:敘述以;或\g結束。connection id是伺服器替這條連線編的號碼。 -
2
確認目前的帳號與驗證方式
CURRENT_USER()是伺服器認定的帳號;mysql.user表格記錄所有帳號,plugin欄位是驗證方式。root 是auth_socket;debian-sys-maint是 Ubuntu 套件維護用的帳號,mysql.開頭的是伺服器內部帳號,都不要刪除。 -
3
執行 mysql_secure_installation
這支程式以問答的方式完成幾項基本的安全設定:密碼強度檢查元件(VALIDATE PASSWORD)、移除匿名帳號、禁止 root 從遠端登入、刪除
test資料庫,最後重新載入權限表。原課程用DELETE FROM user WHERE User=''手動刪匿名帳號,現在交給這支程式或DROP USER。密碼強度選
1(MEDIUM):至少 8 個字元,含數字、大小寫字母與符號。因為 root 使用 auth_socket,Ubuntu 版的程式會略過設定 root 密碼這一步。其餘問題都回答y。
建立有密碼的管理帳號
MySQL 8.0 建立帳號分成兩步:先 CREATE USER 建立帳號與密碼,再 GRANT 授予權限。
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'Uedu#2026pass';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
ON *.*是所有資料庫的所有表格;WITH GRANT OPTION讓 admin 也能把權限授予別人。這是和 root 同等級的管理帳號,密碼要夠強- 密碼不會以原文保存:
mysql.user的authentication_string欄位存的是雜湊值(MySQL 5.7 以前的欄位名稱是Password) - 新帳號預設用
caching_sha2_password驗證(MySQL 8.0 的預設值,取代舊的mysql_native_password) - 用
CREATE USER、GRANT、ALTER USER修改帳號,權限立刻生效,不需要FLUSH PRIVILEGES。 只有直接用 INSERT、UPDATE、DELETE 修改mysql資料庫的表格時才需要它,而這種做法本身就不建議
第 11 課會再詳細介紹權限層級,這裡先建立一個能用密碼登入的管理帳號。
建立 admin 帳號,再用它登入
右邊會顯示 mysql.user 表格,CREATE USER 新增的那一列標成綠色。第 5 行的 -- @user admin@localhost 是播放器的指令,代表換成 admin 帳號連線;在真實環境要先 \q 離開,再用 mysql -u admin -p 重新登入。
這裡的伺服器是模擬環境:root 顯示為 caching_sha2_password,真實的 Ubuntu 上是 auth_socket,也還會有 debian-sys-maint 帳號;mysql 資料庫只模擬了 user、db、tables_priv、columns_priv 四張表格。
導覽:用 admin 帳號登入
在 Ubuntu 上實際操作一次。
-
1
建立帳號
用
sudo mysql登入後執行。啟用了 MEDIUM 密碼強度時,太簡單的密碼會被拒絕(ERROR 1819),換一個符合規則的密碼即可。 -
2
用密碼登入
-u是帳號,-p表示要輸入密碼。-p後面不接密碼,程式會提示Enter password:,輸入時畫面不會顯示。也可以寫成-pUedu#2026pass(-p和密碼之間不能有空格),但密碼會留在指令紀錄裡,不建議。連到另一台主機加-h 主機名稱或 IP。
MySQL 8 已移除的舊語法
| 原課程的寫法 | MySQL 8.0 的寫法 | 說明 |
|---|---|---|
XAMPP,mysql -u root 不用密碼 |
apt install mysql-server,sudo mysql |
Ubuntu 的 root 用 auth_socket |
SET PASSWORD FOR root@localhost = PASSWORD('…'); |
ALTER USER 'admin'@'localhost' IDENTIFIED BY '…'; |
PASSWORD() 函式在 8.0 移除。SET PASSWORD FOR … = '…'(直接寫密碼字串)仍可使用 |
GRANT ALL ON *.* TO fred@localhost IDENTIFIED BY '…'; |
先 CREATE USER … IDENTIFIED BY '…',再 GRANT |
8.0 的 GRANT 不能設定密碼,也不能順便建立帳號 |
DELETE FROM user WHERE User=''; 加 FLUSH PRIVILEGES |
DROP USER ''@'localhost'; |
匿名帳號的名稱是空字串;用 DROP USER 會一併移除各層級的權限 |
在 Ubuntu 上不建議替 root 改用密碼登入,需要密碼登入時建立 admin 這類帳號即可。
舊語法的錯誤與現在的寫法
執行前已經建好 admin 帳號,也建了一個匿名帳號 ''@'localhost'(使用者名稱是空字串),模擬舊版安裝留下來的狀態。第 1 行是原課程的寫法,會出現 ERROR 1064 語法錯誤;後面依序改密碼、找出匿名帳號、刪除它。
想一想:安裝與帳號
在 Ubuntu 24.04 剛裝好 mysql-server,用一般帳號執行 mysql -u root -p 怎麼輸入都登不進去,sudo mysql 卻可以直接登入。原因是什麼?
在 MySQL 8.0 執行原課程的這一行,會得到什麼?
GRANT ALL ON *.* TO 'fred'@'localhost' IDENTIFIED BY 'Fred#2026pw';
用 CREATE USER 建立帳號、GRANT 授予權限之後,還需要執行 FLUSH PRIVILEGES 嗎?
mysql 用戶端的基本操作
在 mysql> 提示字元下輸入的內容分成兩種:SQL 敘述送到伺服器執行;用戶端指令由 mysql 程式自己處理。
| 輸入 | 作用 |
|---|---|
; 或 \g |
結束一個 SQL 敘述並送出。沒打分號就按 Enter,提示字元會變成 ->,表示敘述還沒結束 |
\G |
送出敘述,結果改成直向顯示:每一列拆成好幾行,一行一個欄位。欄位很多、表格太寬時好用 |
\c |
取消目前正在輸入、還沒送出的敘述 |
\q、quit、exit |
離開 mysql,印出 Bye |
\h、help |
顯示用戶端指令的說明 |
提示字元會提醒你目前的狀態:'> 表示單引號還沒配對,"> 是雙引號,-> 是敘述還沒結束。
打錯而卡在這些提示字元時,先補上缺的引號,再用 \c 取消。
登入後先確認自己連到哪裡、是誰:
SELECT VERSION(); -- 伺服器的版本
SELECT CURRENT_USER(); -- 伺服器認定的帳號(帳號@主機)
SELECT USER(); -- 用戶端登入時提供的帳號與來源主機
SHOW DATABASES; -- 這個帳號看得到的資料庫
SQL 的關鍵字不分大小寫,select version(); 也可以,本軌一律把關鍵字寫成大寫,方便和表格、欄位名稱區分。
導覽:多行輸入、取消與直向顯示
用 mysql -u admin -p 登入後試試看。
-
1
一個敘述寫成好幾行
沒有分號就按 Enter,mysql 只會換行並顯示
->,等你繼續輸入。打上分號才會送出。 -
2
用 \c 取消
寫到一半發現寫錯了,輸入
\c就丟掉這個敘述,回到mysql>,不會送到伺服器。 -
3
用 \G 直向顯示,再用 \q 離開
把結尾的分號換成
\G,同一個查詢會改成一欄一行。
確認連線的幾個查詢
這些查詢沒有讀取任何表格,所以右邊沒有表格。注意最後一個用 \G 結尾,結果改成直向顯示。模擬環境的 VERSION() 是 8.0.44,Ubuntu 的套件會在後面加上 -0ubuntu0.24.04.1 這類修訂編號;NOW() 固定為 2026-09-01 09:00:00(伺服器時區 UTC)。
想一想:用戶端操作
輸入 SELECT CURRENT_USER() 後忘了打分號就按 Enter,畫面出現 ->。這代表什麼?
用 mysql -u fred -p 登入後執行 SELECT CURRENT_USER();,結果是什麼?(帳號建立時寫的是 'fred'@'localhost')
mysql -u admin -p Uedu#2026pass 這個指令有什麼問題?
補充:在 Windows 安裝
Windows 上的 MySQL 8.0 可以從 MySQL 官方網站下載 MySQL Installer 安裝。安裝時:
- 安裝類型選 Server only,或依需要加上 MySQL Workbench
- 驗證方式選預設的 Use Strong Password Encryption(caching_sha2_password)
- 設定 root 密碼,也可以在這一步新增其他帳號
- 設定成 Windows 服務,預設名稱是
MySQL80,開機自動啟動
程式預設裝在 C:\Program Files\MySQL\MySQL Server 8.0\bin,資料放在 C:\ProgramData\MySQL\MySQL Server 8.0\Data。
在「命令提示字元」切換到 bin 資料夾,或把它加進 PATH 之後,用 mysql -u root -p 輸入安裝時設定的密碼登入。
服務可以在「服務」管理工具裡啟動、停止,或以系統管理員身分執行 net stop MySQL80、net start MySQL80。
Windows 版和 Ubuntu 版有幾個差別要注意:root 用密碼驗證(不是 auth_socket);表格名稱不分大小寫(lower_case_table_names=1)。
本軌以 Ubuntu 為準:表格名稱區分大小寫,employeeSkills 不能寫成 employeeskills。
動手寫:建立 fred 帳號
請建立帳號 'fred'@'localhost',密碼用 Fred#2026pw,授予 employee 資料庫的所有權限(GRANT ALL PRIVILEGES ON employee.* …),再分別查詢 mysql.user 和 mysql.db 確認。比較兩個查詢的 Select_priv:權限只限 employee 資料庫,所以記在 mysql.db,mysql.user 的全域權限仍是 N。
重點整理
| 工作 | Ubuntu 24.04(MySQL 8.0) |
|---|---|
| 安裝 | sudo apt install mysql-server |
| 服務 | sudo systemctl status/start/stop/restart mysql |
| root 登入 | sudo mysql(auth_socket,不用密碼) |
| 安全設定 | sudo mysql_secure_installation |
| 建立帳號 | CREATE USER '帳號'@'主機' IDENTIFIED BY '密碼'; 再 GRANT … |
| 修改密碼 | ALTER USER '帳號'@'主機' IDENTIFIED BY '新密碼'; |
| 刪除匿名帳號 | DROP USER ''@'localhost'; |
| 用密碼登入 | mysql -u 帳號 -p,另一台主機加 -h 主機 |
- 已移除:
PASSWORD()函式、GRANT … IDENTIFIED BY;XAMPP 附的是 MariaDB - 用戶端:
;送出、\G直向顯示、\c取消、\q離開
下一課登入伺服器四處看看:有哪些資料庫、表格長什麼樣子。