
1. MariaDB 服务器概述MariaDB 是一个开源的关系型数据库管理系统RDBMS作为 MySQL 的一个分支而诞生。它由 MySQL 的原始开发者 Michael Monty Widenius 创建旨在保持与 MySQL 的高度兼容性同时提供更多功能和改进。MariaDB 的名称来源于 Monty 的小女儿 Maria 的名字。在实际生产环境中MariaDB 因其稳定性、性能和丰富的功能集而广受欢迎。许多大型科技公司如 Google、Wikipedia 和 Red Hat 都已将 MariaDB 作为其数据库解决方案。与 MySQL 相比MariaDB 提供了更多的存储引擎选择如 Aria、ColumnStore 等改进了查询优化器并包含了更多安全特性。提示虽然 MariaDB 与 MySQL 高度兼容但在某些特定功能和语法上仍存在差异迁移时需要注意兼容性问题。2. MariaDB 服务器安装与配置2.1 系统环境准备在安装 MariaDB 前需要确保系统满足基本要求。对于 Linux 系统以 Ubuntu 为例建议使用至少 2GB 内存和 20GB 磁盘空间的生产环境配置。以下是在 Ubuntu 20.04 LTS 上的安装步骤# 更新软件包列表 sudo apt update # 安装 MariaDB 服务器 sudo apt install mariadb-server # 安全配置向导 sudo mysql_secure_installation安装过程中安全配置向导会提示设置 root 密码、移除匿名用户、禁止远程 root 登录等安全选项。建议全部选择 Y 以增强安全性。2.2 配置文件详解MariaDB 的主要配置文件位于/etc/mysql/mariadb.conf.d/50-server.cnf。关键配置项包括[mysqld] datadir /var/lib/mysql socket /var/run/mysqld/mysqld.sock # 内存配置 key_buffer_size 256M max_allowed_packet 64M thread_stack 192K thread_cache_size 8 # 连接设置 max_connections 100 connect_timeout 10 wait_timeout 28800 # 日志配置 log_error /var/log/mysql/error.log slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 2配置完成后需要重启服务使更改生效sudo systemctl restart mariadb3. MariaDB 常见问题解决方案3.1 错误 2059认证插件问题当客户端尝试连接 MariaDB 10.4 版本时可能会遇到错误 2059Authentication plugin caching_sha2_password cannot be loaded。这是因为新版 MariaDB 默认使用了更安全的认证插件。解决方案有两种修改用户认证方式推荐ALTER USER usernamehost IDENTIFIED WITH mysql_native_password BY password; FLUSH PRIVILEGES;或者在配置文件中强制使用旧版认证方式不推荐安全性降低[mysqld] default_authentication_plugin mysql_native_password3.2 UniDAC 连接失败问题使用 UniDAC 组件连接 MariaDB 时可能会遇到兼容性问题。解决方法包括确保使用最新版本的 UniDAC 组件在连接字符串中明确指定协议版本ProtocolmpMySQL;Serverlocalhost;Databasetestdb;UserIDuser;Passwordpass;Port3306检查防火墙设置确保 3306 端口开放3.3 群晖 NAS 连接配置在群晖 NAS 上配置 MariaDB 连接时需要注意确保 MariaDB 10 套件已安装并启动设置适当的权限GRANT ALL PRIVILEGES ON *.* TO username% IDENTIFIED BY password; FLUSH PRIVILEGES;在群晖控制面板 安全性 防火墙中允许 3306 端口如果使用 Docker 版 MariaDB确保正确映射端口4. MariaDB 与 Spring Boot 集成4.1 基本配置在 Spring Boot 项目中使用 MariaDB 非常简单。首先在 pom.xml 中添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdorg.mariadb.jdbc/groupId artifactIdmariadb-java-client/artifactId version3.0.6/version /dependency然后在 application.properties 中配置数据源spring.datasource.urljdbc:mariadb://localhost:3306/dbname spring.datasource.usernameuser spring.datasource.passwordpass spring.datasource.driver-class-nameorg.mariadb.jdbc.Driver spring.jpa.hibernate.ddl-autoupdate spring.jpa.show-sqltrue4.2 MyBatis-Plus 支持MyBatis-Plus 完全支持 MariaDB。配置示例Configuration MapperScan(com.example.mapper) public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MARIADB)); return interceptor; } }实体类映射示例Data TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String name; private Integer age; private String email; }Mapper 接口示例public interface UserMapper extends BaseMapperUser { // 自定义方法 Select(SELECT * FROM user WHERE age #{age}) ListUser selectUsersOlderThan(Integer age); }5. MariaDB 性能优化实践5.1 查询优化技巧索引优化为 WHERE、JOIN 和 ORDER BY 子句中的列创建索引避免过度索引每个额外的索引都会降低写入性能使用复合索引时遵循最左前缀原则EXPLAIN 分析EXPLAIN SELECT * FROM orders WHERE customer_id 100 AND status shipped;分析结果中的 type 列应尽量为 ref 或 eq_ref避免 ALL全表扫描**避免 SELECT *** 只查询需要的列减少数据传输量5.2 服务器参数调优根据服务器配置调整以下参数# InnoDB 缓冲池建议为系统内存的 50-70% innodb_buffer_pool_size 4G # 日志文件大小建议每个 256M-2G innodb_log_file_size 512M # 并发连接处理 innodb_thread_concurrency 0 # 0表示无限制 innodb_read_io_threads 8 innodb_write_io_threads 8 # 查询缓存MariaDB 10.1.7 已移除使用其他缓存方案5.3 分表与分区策略对于大型表考虑使用分区提高查询性能CREATE TABLE sales ( id INT NOT NULL AUTO_INCREMENT, region VARCHAR(50) NOT NULL, amount DECIMAL(10,2) NOT NULL, sale_date DATE NOT NULL, PRIMARY KEY (id, sale_date) ) PARTITION BY RANGE (YEAR(sale_date)) ( PARTITION p2020 VALUES LESS THAN (2021), PARTITION p2021 VALUES LESS THAN (2022), PARTITION p2022 VALUES LESS THAN (2023), PARTITION pmax VALUES LESS THAN MAXVALUE );6. MariaDB 高可用与备份方案6.1 主从复制配置主服务器配置/etc/mysql/mariadb.conf.d/50-server.cnf[mysqld] server-id 1 log_bin /var/log/mysql/mariadb-bin binlog_format ROW binlog_row_image FULL expire_logs_days 10创建复制用户CREATE USER replicator% IDENTIFIED BY password; GRANT REPLICATION SLAVE ON *.* TO replicator%; FLUSH PRIVILEGES;从服务器配置[mysqld] server-id 2 relay_log /var/log/mysql/mariadb-relay-bin read_only ON启动复制CHANGE MASTER TO MASTER_HOSTmaster_ip, MASTER_USERreplicator, MASTER_PASSWORDpassword, MASTER_LOG_FILEmariadb-bin.000001, MASTER_LOG_POS328; START SLAVE;6.2 备份与恢复策略mysqldump 备份mysqldump -u root -p --all-databases --single-transaction --master-data2 full_backup.sql物理备份Percona XtraBackupxtrabackup --backup --target-dir/backups/full --userroot --passwordpassword xtrabackup --prepare --target-dir/backups/full自动化备份脚本示例#!/bin/bash BACKUP_DIR/backups/mysql DATE$(date %Y%m%d_%H%M%S) LOGFILE/var/log/mysql_backup.log echo $(date) - Starting backup $LOGFILE mysqldump -u backup_user -ppassword --all-databases --single-transaction | gzip $BACKUP_DIR/full_$DATE.sql.gz # 保留最近7天备份 find $BACKUP_DIR -name *.sql.gz -mtime 7 -exec rm {} \; echo $(date) - Backup completed $LOGFILE7. MariaDB 监控与维护7.1 性能监控工具内置命令SHOW STATUS- 查看服务器状态变量SHOW PROCESSLIST- 查看当前连接和查询SHOW ENGINE INNODB STATUS- InnoDB 详细状态第三方工具Prometheus Grafana可视化监控Percona Monitoring and Management (PMM)专业数据库监控mytop类似 top 的命令行监控工具7.2 定期维护任务表维护ANALYZE TABLE table_name; -- 更新统计信息 OPTIMIZE TABLE table_name; -- 优化表存储日志轮转 配置 logrotate 自动轮转 MySQL 日志/var/log/mysql/mysql.log { daily rotate 7 missingok compress delaycompress notifempty create 640 mysql adm postrotate test -x /usr/bin/mysqladmin /usr/bin/mysqladmin flush-logs endscript }用户权限审计-- 列出所有用户及其权限 SELECT user, host FROM mysql.user; SHOW GRANTS FOR usernamehost; -- 定期检查并移除不必要的权限 REVOKE ALL PRIVILEGES ON *.* FROM usernamehost;在实际使用 MariaDB 的过程中我发现定期检查慢查询日志和优化长期存在的性能问题比一次性的大规模调优更有效。对于生产环境建议至少每周进行一次完整的备份验证确保在需要时能够成功恢复。