前言 MariaDB 是由 MySQL 原班人马打造的开源关系型数据库管理系统,兼容 MySQL 协议,在性能、存储引擎和安全性上均有显著提升。无论是个人博客、Web 应用还是中小型企业项目,MariaDB 都是极其可靠的数据库选择。本文将手把手教你从零搭建 MariaDB 环境,并掌握日常管理必备技能。
一、MariaDB vs MySQL:为什么选择 MariaDB MariaDB 是 MySQL 的一个分支,由 MySQL 的创始人 Michael Widenius 主导开发。两者高度兼容,但 MariaDB 有以下优势:
特性 MariaDB (10.11+) MySQL (8.0+)
存储引擎 InnoDB + Aria + MyRocks + Spider + ColumnStore 等多引擎 InnoDB (主要) + MyISAM + NDB
查询优化器 更智能的子查询优化、表下推优化 标准优化器
线程池 内置,高并发性能更好 企业版专属
加密功能 内置数据静态加密 企业版专属
Flashback 支持 DDL/DML 回滚 不支持
JSON 处理 兼容 JSON + 虚拟列优化 原生 JSON 类型
许可协议 GPL v2,完全开源 GPL v2 + 商业授权
KILL 语句 支持 KILL 多条语句 一次只能 KILL 一条
如果你的项目原本使用 MySQL,通常可以直接将后端数据库连接指向 MariaDB,无需修改代码——协议完全兼容。
二、环境准备 2.1 查看系统信息 1 2 3 4 5 6 7 8 9 10 11 cat /etc/os-releaseuname -mfree -h df -h
2.2 系统更新 1 2 3 4 sudo apt update && sudo apt upgrade -y sudo yum update -y sudo dnf update -y
三、安装 MariaDB 3.1 通过官方仓库安装(推荐) Ubuntu/Debian 系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo apt install -y software-properties-commoncurl -sS https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mariadb-keyring.gpg > /dev/null sudo tee /etc/apt/sources.list.d/mariadb.sources << EOF # MariaDB 10.11 LTS 源(推荐稳定版本) X-Repolib-Name: MariaDB Types: deb URIs: https://mirror.mariadb.org/repo/10.11/ubuntu Suites: $(lsb_release -sc) Components: main Architectures: amd64 Signed-By: /usr/share/keyrings/mariadb-keyring.gpg EOF sudo apt updatesudo apt install -y mariadb-server mariadb-client
CentOS/RHEL 8+ 系统:
1 2 3 4 5 6 7 8 9 10 11 12 cat << EOF | sudo tee /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB baseurl = https://mirror.mariadb.org/yum/10.11/rhel/\$releasever/\$basearch module_hotfixes = 1 gpgkey = https://mariadb.org/mariadb_release_signing_key.asc gpgcheck = 1 EOF sudo dnf install -y MariaDB-server MariaDB-client
3.2 通过系统包管理器安装(快速方式) 1 2 3 4 5 sudo apt install -y mariadb-server mariadb-clientsudo yum install -y mariadb-server mariadb
注意:系统包管理器中的 MariaDB 版本可能较旧,生产环境推荐使用官方源安装最新 LTS 版本。
四、初始化配置 4.1 启动 MariaDB 服务 1 2 3 4 5 6 7 8 9 10 11 sudo systemctl start mariadbsudo systemctl enable mariadbsudo systemctl status mariadbsudo ss -tlnp | grep 3306
4.2 安全初始化脚本 MariaDB 安装后会自动运行 mysql_secure_installation 来提升安全性:
1 sudo mysql_secure_installation
该脚本会依次要求你设置:
输入 root 密码 :初次安装直接回车(密码为空)
设置 root 密码 :输入 Y 并设置强密码
移除匿名用户 :输入 Y
禁止 root 远程登录 :输入 Y(运维管理时可设为 N)
移除 test 测试库 :输入 Y
重新加载权限表 :输入 Y
4.3 验证安装 1 2 3 4 5 sudo mariadb -u rootmysql -u root -p
登录成功后应看到类似输出:
1 2 3 4 5 6 7 8 9 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 45 Server version: 10.11.9-MariaDB-1:10.11.9+maria~ubu2204 mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
五、基础配置优化 5.1 配置文件结构 MariaDB 的主要配置文件路径:
1 2 3 4 5 6 /etc/mysql/mariadb.conf.d/ # Ubuntu 下推荐位置 ├── 50-server.cnf # 服务器配置 └── 50-client.cnf # 客户端配置 /etc/my.cnf # CentOS 下主配置文件 /etc/my.cnf.d/ # 扩展配置目录
5.2 核心配置项优化 编辑配置文件(以 Ubuntu 为例):
1 sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
推荐调整以下参数(根据服务器内存大小调整):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [mysqld] port = 3306 bind-address = 127.0 .0.1 character-set-server = utf8mb4collation-server = utf8mb4_unicode_ciinnodb_buffer_pool_size = 512 M innodb_log_file_size = 128 Minnodb_flush_log_at_trx_commit = 2 innodb_file_per_table = 1 max_connections = 151 max_allowed_packet = 64 Mslow_query_log = 1 slow_query_log_file = /var/log/mysql/mariadb-slow.loglong_query_time = 2 tmp_table_size = 32 Mmax_heap_table_size = 32 M
修改后重启服务使配置生效:
1 sudo systemctl restart mariadb
5.3 验证配置生效 1 2 3 4 5 SHOW VARIABLES LIKE 'innodb_buffer_pool_size' ;SHOW VARIABLES LIKE 'character_set_server' ;SHOW VARIABLES LIKE 'max_connections' ;SHOW VARIABLES LIKE 'slow_query_log' ;
六、数据库日常管理 6.1 数据库与用户管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SHOW DATABASES;CREATE DATABASE myblog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER 'bloguser' @'localhost' IDENTIFIED BY 'StrongPassword123!' ;CREATE USER 'bloguser' @'%' IDENTIFIED BY 'StrongPassword123!' ;GRANT ALL PRIVILEGES ON myblog.* TO 'bloguser' @'localhost' ;GRANT SELECT , INSERT , UPDATE , DELETE ON myblog.* TO 'bloguser' @'localhost' ;FLUSH PRIVILEGES; SHOW GRANTS FOR 'bloguser' @'localhost' ;DROP USER 'bloguser' @'localhost' ;
6.2 数据表管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 USE myblog; CREATE TABLE articles ( id INT AUTO_INCREMENT PRIMARY KEY , title VARCHAR (200 ) NOT NULL , content TEXT, author VARCHAR (50 ), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , status ENUM('draft' , 'published' , 'deleted' ) DEFAULT 'draft' , INDEX idx_status (status), INDEX idx_created (created_at) ) ENGINE= InnoDB DEFAULT CHARSET= utf8mb4 COLLATE = utf8mb4_unicode_ci; DESC articles;SHOW CREATE TABLE articles;
6.3 数据备份与恢复 方法一:使用 mysqldump(逻辑备份,推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 sudo mysqldump -u root -p myblog > /backup/myblog_$(date +%Y%m%d_%H%M%S).sqlsudo mysqldump -u root -p --all-databases > /backup/alldb_$(date +%Y%m%d).sqlsudo mysql -u root -p myblog < /backup/myblog_20260608.sqlsudo mysqldump -u root -p myblog | gzip > /backup/myblog_$(date +%Y%m%d).sql.gzgunzip < /backup/myblog_20260608.sql.gz | sudo mysql -u root -p myblog
方法二:使用 mariabackup(物理备份,适合大数据库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sudo apt install -y mariadb-backupsudo mariabackup --backup --target-dir=/backup/mariabackup/full --user=root --password=yourpasswordsudo mariabackup --prepare --target-dir=/backup/mariabackup/fullsudo systemctl stop mariadbsudo rm -rf /var/lib/mysql/*sudo mariabackup --copy-back --target-dir=/backup/mariabackup/fullsudo chown -R mysql:mysql /var/lib/mysqlsudo systemctl start mariadb
6.4 定时自动备份 使用 crontab 设置每天凌晨自动备份并保留最近 7 天的备份文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 sudo tee /usr/local/bin/mariadb-backup.sh << 'EOF' BACKUP_DIR="/backup/mysql" DB_NAME="myblog" DB_USER="root" DB_PASS="yourpassword" RETENTION_DAYS=7 DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR " mysqldump -u "$DB_USER " -p"$DB_PASS " "$DB_NAME " | gzip > "$BACKUP_DIR /${DB_NAME} _${DATE} .sql.gz" find "$BACKUP_DIR " -name "${DB_NAME} _*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "[$(date) ] Backup completed: ${DB_NAME} _${DATE} .sql.gz" >> /var/log/mariadb-backup.logEOF sudo chmod +x /usr/local/bin/mariadb-backup.shsudo crontab -e0 3 * * * /usr/local/bin/mariadb-backup.sh
6.5 性能监控 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 SHOW PROCESSLIST;SHOW FULL PROCESSLIST;SHOW STATUS LIKE 'Uptime' ;SHOW STATUS LIKE 'Questions' ;SHOW STATUS LIKE 'Threads_connected' ;SHOW STATUS LIKE 'Slow_queries' ;SELECT TABLE_SCHEMA AS '数据库' , TABLE_NAME AS '表名' , ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 , 2 ) AS '大小 (MB)' , TABLE_ROWS AS '行数' FROM information_schema.TABLESWHERE TABLE_SCHEMA = 'myblog' ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC ;
七、安全管理 7.1 防火墙配置 如果允许远程连接,务必限制来源 IP:
1 2 3 4 5 sudo ufw allow from 192.168.1.100 to any port 3306sudo ufw allow from 10.0.0.0/8 to any port 3306
7.2 密码策略强化 1 2 3 4 5 6 7 8 INSTALL SONAME 'simple_password_check' ; SHOW VARIABLES LIKE 'simple_password_check%' ;SET GLOBAL simple_password_check_minimal_length = 8 ;
7.3 日志审计 1 2 3 4 5 6 7 sudo vim /etc/mysql/mariadb.conf.d/50-server.cnfgeneral_log = 1 general_log_file = /var/log/mysql/mariadb-general.log sudo systemctl restart mariadb
八、常见问题排查
问题 可能原因 解决方案
无法连接数据库 服务未启动或端口被防火墙拦截 systemctl status mariadb 检查服务状态;ufw status 检查防火墙规则
Access denied for user 密码错误或用户权限不足 sudo mysql -u root 登录后 SHOW GRANTS 检查权限;或使用 SET PASSWORD 重设密码
表损坏修复 异常断电或硬件故障 CHECK TABLE tablename; 检查;REPAIR TABLE tablename; 修复;备份后 mariabackup --prepare 恢复
磁盘空间不足 二进制日志或慢查询日志过大 PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY; 清理旧日志
连接数耗尽 应用未正确关闭连接 检查 SHOW PROCESSLIST;KILL id; 清理僵尸连接;优化应用连接池
慢查询 缺少索引或查询语句低效 查看慢查询日志;EXPLAIN SELECT ... 分析执行计划;添加合适索引
九、卸载 MariaDB 如果需要卸载重建:
1 2 3 4 5 6 7 8 9 10 11 12 sudo systemctl stop mariadbsudo apt purge -y mariadb-server mariadb-client mariadb-commonsudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql sudo rm -rf /var/log/mysql sudo systemctl stop mariadbsudo dnf remove -y MariaDB-server MariaDB-clientsudo rm -rf /var/lib/mysqlsudo rm -rf /etc/my.cnf /etc/my.cnf.d
总结 本文从 MariaDB 的安装、初始化配置、日常管理到安全加固与故障排查,覆盖了数据库运维的核心场景。掌握这些技能后,你可以:
快速部署 MariaDB 数据库服务
安全管理 用户权限与数据访问
自动化备份 确保数据安全
性能调优 满足生产环境需求
故障排查 快速定位和解决问题
对于生产环境,建议额外配置主从复制以实现高可用,或结合 ProxySQL 实现读写分离。后续我们可以深入探讨这些进阶话题。
本文由AI辅助生成,内容仅供参考