一、为什么需要对SQLAdmin进行扩容
随着业务增长,SQLAdmin可能面临以下扩容需求:
| 扩容类型 | 触发原因 | 解决方案 |
|---|---|---|
| 存储空间不足 | 数据库文件过大 | 添加新磁盘、扩容现有分区 |
| 内存不足 | 大查询导致OOM | 增加物理内存、优化配置 |
| 并发连接数受限 | 用户访问量增加 | 调整MySQL最大连接数 |
| PHP脚本超时 | 复杂查询执行时间长 | 调整PHP超时设置 |
| 文件上传限制 | 无法导入大SQL文件 | 修改PHP上传限制 |
二、存储空间扩容
2.1 添加新磁盘扩容
当数据目录所在分区空间不足时,最直接的方式是添加新磁盘。
步骤1:查看当前磁盘使用情况
df -h
lsblk
步骤2:创建新分区并格式化
sudo fdisk /dev/sdb
# 输入 n 创建新分区
# 输入 w 保存退出
sudo mkfs.ext4 /dev/sdb1
步骤3:挂载新磁盘
sudo mount /dev/sdb1 /mnt/mysql_data
sudo mkdir -p /mnt/mysql_data/mysql
步骤4:迁移MySQL数据目录
# 停止MySQL服务
sudo systemctl stop mysql
# 迁移数据
sudo rsync -av /var/lib/mysql/ /mnt/mysql_data/mysql/
# 修改MySQL配置
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在配置文件中添加:
[mysqld]
datadir=/mnt/mysql_data/mysql
步骤5:设置永久挂载
# 获取新分区UUID
sudo blkid /dev/sdb1
# 编辑fstab
sudo nano /etc/fstab
添加:
UUID=xxxx-xxxx-xxxx /mnt/mysql_data ext4 defaults 0 2
步骤6:重启MySQL
sudo systemctl start mysql
2.2 清理无用数据释放空间
# 进入MySQL shell
mysql -u root -p
# 查看数据库大小
SELECT table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.TABLES
GROUP BY table_schema;
# 删除不需要的数据
DROP DATABASE old_database;
# 优化表
OPTIMIZE TABLE database_name.table_name;
三、内存扩容与优化
3.1 查看当前内存使用情况
free -h
htop
mysql -u root -p -e "SHOW STATUS LIKE 'Qcache%';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
3.2 优化MySQL内存配置
编辑MySQL配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
关键配置项:
[mysqld]
# InnoDB缓冲池大小(建议为物理内存的50-70%)
innodb_buffer_pool_size = 2G
# 查询缓存(MySQL 5.7已移除,仅早期版本)
query_cache_size = 128M
query_cache_type = 1
# 临时表内存大小
tmp_table_size = 256M
max_heap_table_size = 256M
# 连接数内存
max_connections = 200
3.3 PHP内存限制调整
如果SQLAdmin使用PHP运行,需要调整PHP内存限制:
sudo nano /etc/php/8.x/apache2/php.ini # 或 nginx/fpm/php.ini
修改:
memory_limit = 512M
max_execution_time = 300
重启Web服务器:
sudo systemctl restart apache2 # 或 nginx
四、并发连接数扩容
4.1 查看当前连接数配置
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"
mysql -u root -p -e "SHOW STATUS LIKE 'Max_used_connections';"
4.2 调整最大连接数
编辑MySQL配置:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
max_connections = 500
或者动态调整(临时生效):
mysql -u root -p -e "SET GLOBAL max_connections = 500;"
4.3 连接池优化
对于高并发场景,可以考虑使用连接池:
[mysqld]
thread_pool_size = 16
thread_pool_max_threads = 2000
thread_pool_stall_limit = 500
五、文件上传大小扩容
5.1 修改PHP上传限制
sudo nano /etc/php/8.x/apache2/php.ini
修改以下参数:
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
max_input_time = 600
memory_limit = 512M
重启PHP-FPM:
sudo systemctl restart php8.x-fpm
5.2 修改SQLAdmin配置
sudo nano /var/www/html/sqladmin/config.inc.php
添加:
$cfg['UploadDir'] = '/var/lib/sqladmin/upload';
$cfg['SaveDir'] = '/var/lib/sqladmin/save';
$cfg['ExecTimeLimit'] = 600;
$cfg['MemoryLimit'] = '512M';
创建目录:
sudo mkdir -p /var/lib/sqladmin/upload /var/lib/sqladmin/save
sudo chown -R www-data:www-data /var/lib/sqladmin
六、InnoDB表空间扩容
6.1 查看InnoDB表空间使用情况
mysql -u root -p -e "
SELECT file_name, tablespace_name, data_size, data_free
FROM information_schema.files
WHERE tablespace_name IS NOT NULL;
"
6.2 在线扩容InnoDB表空间
如果使用innodb_file_per_table,可以在线扩容:
mysql -u root -p -e "ALTER TABLE database.table ENGINE = InnoDB;"
6.3 调整InnoDB日志文件大小
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
innodb_log_file_size = 1G
innodb_log_files_in_group = 3
修改后需要重启MySQL:
sudo systemctl stop mysql
sudo rm /var/lib/mysql/ib_logfile* # 删除旧日志文件
sudo systemctl start mysql
七、性能优化建议
7.1 启用慢查询日志
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
7.2 定期优化数据库
创建定时任务:
sudo crontab -e
添加:
0 3 * * * mysqlcheck -o -A -u root -pYourPassword
7.3 使用索引优化查询
-- 查看慢查询
SHOW FULL PROCESSLIST;
-- 分析查询
EXPLAIN SELECT * FROM table_name WHERE column = 'value';
-- 添加索引
CREATE INDEX idx_column ON table_name(column);
八、扩容后验证
扩容完成后,需要验证各项指标:
# 1. 检查磁盘空间
df -h
# 2. 检查内存使用
free -h
# 3. 检查MySQL连接数
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
# 4. 测试大文件上传
mysql -u root -p < large_dump.sql
# 5. 检查错误日志
sudo tail -f /var/log/mysql/error.log
九、常见问题解决方案
Q1: 扩容后MySQL无法启动?
原因:可能是因为数据目录权限问题或配置文件错误
解决:
sudo chown -R mysql:mysql /var/lib/mysql
sudo mysqld --validate-config # 验证配置
Q2: 扩容存储后仍然提示空间不足?
原因:可能是临时目录空间不足
解决:
# 检查tmpdir
mysql -u root -p -e "SHOW VARIABLES LIKE 'tmpdir';"
# 移动临时目录
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
tmpdir = /mnt/large_disk/tmp
Q3: 如何估算需要多少存储空间?
估算公式:
总需求 = 数据量 × 1.5(增长预留)× 1.2(索引和日志)
建议始终预留30%以上的剩余空间。
十、总结
SQLAdmin扩容是一个系统性的工作,需要从多个维度综合考虑:
| 扩容维度 | 优先级 | 实施方案 |
|---|---|---|
| 存储空间 | 高 | 添加磁盘、迁移数据目录 |
| 内存 | 高 | 调整InnoDB缓冲池、优化配置 |
| 连接数 | 中 | 增加max_connections |
| 文件上传 | 中 | 修改PHP和SQLAdmin配置 |
| 性能 | 低 | 优化查询、启用索引 |
建议在扩容前做好数据备份,并分阶段进行扩容测试,确保业务平稳过渡。
注:本文基于Ubuntu 22.04 LTS和MySQL 8.0编写。