外观
MariaDB 物理架构
架构概述
MariaDB的物理架构描述了数据库数据在磁盘上的存储方式和组织形式。了解MariaDB的物理架构对于DBA进行存储管理、性能优化和故障恢复至关重要。MariaDB的物理架构主要包括以下几个方面:
- 数据文件结构:表数据、索引数据的存储方式
- 表空间管理:InnoDB表空间的组织和管理
- 日志文件:二进制日志、重做日志、回滚日志等
- 配置文件:MariaDB的配置参数存储
- 进程结构:MariaDB服务器的进程组织
数据文件结构
InnoDB存储引擎文件
InnoDB是MariaDB的默认存储引擎,其数据文件结构如下:
1. 系统表空间文件
- 默认名称:ibdata1, ibdata2, ...
- 存储内容:
- InnoDB数据字典
- 双写缓冲区
- 撤销日志(undo logs)
- 变更缓冲区(change buffer)
- 表数据和索引(如果未使用独立表空间)
- 配置参数:
innodb_data_file_path:定义系统表空间文件路径和大小innodb_data_home_dir:系统表空间文件存储目录
2. 独立表空间文件
- 默认名称:
表名.ibd - 存储内容:
- 单个表的数据
- 单个表的索引
- 配置参数:
innodb_file_per_table:启用独立表空间(默认开启)
3. 临时表空间
- 默认名称:ibtmp1
- 存储内容:
- 临时表数据
- 排序和哈希操作的临时结果
- 配置参数:
innodb_temp_data_file_path:临时表空间配置
Aria存储引擎文件
1. 数据文件
- 默认名称:
表名.MAD - 存储内容:表数据
2. 索引文件
- 默认名称:
表名.MAI - 存储内容:表索引
3. 日志文件
- 默认名称:aria_log_control, aria_log.00000001
- 存储内容:Aria引擎的事务日志
MyRocks存储引擎文件
1. SST文件(Sorted String Table)
- 存储内容:排序的数据和索引
- 特点:
- 不可变文件
- 分层存储(L0, L1, ..., LN)
- 压缩存储
2. WAL文件(Write-Ahead Log)
- 存储内容:数据修改日志
- 用途:崩溃恢复
3. MANIFEST文件
- 存储内容:SST文件的元数据和版本信息
表空间管理
InnoDB表空间类型
1. 系统表空间
- 特点:
- 共享表空间,可存储多个表的数据和索引
- 包含InnoDB数据字典
- 管理复杂,扩展性差
- 适合小型数据库
2. 独立表空间
- 特点:
- 每个表有自己的表空间文件
- 易于管理和维护
- 支持单独备份和恢复
- 适合大型数据库
- 默认开启
3. 通用表空间
- 特点:
- 可存储多个表的数据和索引
- 支持不同的页面大小
- 适合存储相似类型的表
4. 临时表空间
- 特点:
- 存储临时表和临时结果
- 服务器重启时自动重建
表空间管理最佳实践
- 使用独立表空间:便于管理和维护
- 合理设置表空间大小:避免频繁扩展表空间
- 定期清理无用数据:释放表空间空间
- 监控表空间使用情况:及时发现和解决空间不足问题
- 使用分区表:对于大表,考虑使用分区表管理
日志文件
1. 二进制日志(Binlog)
- 默认名称:binlog.000001, binlog.index
- 存储内容:
- 所有数据修改操作
- 表结构变更
- 用途:
- 主从复制
- 数据恢复
- 审计
- 配置参数:
log_bin:启用二进制日志binlog_format:二进制日志格式(ROW, STATEMENT, MIXED)expire_logs_days:二进制日志过期时间
2. 重做日志(Redo Log)
- 默认名称:ib_logfile0, ib_logfile1
- 存储内容:
- 数据修改操作的重做信息
- 用途:
- 崩溃恢复
- 保证事务持久性
- 配置参数:
innodb_log_file_size:重做日志文件大小innodb_log_files_in_group:重做日志文件数量
3. 回滚日志(Undo Log)
- 存储位置:系统表空间或独立回滚表空间
- 存储内容:
- 事务修改前的数据镜像
- 用途:
- 事务回滚
- 多版本并发控制(MVCC)
- 配置参数:
innodb_undo_tablespaces:独立回滚表空间数量innodb_undo_log_truncate:启用回滚日志截断
4. 错误日志
- 默认名称:hostname.err
- 存储内容:
- 服务器启动和关闭信息
- 错误和警告信息
- 严重错误堆栈跟踪
- 配置参数:
log_error:错误日志文件路径log_error_verbosity:错误日志详细程度
5. 慢查询日志
- 默认名称:hostname-slow.log
- 存储内容:
- 执行时间超过阈值的查询
- 用途:
- 性能优化
- 查询分析
- 配置参数:
slow_query_log:启用慢查询日志long_query_time:慢查询阈值slow_query_log_file:慢查询日志文件路径
6. 通用查询日志
- 默认名称:hostname.log
- 存储内容:
- 所有查询语句
- 用途:
- 审计
- 问题排查
- 配置参数:
general_log:启用通用查询日志general_log_file:通用查询日志文件路径
配置文件
1. 主配置文件
- 默认名称:
- Linux/Unix:/etc/my.cnf, /etc/mysql/my.cnf, ~/.my.cnf
- Windows:my.ini, my.cnf
- 存储内容:
- MariaDB服务器配置参数
- 存储引擎配置
- 日志配置
- 安全配置
2. 配置文件结构
ini
# 全局配置
[mysqld]
# MariaDB服务器配置
[mysqld_safe]
# mysqld_safe脚本配置
[client]
# 客户端配置
[mysql]
# mysql客户端配置
[mysqldump]
# mysqldump工具配置3. 配置参数类型
- 布尔型:如
log_bin=1或log_bin=ON - 数值型:如
max_connections=1000 - 字符串型:如
datadir=/var/lib/mysql - 枚举型:如
binlog_format=ROW
进程结构
1. 主要进程
mysqld
- 功能:MariaDB服务器主进程
- 职责:
- 处理客户端连接
- 执行SQL语句
- 管理数据存储
- 处理事务
mysqld_safe
- 功能:MariaDB服务器的启动脚本
- 职责:
- 启动mysqld进程
- 监控mysqld进程状态
- 自动重启mysqld进程
mysql.server
- 功能:系统服务脚本
- 职责:
- 启动、停止和重启MariaDB服务
- 配置服务自启动
2. 线程结构
主线程:
- 负责服务器启动和关闭
- 处理后台任务(如检查点、日志刷新)
IO线程:
- 处理网络IO
- 处理磁盘IO
查询线程:
- 执行客户端查询
- 处理事务
后台线程:
- InnoDB后台线程(如脏页刷新、日志写入)
- 复制线程(主从复制)
- 监控线程
数据目录结构
典型数据目录结构
/var/lib/mysql/
├── ibdata1 # 系统表空间文件
├── ib_logfile0 # 重做日志文件
├── ib_logfile1 # 重做日志文件
├── ibtmp1 # 临时表空间文件
├── mysql/ # 系统数据库
├── performance_schema/ # 性能模式数据
├── sys/ # 系统视图数据库
├── your_database/ # 用户数据库
│ ├── table1.ibd # 独立表空间文件
│ ├── table2.ibd # 独立表空间文件
│ └── ...
├── binlog.000001 # 二进制日志文件
├── binlog.index # 二进制日志索引
├── hostname.err # 错误日志
├── hostname-slow.log # 慢查询日志
└── auto.cnf # 服务器UUID数据目录配置
ini
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock常见问题
如何查看MariaDB的数据目录?
使用以下命令查看数据目录:
sql
SHOW VARIABLES LIKE 'datadir';如何修改数据目录?
- 停止MariaDB服务
- 复制数据目录到新位置
- 修改配置文件中的
datadir参数 - 更新权限
- 启动MariaDB服务
如何优化InnoDB表空间?
- 使用独立表空间
- 合理设置
innodb_file_per_table=1 - 定期优化表:
OPTIMIZE TABLE table_name - 对于大表,考虑使用分区表
- 监控表空间使用情况
如何管理二进制日志?
- 设置合理的过期时间:
expire_logs_days=7 - 定期手动清理:
PURGE BINARY LOGS BEFORE '2023-01-01' - 监控二进制日志大小和数量
- 对于主从复制环境,确保从库已应用所有二进制日志
如何优化日志配置?
- 合理设置日志级别
- 启用慢查询日志,但设置合理的阈值
- 定期归档和清理日志文件
- 考虑使用日志管理工具(如ELK Stack)
如何查看MariaDB的进程状态?
使用以下命令查看进程状态:
sql
-- 查看服务器状态
SHOW GLOBAL STATUS;
-- 查看当前连接线程
SHOW PROCESSLIST;
-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;最佳实践
合理规划数据目录:
- 选择高性能存储设备
- 分离数据文件和日志文件到不同磁盘
- 预留足够的磁盘空间
优化表空间配置:
- 使用独立表空间
- 合理设置表空间大小
- 定期清理无用数据
优化日志配置:
- 启用必要的日志
- 设置合理的日志大小和过期时间
- 定期归档和清理日志
监控存储使用情况:
- 监控磁盘空间使用
- 监控表空间增长
- 设置存储使用告警
备份数据目录:
- 定期备份整个数据目录
- 备份配置文件
- 测试备份恢复
优化进程配置:
- 根据服务器资源调整
max_connections - 启用线程池
- 合理设置线程优先级
- 根据服务器资源调整
结论
了解MariaDB的物理架构对于DBA进行存储管理、性能优化和故障恢复至关重要。通过合理配置数据目录、表空间和日志文件,可以提高MariaDB的性能和可靠性。同时,定期监控存储使用情况和优化配置,可以确保MariaDB在生产环境中稳定运行。
