MySQL / MariaDB
MariaDB 是 MySQL 的开源分支,在 EL 系发行版中作为默认的 MySQL 兼容数据库。本文将介绍 MariaDB 的安装、安全初始化、基本 SQL 操作、用户与数据库管理、备份恢复以及远程访问配置。
各发行版中的版本
Section titled “各发行版中的版本”安装 MariaDB
Section titled “安装 MariaDB”使用系统默认仓库安装
Section titled “使用系统默认仓库安装”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 仍在支持期内),可以添加官方仓库:
sudo tee /etc/yum.repos.d/MariaDB.repo << 'EOF'[mariadb]name = MariaDBbaseurl = https://mirror.mariadb.org/yum/12.3/rhel/$releasever/$basearchgpgkey = https://mirror.mariadb.org/yum/RPM-GPG-KEY-MariaDBgpgcheck = 1EOFsudo dnf install MariaDB-server MariaDB-client -ysudo systemctl start mariadbsudo systemctl enable mariadbsudo systemctl status mariadb安装完成后务必运行安全初始化脚本,设置 root 密码并移除不安全的默认配置:
sudo mysql_secure_installation向导会依次询问以下问题,建议按如下方式回答:
- 输入当前 root 密码 — 首次安装直接按回车(空密码)
- 切换到 unix_socket 认证 — 根据需要选择,推荐
Y - 设置 root 密码 —
Y,然后输入强密码 - 移除匿名用户 —
Y - 禁止 root 远程登录 —
Y - 删除 test 数据库 —
Y - 重新加载权限表 —
Y
初始化完成后测试登录:
sudo mysql -u root -p基本 SQL 操作
Section titled “基本 SQL 操作”以下是日常使用中最常见的 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;数据增删改查
Section titled “数据增删改查”-- 插入数据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';用户与数据库管理
Section titled “用户与数据库管理”生产环境中不应使用 root 账户连接应用程序,而是为每个应用创建专用用户。
创建用户和数据库
Section titled “创建用户和数据库”-- 创建数据库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;查看与管理用户
Section titled “查看与管理用户”-- 查看所有用户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';只读用户示例
Section titled “只读用户示例”CREATE USER 'reader'@'localhost' IDENTIFIED BY 'ReadOnly789!';GRANT SELECT ON webapp.* TO 'reader'@'localhost';FLUSH PRIVILEGES;mysqldump 备份与恢复
Section titled “mysqldump 备份与恢复”mysqldump 是 MariaDB/MySQL 自带的逻辑备份工具,适用于中小规模数据库。
备份单个数据库
Section titled “备份单个数据库”mysqldump -u root -p webapp > /backup/webapp_$(date +%Y%m%d_%H%M%S).sql备份所有数据库
Section titled “备份所有数据库”mysqldump -u root -p --all-databases > /backup/all_databases_$(date +%Y%m%d_%H%M%S).sqlmysqldump -u root -p webapp users > /backup/webapp_users.sqlmysqldump -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.sqlgunzip < /backup/webapp_20260324.sql.gz | mysql -u root -p webapp自动备份脚本
Section titled “自动备份脚本”sudo tee /usr/local/bin/mariadb-backup.sh << 'SCRIPT'#!/bin/bashBACKUP_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远程访问配置
Section titled “远程访问配置”默认情况下 MariaDB 只监听本地连接,如需允许远程访问,需要修改以下配置。
修改绑定地址
Section titled “修改绑定地址”sudo tee /etc/my.cnf.d/bind-address.conf << 'EOF'[mysqld]bind-address = 0.0.0.0EOF如果只需要监听特定 IP,将 0.0.0.0 替换为该 IP 地址。
sudo systemctl restart mariadb创建允许远程连接的用户
Section titled “创建允许远程连接的用户”-- 允许从任意 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;开放防火墙端口
Section titled “开放防火墙端口”sudo firewall-cmd --permanent --add-service=mysqlsudo firewall-cmd --reload测试远程连接
Section titled “测试远程连接”在远程客户端上执行:
mysql -u remote_user -p -h 服务器IP地址远程访问带来额外的安全风险,建议采取以下措施:
- 限制用户的连接来源 IP,避免使用
'%'通配符 - 使用防火墙限制 3306 端口的访问来源
- 考虑使用 SSH 隧道代替直接暴露端口
- 启用 SSL 加密连接
# 在本地建立 SSH 隧道ssh -L 3306:127.0.0.1:3306 user@服务器IP地址
# 然后在本地连接mysql -u webapp_user -p -h 127.0.0.1常用配置优化
Section titled “常用配置优化”sudo tee /etc/my.cnf.d/custom.conf << 'EOF'[mysqld]# 字符集character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
# InnoDB 缓冲池(建议设为可用内存的 50%-70%)innodb_buffer_pool_size = 256M
# 每张表独立表空间innodb_file_per_table = 1
# 慢查询日志slow_query_log = 1slow_query_log_file = /var/log/mariadb/slow-query.loglong_query_time = 2
# 最大连接数max_connections = 150EOFsudo systemctl restart mariadb常用运维命令速查
Section titled “常用运维命令速查”# 启动 / 停止 / 重启sudo systemctl start mariadbsudo systemctl stop mariadbsudo 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- PostgreSQL — 另一个流行的数据库
- SELinux 入门 — 数据库相关 SELinux 配置