MariaDB 是一個可靠的、高性能的、功能全面的資料庫,旨在為用戶提供長期免費、向下兼容能直接替代MySQL的資料庫服務。自2013年起,MariaDB就被Arch Linux當作官方默認的MySQL實現[1]。
安裝
MariaDB 是 Arch Linux 中 MySQL 的 默認實現,由 mariadb包 軟體包提供。
- 如果資料庫 (位於
/var/lib/mysql
) 運行在 Btrfs 分區之上, 你應當在創建資料庫之前禁用 Copy-on-Write 特性。 - 如果資料庫運行在 ZFS 分區之上, 你應該在創建資料庫之前參閱 ZFS#Databases 。
安裝 mariadb包 軟體包之後,你必須在啟動 mariadb.service
之前運行下面這條命令:
# mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
然後 enable 或者 start mariadb.service
。
/var/lib/mysql
,需要在 /etc/my.cnf.d/server.cnf
文件的 [mysqld]
部分設置 datadir=<數據目錄>
為了簡化管理,你可能需要安裝一個 前端工具。
配置
默認情況下,root
用戶和運行伺服器的用戶都可以管理資料庫。
要管理伺服器,可以以運行伺服器的用戶身份運行 mariadb:
[mysql]$ mariadb
或者以 root 身份運行:
# mariadb
添加用戶
以下是創建一個密碼為'some_pass'的'monty'用戶的示例,並賦予 mydb 完全操作權限:
$ mariadb -u root -p
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass'; MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost'; MariaDB> quit
配置文件
MariaDB 配置選項會按照以下順序讀取配置文件(根據 mysqld --help --verbose | head -10
的輸出):
/etc/my.cnf /etc/my.cnf.d/ ~/.my.cnf
在 /etc/my.cnf.d/
中創建一個以 .cnf 為擴展名的配置文件,以確保升級時保留您的配置。
根據您想要進行的更改範圍(系統範圍、僅用戶...),使用相應的文件。有關更多信息,請參閱知識庫中的[此條目](https://mariadb.com/kb/en/library/configuring-mariadb-with-option-files/)。
啟用自動補全
MySQL 默認禁用客戶端自動補全功能。要在整個系統中啟用它,編輯 /etc/my.cnf.d/client.cnf
,並在 client-mariadb
下添加 auto-rehash
。注意:不要將其放在 mysqld
下。下次運行 MariaDB 客戶端時,補全功能將啟用。
使用 UTF8MB4
將以下內容追加到 /etc/my.cnf.d/my.cnf
文件中:
[client] default-character-set = utf8mb4 [mariadb] collation_server = utf8mb4_unicode_ci character_set_server = utf8mb4 [mariadb-client] default-character-set = utf8mb4
重啟 mariadb.service
以應用更改。更改字符集不會改變現有表格格式,只會影響新創建的表格以及檢索數據的協議交互。
參見#Maintenance 以優化和檢查資料庫健康狀況。
使用內存作為臨時文件存放點
MySQL 存儲臨時文件的目錄名是 tmpdir。
創建一個臨時目錄:
# mkdir -pv /var/lib/mysqltmp # chown mysql:mysql /var/lib/mysqltmp
通過命令找出 mysql
的 id 和 gid:
$ id mysql uid=27(mysql) gid=27(mysql) groups=27(mysql)
添加 tmpfs 到 /etc/fstab
中:
tmpfs /var/lib/mysqltmp tmpfs rw,gid=27,uid=27,size=100M,mode=0750,noatime 0 0
將以下配置添加到 /etc/mysql/my.cnf
的 mysqld
組下:
tmpdir = /var/lib/mysqltmp
Stop mariadb.service
, mount /var/lib/mysqltmp/
並啟動 mariadb.service
.
時區表
儘管時區表在安裝過程中已創建,但它們不會自動填充。如果您計劃在 SQL 查詢中使用 CONVERT_TZ(),則需要填充這些表。
要填充所有時區的時區表:
$ mariadb-tzinfo-to-sql /usr/share/zoneinfo | mariadb -u root -p mysql
可選地,您可以使用特定的時區文件填充表:
$ mariadb-tzinfo-to-sql timezone_file timezone_name | mariadb -u root -p mysql
安全
提高初始的安全性
使用 mariadb-secure-installation
命令會交互式地引導您完成一些推薦的安全措施,比如移除匿名帳戶和測試資料庫,從而提高初始安全性。
# mariadb-secure-installation
只監聽本地迴環地址
默認情況下, MariaDB 會監聽 0.0.0.0 這個地址, 它包括了所有的網絡接口。 為了限制 MariaDB 只監聽迴環地址, 請在 /etc/my.cnf.d/server.cnf
文件中添加如下行:
[mariadb] bind-address = localhost
這將綁定到地址 127.0.0.1 和 ::1,並使 MariaDB 能夠接收 IPv4 和 IPv6 的連接。
啟用僅通過 Unix 套接字在本地啟用訪問
默認情況下,MariaDB 可通過 Unix sockets 和網絡訪問。如果只需要在本地主機上使用 MariaDB,則可以通過不在 TCP 埠 3306 上監聽,而是僅在 Unix sockets 上監聽來提高安全性。要實現這一點,請在/etc/my.cnf.d/server.cnf
文件中添加以下行:
[mariadb] skip-networking
您仍然可以像以前一樣在本地登錄,但只能使用 Unix 套接字。
授權遠程訪問
要允許遠程訪問MariaDB伺服器,請確保MariaDB已啟用網絡並正在適當的接口上進行偵聽.
授予任何MariaDB用戶遠程訪問權限(以root用戶為例):
# mariadb -u root -p
檢查當前具有遠程訪問權限特權的用戶:
SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';
現在為您的用戶(這裡是 root)授予遠程訪問權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'my_optional_remote_password' WITH GRANT OPTION;
如果願意,您可以將「%」通配符更改為特定的主機。密碼可以與用戶的主密碼不同。
配置主目錄訪問
ProtectHome=true
禁止 MariaDB 訪問 /home
、/root
和 /run/user
目錄內的文件。datadir
必須要放在以上文件夾之外,並且由 mysql
用戶和用戶組 所有。
如果要改變這個設置,可以根據以下連結創建一個替代的 service 文件:[4]
維護
大版本升級時升級資料庫
在 mariadb包 大版本發布時(例如從 mariadb-10.3.10-1 升級到 mariadb-10.9.4-1),建議升級系統資料庫以啟用新伺服器功能:
# mariadb-upgrade -u root -p
要從 10.3.x 更新到 10.9.x:
- 停止 10.3.x 伺服器
- 升級軟體包
- 運行新軟體包中的
mariadb-upgrade
以針對新運行的守護進程
如果(新)守護進程未啟動,請參考 #無法運行 mariadb-upgrade 因為 MariaDB 無法啟動。
檢查、優化和修複數據庫
mariadb-clients包 提供了 mariadb-check,可用於從 shell 中檢查、修復和優化資料庫中的表。更多信息請參見 mariadb-check(1)。以下是一些常用命令:
要檢查所有資料庫中的所有表:
備份
有各種各樣的工具和策略可以備份你的資料庫。
如果你正在使用默認的 InnoDB 存儲引擎,建議的在線備份所有資料庫並為時序恢復(也稱為「向前滾動」,當你需要恢復舊備份並重放自那個備份以來發生的更改時)的方法是執行以下命令:
$ mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases -u root -p > all_databases.sql
這將提示輸入 MariaDB 的 root 用戶密碼,該密碼是在資料庫配置期間定義的。
強烈建議不在命令行中指定密碼,因為這會使密碼通過 ps aux
或其他技術暴露給其他用戶發現。相反,上述命令會提示輸入指定用戶的密碼,並將其隱藏起來。
壓縮
由於 SQL 表可能會變得非常大,建議將上述命令的輸出通過 壓縮工具 如 xz(1) 進行壓縮:
$ mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases -u root -p | xz -z > all_databases.sql.xz
解壓縮創建的備份並將其重新加載到伺服器中可以通過以下命令完成:
$ xzcat all_databases.sql.xz | mariadb -u root -p
這將重新創建並重新填充之前備份的所有資料庫(參見 這個 或 這個)。
非交互式
如果你想為 cron 作業或 systemd 定時器 設置非交互式備份腳本,請參閱 選項文件 和 這個示例 以了解 mariadb-dump。
基本上,你應該在相關的 配置文件 中添加以下部分:
[mariadb-dump] user=mysqluser password=secret
在這裡提及用戶是可選的,但這樣做可以讓你不必在命令行中提及它。如果你想為所有工具(包括 mariadb-client
)設置此選項,請使用 [client]
組。
示例腳本
資料庫可以轉儲到文件中以便輕鬆備份。以下 shell 腳本將為你完成此操作,在與腳本相同的目錄中創建一個 db_backup.xz
文件,其中包含你的資料庫轉儲:
#!/bin/sh THISDIR=$(dirname $(readlink -f "$0")) mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases \ | xz -z > $THISDIR/db_backup.xz echo 'purge master logs before date_sub(now(), interval 7 day);' | mariadb
另請參閱 MariaDB 手冊中的官方 mariadb-dump
頁面。
Holland 備份
一個名為 Holland Backup 的基於 Python 的軟體包可以自動化所有備份工作。它支持直接使用 mysqldump、LVM 快照到 tar 文件(mysqllvm)、帶有 mysqldump 的 LVM 快照(mysqldump-lvm)以及 xtrabackup包 方法來提取數據。Holland 框架支持多種選項,並且高度可配置,幾乎可以應對任何備份情況。
主要的 hollandAUR 和 holland-commonAUR 包提供了核心框架;必須安裝其中一個子包(holland-mysqldumpAUR、holland-mysqllvmAUR 和/或 holland-xtrabackupAUR)以進行完整操作。每種方法的示例配置位於 /usr/share/doc/holland/examples/
目錄中,可以複製到 /etc/holland/backupsets/
,也可以使用 holland mk-config
命令為指定的提供者生成基本配置。
故障排除
執行 mysql_upgrade 後 MySQL 不能啟動
試試安全模式下運行的 MySQL:
# mariadbd-safe --datadir=/var/lib/mysql/
然後再運行:
# mariadb-upgrade -u root -p
重置 root 密碼
- 停止
mariadb.service
. - 用安全方式啟動服務:
# mariadbd-safe --skip-grant-tables --skip-networking &
- 連接伺服器:
# mariadb -u root
- 修改 root 密碼:
MariaDB [mysql]> FLUSH PRIVILEGES; MariaDB [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; MariaDB [mysql]> exit
- 停掉 mariadbd* 進程:
# kill $(cat /var/lib/mysql/$HOSTNAME.pid)
- 啟動
mariadb.service
.
檢查並修復所有數據表
檢查並自動修復所有資料庫中的所有表,查看更多:
# mariadb-check -A --auto-repair -u root -p
優化所有數據表
強制優化所有數據表,自動修復可能出現的數據表錯誤
# mariadb-check -A --auto-repair -f -o -u root -p
OS error 22 when running on ZFS
如果您正在使用 ZFS 並且遇見了如下錯誤
InnoDB: Operating system error number 22 in a file operation.
那麼就需要修改 /etc/mysql/my.cnf
中的設置來禁用 aio_writes
[mariadb] ... innodb_use_native_aio = 0
無法通過命令行登錄, 但是 phpmyadmin 正常工作
當使用了超長 (>80) 的密碼後,這個問題有可能發生。 mariadb
的命令行不能在 readline 模式中處理那麼多的字符。
所以如果打算使用推薦的密碼輸入方式:
$ mariadb -u user -p Password:
不妨考慮更換一個長度短一點的密碼。
$ mysql -u <user> -p"some-very-strong-password"
MySQL 日誌文件占用太多空間
默認情況下,mariadbd 會在 /var/lib/mysql/mysql-bin.XXXXXX
創建二進制日誌文件,文件名中的數字遞增。這些日誌對於複製主伺服器或數據恢復非常有用,但這些二進制日誌可能會迅速占用大量磁碟空間。如果您不打算使用複製或數據恢復功能,可以通過在 /etc/my.cnf.d/my.cnf
中注釋掉以下兩行來禁用二進制日誌記錄,然後重啟:
#log-bin=mysql-bin #binlog_format=mixed
或者,如果您希望保留這些日誌但控制其大小並刪除舊日誌,可以設置以下限制然後重啟:
log-bin=mysql-bin expire_logs_days = 10 max_binlog_size = 100M
另外,MariaDB 提供了一個命令來手動刪除比特定日誌更早的日誌。例如,您可能會看到一個名為 mysql-bin.000023
的文件,並希望刪除比它更早的所有日誌。只要 log-bin=mysql-bin 設置生效,您可以運行:
# mariadb -u root -p"PASSWORD" -e "PURGE BINARY LOGS TO 'mysql-bin.000023;"
OpenRC 無法啟動 MariaDB
要使用 OpenRC 啟動 MariaDB,您需要在 MySQL 配置文件 /etc/my.cnf.d/my.cnf
的 [mariadb]
部分添加以下行:
user = mysql basedir = /usr datadir = /var/lib/mysql pid-file = /run/mysqld/mysql.pid
您現在應該能夠使用以下命令啟動 MariaDB:
# rc-service mysql start
更改 max_open_files/table_open_cache 的限制警告
通過創建 systemd drop-in 來增加文件描述符的數量,例如:
/etc/systemd/system/mariadb.service.d/limit_nofile.conf
[Service] LimitNOFILE=8192
10.4 到 10.5 升級崩潰:"InnoDB: Upgrade after a crash is not supported. The redo log was created with MariaDB 10.4.x"
在 MariaDB 10.5 之前,redo log 被不必要地分割成多個文件。[5]
千萬不要刪除舊的二進制日誌 /var/lib/mysql/ib_logfile*
。
要解決此問題,請安裝 MariaDB 10.4。啟動它並讓它進行乾淨的關閉。之後,您可以再次升級到 10.5。如果指定了其他版本的 MariaDB,同樣適用。
Table 'mysql.xxx' does not exist in engine
症狀:運行 mariadb-upgrade 或 mariadb-check 時,返回一個或多個類似以下的錯誤:
Table 'mysql.xxx' does not exist in engine
其中 "xxx" 通常是 mysql 資料庫中的系統表。
修復步驟:
- 在 MariaDB
${DATADIR}</nowiki>
之外創建備份目錄,例如在$HOME/mariadb_backup
。 - 將問題文件從
${DATADIR}/mysql/xxx.{frm,ibd}</nowiki>
複製到備份目錄。xxx.ibd
可能不存在。 - 在
mariadb
提示符下使用 DROP TABLE mysql.xxx 刪除表。 - 運行 mariadb-check。成功後,應重新創建
xxx.frm
和xxx.ibd
文件。 - 如有必要,重新運行 mariadb-upgrade。您可能需要使用 --force 選項。