MariaDB 实战指南

FreeGuideOnline 最新 2026-07-14

bash sudo apt update sudo apt install mariadb-server -y


**CentOS/RHEL/Fedora**
```bash
sudo dnf install mariadb-server -y     # RHEL 8+ / Fedora
sudo systemctl start mariadb
sudo systemctl enable mariadb

安装完成后,建议立即运行安全配置脚本:

sudo mysql_secure_installation

根据提示设置 root 密码、删除匿名用户、禁止远程 root 登录、删除测试数据库并重新加载权限表。

2.2 在 Windows 上安装

前往 mariadb.org/download 下载 MSI 安装包,按照向导安装,设置 root 密码并选择 UTF‑8 作为默认字符集。

2.3 基本管理命令

# 启动/停止/重启服务
sudo systemctl start|stop|restart mariadb

# 查看状态
sudo systemctl status mariadb

# 连接数据库
mysql -u root -p

3. 核心配置文件

MariaDB 的主配置文件通常位于 /etc/mysql/mariadb.conf.d/50-server.cnf(Ubuntu)或 /etc/my.cnf。重要参数举例:

[mysqld]
bind-address = 0.0.0.0          # 允许远程连接(生产环境需配合防火墙)
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections = 150
query_cache_size = 0            # MariaDB 10.2+ 默认禁用,推荐使用 ProxySQL 等外部缓存
innodb_buffer_pool_size = 1G    # 设置为物理内存的 50%~70%

修改配置后需重启服务:sudo systemctl restart mariadb

4. 用户与权限管理

创建与管理用户是安全运维的基础。

4.1 创建用户

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';  -- 允许特定网段

4.2 授予权限

-- 授予对 app_db 的所有权限
GRANT ALL PRIVILEGES ON app_db.* TO 'appuser'@'localhost';

-- 只授权读权限
GRANT SELECT ON app_db.* TO 'readonly'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

4.3 查看与回收

SHOW GRANTS FOR 'appuser'@'localhost';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'appuser'@'localhost';
DROP USER 'appuser'@'localhost';

5. 实战:创建数据库和表

5.1 数据库操作

-- 创建数据库
CREATE DATABASE IF NOT EXISTS shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 查看数据库
SHOW DATABASES;

-- 选择数据库
USE shop;

5.2 常用数据类型

类型 说明
INT 整数
DECIMAL(M,D) 定点小数,如 DECIMAL(10,2)
VARCHAR(N) 可变长度字符串
TEXT 长文本数据
DATE 日期
DATETIME 日期时间
ENUM 枚举类型

5.3 创建表的例子

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    description TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5.4 插入、查询、更新与删除

-- 插入
INSERT INTO products (name, price, description)
VALUES ('Wireless Mouse', 25.99, 'Ergonomic wireless mouse');

-- 查询
SELECT * FROM products WHERE price > 20.00;

-- 更新
UPDATE products SET price = 22.90 WHERE id = 1;

-- 删除
DELETE FROM products WHERE id = 1;

6. 高级查询技巧

6.1 连接(JOIN)

假设有 orders 表与 products 表关联:

SELECT o.id AS order_id, p.name, o.quantity
FROM orders o
INNER JOIN products p ON o.product_id = p.id
WHERE o.order_date >= '2025-01-01';

6.2 聚合与分组

SELECT p.name, SUM(o.quantity) AS total_sold
FROM orders o
JOIN products p ON o.product_id = p.id
GROUP BY p.id
HAVING total_sold > 10
ORDER BY total_sold DESC;

6.3 子查询

SELECT name, price
FROM products
WHERE id IN (
    SELECT product_id FROM orders WHERE quantity > 5
);

6.4 窗口函数(MariaDB 10.2+)

SELECT name, price,
       RANK() OVER (ORDER BY price DESC) AS price_rank
FROM products;

7. 索引与性能优化

7.1 创建索引

-- 单列索引
CREATE INDEX idx_price ON products(price);

-- 多列索引
CREATE INDEX idx_name_price ON products(name, price);

-- 唯一索引
CREATE UNIQUE INDEX idx_unique_name ON products(name);

7.2 查看执行计划

使用 EXPLAIN 分析查询能否有效利用索引:

EXPLAIN SELECT * FROM products WHERE name = 'Wireless Mouse';

关注 type 列是否为 refeq_ref,避免全表扫描(ALL)。

7.3 慢查询日志

在配置文件中开启慢查询日志:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2

重启后,用 mysqldumpslow 工具分析日志。

7.4 表优化建议

  • 使用 OPTIMIZE TABLE table_name; 整理碎片。
  • 定期 ANALYZE TABLE table_name; 更新统计信息。

8. 备份与恢复

8.1 逻辑备份:mysqldump

# 备份单个数据库
mysqldump -u root -p shop > shop_backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql

恢复:

mysql -u root -p shop < shop_backup.sql

8.2 物理备份:Mariabackup(推荐用于大数据库)

安装:

sudo apt install mariadb-backup   # Ubuntu
sudo dnf install mariadb-backup   # RHEL

完整备份:

sudo mariabackup --backup --target-dir=/backup/mariadb/full --user=root --password=YourPassword

准备恢复(在目标服务器):

sudo mariabackup --prepare --target-dir=/backup/mariadb/full
sudo systemctl stop mariadb
sudo mariabackup --copy-back --target-dir=/backup/mariadb/full
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mariadb

9. 日志与监控

9.1 错误日志

默认位置:/var/log/mysql/error.log。排查启动失败、表损坏等问题。

9.2 通用查询日志(调试用,生产慎用)

general_log = 1
general_log_file = /var/log/mysql/mariadb-query.log

9.3 性能监控工具

  • SHOW STATUS:查看连接数、流量等。
  • information_schema:查询表大小、索引使用等。
  • 使用 Percona Monitoring and Management (PMM)MariaDB MaxScale 实现可视化监控。

10. 实战案例:简易博客数据库设计

设计一个支持用户、文章、评论的博客系统。

CREATE DATABASE blog;
USE blog;

-- 用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 文章表
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    author_id INT NOT NULL,
    title VARCHAR(200) NOT NULL,
    body TEXT NOT NULL,
    published_at DATETIME,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES users(id),
    INDEX idx_published (published_at)
);

-- 评论表
CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT NOT NULL,
    user_id INT NOT NULL,
    content TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES posts(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

常用查询示例:

-- 最近发布的文章及作者
SELECT p.title, u.username, p.published_at
FROM posts p
JOIN users u ON p.author_id = u.id
ORDER BY p.published_at DESC LIMIT 10;

-- 某篇文章的评论数
SELECT p.title, COUNT(c.id) AS comment_count
FROM posts p LEFT JOIN comments c ON p.id = c.post_id
WHERE p.id = 1;