跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    MySQL / MariaDB

    MariaDB 是 MySQL 的开源分支,在 EL 系发行版中作为默认的 MySQL 兼容数据库。本文将介绍 MariaDB 的安装、安全初始化、基本 SQL 操作、用户与数据库管理、备份恢复以及远程访问配置。

    版本数据实时来自 pkgseek.com
    安装 MariaDB 服务端和客户端
    sudo dnf install mariadb-server mariadb -y

    使用 MariaDB 官方仓库(获取更新版本)

    Section titled “使用 MariaDB 官方仓库(获取更新版本)”

    系统仓库中的 MariaDB 版本因发行版而异(EL 10 官方为 10.11,部分 EL 9 仓库也提供 10.11 / 11.8 模块流)。如果需要统一的 MariaDB 12.3 LTS(当前最新 LTS;11.8 LTS 仍在支持期内),可以添加官方仓库:

    添加 MariaDB 官方仓库
    sudo tee /etc/yum.repos.d/MariaDB.repo << 'EOF'
    [mariadb]
    name = MariaDB
    baseurl = https://mirror.mariadb.org/yum/12.3/rhel/$releasever/$basearch
    gpgkey = https://mirror.mariadb.org/yum/RPM-GPG-KEY-MariaDB
    gpgcheck = 1
    # EL9/EL10 modular repos filter non-modular packages; this line is what makes the official MariaDB-server visible
    module_hotfixes = 1
    EOF
    从官方仓库安装
    sudo dnf install MariaDB-server MariaDB-client -y
    启动并启用 MariaDB
    sudo systemctl start mariadb
    sudo systemctl enable mariadb
    sudo systemctl status mariadb

    安装完成后务必运行安全初始化脚本,设置 root 密码并移除不安全的默认配置:

    运行安全初始化向导
    sudo mysql_secure_installation

    向导会依次询问以下问题,建议按如下方式回答:

    1. 输入当前 root 密码 — 首次安装直接按回车(空密码)
    2. 切换到 unix_socket 认证 — 根据需要选择,推荐 Y
    3. 设置 root 密码 — Y,然后输入强密码
    4. 移除匿名用户 — Y
    5. 禁止 root 远程登录 — Y
    6. 删除 test 数据库 — Y
    7. 重新加载权限表 — Y

    初始化完成后测试登录:

    测试 root 登录
    sudo mysql -u root -p

    以下是日常使用中最常见的 SQL 语句。

    数据库基本操作
    -- 查看所有数据库
    SHOW DATABASES;
    -- 创建数据库(指定字符集)
    CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    -- 切换数据库
    USE myapp;
    -- 删除数据库
    DROP DATABASE myapp;
    表的创建与管理
    -- 创建表
    CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    -- 查看表结构
    DESCRIBE users;
    -- 查看所有表
    SHOW TABLES;
    数据 CRUD 操作
    -- 插入数据
    INSERT INTO users (username, email) VALUES ('zhangsan', '[email protected]');
    INSERT INTO users (username, email) VALUES ('lisi', '[email protected]');
    -- 查询数据
    SELECT * FROM users;
    SELECT username, email FROM users WHERE id = 1;
    -- 更新数据
    UPDATE users SET email = '[email protected]' WHERE username = 'zhangsan';
    -- 删除数据
    DELETE FROM users WHERE username = 'lisi';

    生产环境中不应使用 root 账户连接应用程序,而是为每个应用创建专用用户。

    创建应用专用数据库和用户
    -- 创建数据库
    CREATE DATABASE webapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    -- 创建用户(仅允许本地连接)
    CREATE USER 'webapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
    -- 授权用户对指定数据库的全部权限
    GRANT ALL PRIVILEGES ON webapp.* TO 'webapp_user'@'localhost';
    -- 刷新权限
    FLUSH PRIVILEGES;
    用户管理操作
    -- 查看所有用户
    SELECT User, Host FROM mysql.user;
    -- 查看用户权限
    SHOW GRANTS FOR 'webapp_user'@'localhost';
    -- 修改用户密码
    ALTER USER 'webapp_user'@'localhost' IDENTIFIED BY 'NewPassword456!';
    -- 撤销权限
    REVOKE ALL PRIVILEGES ON webapp.* FROM 'webapp_user'@'localhost';
    -- 删除用户
    DROP USER 'webapp_user'@'localhost';
    创建只读用户
    CREATE USER 'reader'@'localhost' IDENTIFIED BY 'ReadOnly789!';
    GRANT SELECT ON webapp.* TO 'reader'@'localhost';
    FLUSH PRIVILEGES;

    mysqldump 是 MariaDB/MySQL 自带的逻辑备份工具,适用于中小规模数据库。

    备份单个数据库
    mysqldump -u root -p webapp > /backup/webapp_$(date +%Y%m%d_%H%M%S).sql
    备份全部数据库
    mysqldump -u root -p --all-databases > /backup/all_databases_$(date +%Y%m%d_%H%M%S).sql
    备份单张表
    mysqldump -u root -p webapp users > /backup/webapp_users.sql
    备份并压缩
    mysqldump -u root -p webapp | gzip > /backup/webapp_$(date +%Y%m%d).sql.gz
    恢复数据库
    # 先创建目标数据库(如果不存在)
    mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS webapp;"
    # 恢复数据
    mysql -u root -p webapp < /backup/webapp_20260324.sql
    恢复压缩备份
    gunzip < /backup/webapp_20260324.sql.gz | mysql -u root -p webapp
    创建每日自动备份脚本
    sudo tee /usr/local/bin/mariadb-backup.sh << 'SCRIPT'
    #!/bin/bash
    BACKUP_DIR="/backup/mariadb"
    DATE=$(date +%Y%m%d_%H%M%S)
    RETENTION_DAYS=7
    mkdir -p "$BACKUP_DIR"
    # 备份所有数据库
    mysqldump -u root --all-databases | gzip > "${BACKUP_DIR}/all_db_${DATE}.sql.gz"
    # 删除超过保留天数的旧备份
    find "$BACKUP_DIR" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
    echo "Backup completed: ${BACKUP_DIR}/all_db_${DATE}.sql.gz"
    SCRIPT
    sudo chmod +x /usr/local/bin/mariadb-backup.sh

    添加 cron 定时任务,每天凌晨 2 点执行备份:

    添加定时备份任务
    echo "0 2 * * * root /usr/local/bin/mariadb-backup.sh" | sudo tee /etc/cron.d/mariadb-backup

    默认情况下 MariaDB 只监听本地连接,如需允许远程访问,需要修改以下配置。

    配置 MariaDB 监听所有地址
    sudo tee /etc/my.cnf.d/bind-address.conf << 'EOF'
    [mysqld]
    bind-address = 0.0.0.0
    EOF

    如果只需要监听特定 IP,将 0.0.0.0 替换为该 IP 地址。

    重启 MariaDB
    sudo systemctl restart mariadb
    创建远程访问用户
    -- 允许从任意 IP 连接(不推荐用于生产环境)
    CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass123!';
    GRANT ALL PRIVILEGES ON webapp.* TO 'remote_user'@'%';
    -- 只允许从特定 IP 连接(推荐)
    CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'RemotePass123!';
    GRANT ALL PRIVILEGES ON webapp.* TO 'remote_user'@'192.168.1.100';
    FLUSH PRIVILEGES;
    开放 MariaDB 端口
    sudo firewall-cmd --permanent --add-service=mysql
    sudo firewall-cmd --reload

    在远程客户端上执行:

    从远程客户端测试连接
    mysql -u remote_user -p -h 服务器IP地址

    远程访问带来额外的安全风险,建议采取以下措施:

    • 限制用户的连接来源 IP,避免使用 '%' 通配符
    • 使用防火墙限制 3306 端口的访问来源
    • 考虑使用 SSH 隧道代替直接暴露端口
    • 启用 SSL 加密连接
    通过 SSH 隧道安全连接
    # 在本地建立 SSH 隧道
    ssh -L 3306:127.0.0.1:3306 user@服务器IP地址
    # 然后在本地连接
    mysql -u webapp_user -p -h 127.0.0.1
    创建基础优化配置
    sudo tee /etc/my.cnf.d/custom.conf << 'EOF'
    [mysqld]
    # 字符集
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    # InnoDB 缓冲池(建议设为可用内存的 50%-70%)
    innodb_buffer_pool_size = 256M
    # 每张表独立表空间
    innodb_file_per_table = 1
    # 慢查询日志
    slow_query_log = 1
    slow_query_log_file = /var/log/mariadb/slow-query.log
    long_query_time = 2
    # 最大连接数
    max_connections = 150
    EOF
    应用配置更改
    sudo systemctl restart mariadb
    MariaDB 日常运维命令
    # 启动 / 停止 / 重启
    sudo systemctl start mariadb
    sudo systemctl stop mariadb
    sudo systemctl restart mariadb
    # 查看运行状态
    sudo systemctl status mariadb
    # 登录数据库
    mysql -u root -p
    # 查看数据库版本
    mysql -V
    # 查看数据库运行状态变量
    mysqladmin -u root -p status
    # 查看进程列表
    mysqladmin -u root -p processlist
    # 检查并修复表
    mysqlcheck -u root -p --all-databases --auto-repair