本文档风哥主要介绍MySQL 8.4的存储配置与优化,包括存储层次结构、存储设备选择、文件系统规划、表空间配置等内容。风哥教程参考MySQL官方文档The InnoDB Storage
Engine等。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 MySQL存储层次结构
MySQL的存储层次结构从底层到上层包括:
- 物理存储层:磁盘、SSD等存储设备
- 文件系统层:操作系统文件系统(ext4、XFS等)
- 存储引擎层:InnoDB、MyISAM等存储引擎
- 表空间层:系统表空间、独立表空间、临时表空间
- 数据结构层:B+树索引、数据页、行格式
1.2 存储配置的重要性
合理的存储配置对MySQL数据库至关重要:
- 提高数据读写性能,降低I/O延迟
- 确保数据安全性和可靠性
- 优化存储资源利用率,降低成本
- 支持高并发和大规模数据存储
学习交流加群风哥微信: itpux-com
1.3 主要存储引擎特性
mysql -u root -p -e “SHOW ENGINES;”
Enter password: Fgedu123!
+——————–+———+—————————————————————-+————–+——+————+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+——————–+———+—————————————————————-+————–+——+————+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+——————–+———+—————————————————————-+————–+——+————+
Part02-生产环境规划与建议
2.1 存储设备选择
根据业务需求和性能要求,选择合适的存储设备至关重要:
lsblk -o NAME,SIZE,TYPE,MODEL
NAME SIZE TYPE MODEL
nvme0n1 477G disk Samsung SSD 970 EVO Plus 500GB
sda 2.7T disk ST3000DM001-1ER1
sdb 2.7T disk ST3000DM001-1ER1
不同存储设备的特点与适用场景:
- HDD:容量大、价格低、速度慢,适用于归档数据、备份存储
- SSD:速度快、价格高、容量相对较小,适用于生产数据库、高频访问数据
- NVMe SSD:超高速、低延迟,适用于高并发、低延迟应用
- 存储阵列:高可用、高性能、可扩展,适用于企业级数据库
2.2 文件系统规划
生产环境中推荐使用XFS文件系统,它提供了更好的性能和可靠性:
cat /proc/filesystems
# 创建XFS文件系统
mkfs.xfs -f -i size=512 /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=16777216 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=67108864, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=32768, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 挂载XFS文件系统(添加到/etc/fstab)
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo “UUID=$UUID /mysql xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2” >> /etc/fstab
mount -a
# 验证挂载
mount | grep /mysql
/dev/sdb1 on /mysql type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=256k,sunit=0,swidth=0,noquota)
学习交流加群风哥QQ113257174
2.3 表空间规划
表空间规划建议:
- 系统表空间:初始大小1-2G,自动扩展
- 独立表空间:每个表一个文件,便于管理
- 临时表空间:初始大小12M,最大50-100G
- 重做日志:多个文件,总大小为缓冲池的1/4到1/2
Part03-生产环境项目实施方案
3.1 存储配置参数设置
vi /etc/my.cnf
[mysqld]
# 存储引擎配置
default_storage_engine=InnoDB
innodb_file_per_table=1
# 系统表空间配置
innodb_data_file_path=ibdata1:1G:autoextend
# 临时表空间配置
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:50G
# 重做日志配置
innodb_log_files_in_group=2
innodb_log_file_size=1G
innodb_log_group_home_dir=/mysql/logs
# 保存并退出后重启MySQL
systemctl restart mysqld
# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘innodb_file_per_table’; SHOW VARIABLES LIKE
‘innodb_data_file_path’; SHOW VARIABLES LIKE ‘innodb_log_file_size’;”
Enter password: Fgedu123!
+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| innodb_file_per_table | ON |
+———————–+——-+
+————————+——————-+
| Variable_name | Value |
+————————+——————-+
| innodb_data_file_path | ibdata1:1G:autoextend |
+————————+——————-+
+—————————+————+
| Variable_name | Value |
+—————————+————+
| innodb_log_file_size | 1073741824 |
+—————————+————+
3.2 表空间配置
mysql -u root -p -e “CREATE DATABASE fgedudb; USE fgedudb; CREATE TABLE fgedu_test (id INT PRIMARY KEY
AUTO_INCREMENT, name VARCHAR(100)); INSERT INTO fgedu_test (name) VALUES (‘test’);”
Enter password: Fgedu123!
# 查看独立表空间文件
ls -l /mysql/data/fgedudb/
-rw-r—–. 1 mysql mysql 8632 Apr 2 10:30 fgedu_test.frm
-rw-r—–. 1 mysql mysql 98304 Apr 2 10:30 fgedu_test.ibd
# 配置表空间自动扩展
mysql -u root -p -e “ALTER TABLE fgedudb.fgedu_test AUTOEXTEND_SIZE = 64M;”
Enter password: Fgedu123!
3.3 存储引擎优化
innodb_buffer_pool_size=16G
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
# I/O线程配置
innodb_read_io_threads=16
innodb_write_io_threads=16
# I/O容量配置(根据存储设备性能调整)
innodb_io_capacity=4000
innodb_io_capacity_max=8000
# 异步I/O配置
innodb_use_native_aio=1
# 刷新策略配置
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=2
# 保存配置并重启MySQL
systemctl restart mysqld
# 验证缓冲池配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW VARIABLES LIKE
‘innodb_buffer_pool_instances’;”
Enter password: Fgedu123!
+————————-+—————-+——+——–+—————————-+—————+
| Variable_name | Value | Type | Access | Context | Comment |
+————————-+—————-+——+——–+—————————-+—————+
| innodb_buffer_pool_size | 17179869184 | bigint | SYS_VAR | GLOBAL | Buffer pool size in bytes. |
+————————-+—————-+——+——–+—————————-+—————+
+——————————-+——-+——+——–+———————-+——————————+
| Variable_name | Value | Type | Access | Context | Comment |
+——————————-+——-+——+——–+———————-+——————————+
| innodb_buffer_pool_instances | 8 | int | SYS_VAR | GLOBAL | Number of buffer pool instances. |
+——————————-+——-+——+——–+———————-+——————————+
风哥提示:缓冲池大小应根据服务器内存和其他应用程序的内存需求进行合理分配,避免内存不足导致系统性能下降。更多学习教程公众号风哥教程itpux_com
Part04-生产案例与实战讲解
4.1 SSD存储配置案例
smartctl -a /dev/nvme0n1 | grep “Model Number\|Serial Number\|Firmware Version”
Model Number: Samsung SSD 970 EVO Plus 500GB
Serial Number: S5H4NG0N8201234
Firmware Version: 3B2QEXM7
# 配置NVMe SSD用于MySQL数据存储
mkfs.xfs -f -m reflink=1 /dev/nvme0n1p1
mkdir -p /mysql/data
mount -t xfs -o noatime,nodiratime,discard /dev/nvme0n1p1 /mysql/data
# 设置权限
chown -R mysql:mysql /mysql/data
# 更新/etc/fstab
UUID=$(blkid -s UUID -o value /dev/nvme0n1p1)
echo “UUID=$UUID /mysql/data xfs defaults,noatime,nodiratime,discard 0 2” >> /etc/fstab
4.2 表空间优化实战
mysql -u root -p -e “SELECT table_schema, table_name, round(((data_length + index_length) / 1024 / 1024), 2)
as MB FROM information_schema.tables WHERE table_schema = ‘fgedudb’ ORDER BY MB DESC;”
Enter password: Fgedu123!
# 优化表空间
mysql -u root -p -e “USE fgedudb; OPTIMIZE TABLE fgedu_test;”
Enter password: Fgedu123!
+—————–+————+———-+——————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————–+————+———-+——————————————————————-+
| fgedudb.fgedu_test | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| fgedudb.fgedu_test | optimize | status | OK |
+—————–+————+———-+——————————————————————-+
# 调整表结构优化存储
mysql -u root -p -e “USE fgedudb; ALTER TABLE fgedu_test ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;”
Enter password: Fgedu123!
4.3 存储性能测试
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
.tar -xzf 1.0.20.tar.gz
cd sysbench-1.0.20
./autogen.sh
./configure
make -j4
make install
# 测试随机读性能
sysbench –test=fileio –file-total-size=10G –file-test-mode=rndrd –time=30 –max-requests=0 run
# 测试随机写性能
sysbench –test=fileio –file-total-size=10G –file-test-mode=rndwr –time=30 –max-requests=0 run
# 清理测试文件
sysbench –test=fileio –file-total-size=10G cleanup
Part05-风哥经验总结与分享
5.1 存储配置最佳实践
- 存储设备选择:生产环境优先选择SSD或NVMe SSD,备份环境可使用HDD
- 文件系统:推荐使用XFS,性能和可靠性更好
- 表空间配置:使用独立表空间,合理设置系统表空间和临时表空间大小
- 缓冲池优化:设置为物理内存的50-70%,合理配置实例数量
- I/O优化:根据存储设备性能调整I/O线程和容量参数
5.2 常见问题与解决方案
# 解决方案:
1. 查看表空间使用情况:SELECT table_schema, table_name, round(((data_length + index_length) / 1024 / 1024), 2) as MB
FROM information_schema.tables ORDER BY MB DESC LIMIT 10;
2. 清理大表数据或增加存储容量
3. 优化表结构:OPTIMIZE TABLE table_name;
# 问题2:存储性能下降
# 解决方案:
1. 检查存储设备健康状态:smartctl -a /dev/sdb
2. 检查I/O负载:iostat -x 1
3. 优化SQL查询减少I/O操作
4. 调整缓冲池大小和I/O参数
# 问题3:临时表空间过大
# 解决方案:
1. 限制临时表空间大小:innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:50G
2. 优化使用临时表的查询
3. 定期重启MySQL释放临时表空间
5.3 存储性能监控
定期监控存储性能,及时发现和解决问题:
iostat -x 5
# 监控磁盘空间
df -h /mysql
# 监控MySQL I/O状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Innodb_data%’; SHOW GLOBAL STATUS LIKE ‘Innodb_log%’;”
Enter password: Fgedu123!
# 创建存储监控脚本
cat > /mysql/scripts/storage_monitor.sh << 'EOF' #!/bin/bash # storage_monitor.sh #
from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn DATE=$(date +"%Y-%m-%d %H:%M:%S")
DISK_USAGE=$(df -h /mysql | grep /mysql | awk '{print $5}' | sed 's/%//' ) IO_STATS=$(iostat -x -d
/dev/sdb 1 1 | grep sdb | awk '{print $6, $7, $14, $15}' ) # 记录监控数据
echo "$DATE, Disk Usage: ${DISK_USAGE}%, IO Stats: $IO_STATS">> /mysql/logs/storage_monitor.log
# 如果磁盘使用率超过80%,发送告警
if [ $DISK_USAGE -gt 80 ]; then
echo “MySQL存储使用率超过80%: ${DISK_USAGE}%” | mail -s “MySQL存储告警” admin@fgedu.net.cn
fi
EOF
# 赋予执行权限并添加到定时任务
chmod +x /mysql/scripts/storage_monitor.sh
crontab -l > /tmp/crontab.tmp
echo “*/5 * * * * /mysql/scripts/storage_monitor.sh” >> /tmp/crontab.tmp
crontab /tmp/crontab.tmp
rm /tmp/crontab.tmp
from MySQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
