跳转到内容

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
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', 'zhangsan@example.com');
INSERT INTO users (username, email) VALUES ('lisi', 'lisi@example.com');
-- 查询数据
SELECT * FROM users;
SELECT username, email FROM users WHERE id = 1;
-- 更新数据
UPDATE users SET email = 'zhang3@example.com' 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