MySQL 應該是當代最多人用的資料庫系統,為什麼不是 SQLite 呢?因為 SQLite 不是「系統」。

這篇是 MySQL 的安裝筆記,以及安裝後的一些設定,主要是初始設定以及 MySQL 著名的歷史問題:UTF-8 編碼問題。

安裝

MySQL 官方的安裝文件就有提到多種安裝方式,最簡單的應該就是直接從 Ubuntu 內建的 APT 庫安裝了,只要一行:

> sudo apt-get install mysql-server mysql-client

它會安裝 MySQL、MySQL CLI 工具、設定好服務,只要一行。

安裝完可以確認一下服務的狀態:

> systemctl status mysql

如果亮綠燈就是沒問題。

安裝後配置

安裝後要做一些基礎配置,首先是設定 MySQL root 帳號的密碼。

用 root 帳號進 MySQL,幫 root 設個密碼:

> sudo mysql

進入 MySQL 後就可以改密碼囉!

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'root-password';

改完要記得退出。

這個步驟是參考〈Securing the Initial MySQL Account〉,看起來很長,其實重點就上面那行指令。

有密碼之後,就來跑其他基礎配置吧,這些工作可以用 MySQL 內附的 mysql_secure_installation 命令代勞。

mysql_secure_installation 執行起來:

> mysql_secure_installation

執行後會有一系列的問答,它會根據我們的答案為我們做出相對的配置,請根據自身的實際需求回答即可。

完整的 Securing the Initial MySQL Account 文件為〈mysql_secure_installation — Improve MySQL Installation Security

這裡我的系統是 Ubuntu + MySQL,如果是 CentOS + MariaDB 的話可以另行參考早期這篇〈CentOS 裝 MariaDB 10

MySQL 的 UTF-8 問題

不論是 MySQL 還是 MariaDB,這兩兄弟都有遺傳自 MySQL 的老問題,utf8utf8mb3 是假的 UTF-8,utf8mb4 才是真的 UTF-8。

這裡所謂的「真」、「假」只是騙人進來的農場標題,總之如果沒有改成 utf8mb4 的話,可能會遇到缺字。

修改 MySQL 配置,在 /etc/mysql/mysql.conf.d/mysql.cnf,這個檔案應該是空白的,在此添加以下內容:

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

編輯 MySQL server 配置,在 /etc/mysql/mysql.conf.d/mysqld.cnf,預設內容很多,小心修改。

添加下面內容:

[mysqld]
character-set-server = utf8mb4
character-set-client-handshake = FALSE

上文的幾個檔案為 Ubuntu + MySQL 配置路徑,如果是 CentOS + MariaDB 的話請看下面:

改 /etc/opt/rh/rh-mariadb102/my.cnf.d/mariadb-server.cnf:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
character-set-client-handshake = FALSE

[mariadb]
character_set_server = utf8mb4
character_set_client = utf8mb4

改完之後,重啟服務:

> sudo systemctl restart mysql

進去 MySQL 看一下現在的編碼:

SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collation%';

會看到像這樣滿滿的 utf8mb4

+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
| character_sets_dir       |         |
+--------------------------+---------+

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

其中 character_set_system 只能是 utf8utf8mb3,不能改。

以上參考文章:

檢視 database、table、column 的編碼

同場加映檢視 database、table、column 的編碼。

檢視 database 編碼:

SELECT default_character_set_name
FROM information_schema.SCHEMATA 
WHERE schema_name = "schemaname";

檢視 table 編碼:

SELECT CCSA.character_set_name
FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
    AND T.table_schema = "schemaname"
    AND T.table_name = "tablename";

檢視 column 編碼:

SELECT character_set_name
FROM information_schema.`COLUMNS` 
WHERE table_schema = "schemaname"
    AND table_name = "tablename"
    AND column_name = "columnname";

以上來自〈How do I see what character set a MySQL database / table / column is?〉。

開放外部連入

剛裝完的 MySQL 只接受本機連線,想要開放外部連入的話,一樣去編輯 mysqld.cnf,找到關鍵處:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
mysqlx-bind-address     = 127.0.0.1

在目前的設定中,bind-address 表示僅接受來自 127.0.0.1(也就是本機)的連線,要開放外連可以改為 0.0.0.0。

下一個設定是給 MySQL X plugin 用的,可以無視。

改完設定記得重啟 MySQL 服務,重啟之後用別台機器連連看。

帳號管理

設定認證機制

由於安全的考量,MySQL 預設以 SHA 做某種認證加密,想要改回簡約的原生密碼的話,在 /etc/mysql/mysql.conf.d/mysqld.cnf 添加以下設定:

# default_authentication_plugin = mysql_native_password # 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead.
authentication_policy = mysql_native_password,,

這項設定的值其實有三個,以 , 逗號分隔,第一格是預設的密碼認證機制,第二格或第三格可以是第三方的認證外掛,這邊的例子只指定了第一格,也就是原生的密碼認證,並且沒有第二、三格,也就是沒有多重因素認證。

改完重啟服務就好囉!至於註解掉的文字看看就好,可以省略。

開 MySQL 帳號

一般不會用 root 帳號做事,會依照目的另外開帳號。

先用 root 登入 MySQL,開新帳號:

CREATE USER 'ap1'@'192.168.0.3' IDENTIFIED WITH mysql_native_password BY 'ap-password';

則帳號 ap1 就開好啦,而且它只能從 192.168.0.3 連入,否則會被拒絕。

如果想要自由連入,用百分比符號表示:

CREATE USER 'ap2'@'%' IDENTIFIED WITH mysql_native_password BY 'ap-password';

看有沒有建成功:

SELECT Host, User FROM mysql.user;

剛建的新帳號已經能登入了,但還沒有權限,可以賦予它們某些資料庫的權限,以 ap2 為例:

GRANT ALL ON ap2db.* TO 'ap2'@'%';

最後一樣記得測一下。

改密碼

ALTER USER 'ap1'@'192.168.0.3' IDENTIFIED WITH mysql_native_password BY 'new-ap-password';

問題排查

如果有各種疑難雜症,第一是先檢查配置文件,其次是看 log,在配置文件中有這麼一段:

# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log

這就是錯誤 log 的路徑,問題都會記錄在這裡,再根據此處的描述去調查囉。

一些常用的 MySQL 周邊工具

最後推薦兩個常搭配 MySQL / MariaDB 使用的周邊工具

其中,Adminer 是可以取代笨重的 phpMyAdmin 的聖品。