MariaDB - Arch Linux 中文维基

跳至內容

# MariaDB

出自 Arch Linux 中文维基

相關文章

- phpMyAdmin
- Adminer
- JDBC and MySQL
- Open Database Connectivity

翻譯狀態：

- 本文（或部分內容）譯自 MariaDB，最近一次同步於 2025-01-24，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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=<數據目錄>`
注意：在繼續之前，建議 提高 MariaDB 安裝的初始安全性。

為了簡化管理，你可能需要安裝一個前端工具。

## 配置

默認情況下，`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

警告：在更改字符集之前務必先創建備份！
注意：mariadb包 包已經使用 `utf8mb4` 作為字符集，並使用 `utf8mb4_unicode_ci` 作為校對規則。使用默認（字符集）設置的用戶可以跳過本節。

- 推薦使用 UTF8MB4 而不是 UTF-8，因為它允許完整的 Unicode 支持 [2] [3]。

將以下內容追加到 `/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

警告：運行之後，請注意TCP埠3306仍將保持打開狀態，但會拒絕連接並顯示錯誤消息。要防止MySQL監聽外部接口，請參閱#僅在迴環地址上監聽和#僅通過Unix套接字本地訪問的部分。

### 只監聽本地迴環地址

默認情況下, 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 伺服器，請考慮使用安全外殼協議（Secure Shell）,虛擬網絡計算機（VNC）或虛擬專用網絡（VPN）。

要允許遠程訪問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;

如果願意，您可以將「%」通配符更改為特定的主機。密碼可以與用戶的主密碼不同。

### 配置主目錄訪問

注意：出於安全考慮，systemd 的 .service 文件通過 `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 密碼

1. 停止 `mariadb.service`.
2. 用安全方式啟動服務：

       # mariadbd-safe --skip-grant-tables --skip-networking &

3. 連接伺服器:

       # mariadb -u root

4. 修改 root 密碼:

       MariaDB [mysql]> FLUSH PRIVILEGES;
       MariaDB [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
       MariaDB [mysql]> exit

5. 停掉 mariadbd* 進程:

       # kill $(cat /var/lib/mysql/$HOSTNAME.pid)

6. 啟動 `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 日誌文件占用太多空間

本文或本節內容已經過時。

原因： /etc/my.cnf.d/my.cnf 不再存在 (在Talk:MariaDB#"MariaDB 二進制日誌占用大量磁碟空間"中的錯誤討論)

默認情況下，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 資料庫中的系統表。

修復步驟：

1. 在 MariaDB `${DATADIR}</nowiki>` 之外創建備份目錄，例如在 `$HOME/mariadb_backup`。
2. 將問題文件從 `${DATADIR}/mysql/xxx.{frm,ibd}</nowiki>` 複製到備份目錄。`xxx.ibd` 可能不存在。
3. 在 `mariadb` 提示符下使用 DROP TABLE mysql.xxx 刪除表。
4. 運行 mariadb-check。成功後，應重新創建 `xxx.frm` 和 `xxx.ibd` 文件。
5. 如有必要，重新運行 mariadb-upgrade。您可能需要使用 --force 選項。

## 更多資源

- MariaDB 官方網站
- MariaDB 知識庫
- MySQL 性能調優腳本與技巧

分類：​

- 資料庫管理系統
- 使用「模板:過時」標記的頁面或章節

MariaDB
新增話題