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 的老問題,utf8
或 utf8mb3
是假的 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 只能是 utf8
或 utf8mb3
,不能改。
以上參考文章:
檢視 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 的聖品。