独立服务器导入13GB MySQL数据库内存不足 求my.cnf优化配置方案
MySQL 13GB库导入4GB内存服务器内存溢出配置调整方案
核心错误配置修正
- 修复
max_connections参数错误:原配置max_connections = 50M单位误用,该参数为连接数计数,无存储单位,填写50M会被MySQL解析为52428800个连接,直接导致内存预计算值远超服务器物理内存上限,是内存溢出的核心诱因,调整为max_connections = 10即可,导入场景仅需1个活跃连接,保留少量冗余即可。 - 下调单连接缓冲区配置:
sort_buffer_size/read_buffer_size/read_rnd_buffer_size/join_buffer_size为每个连接独立分配的内存空间,原配置单缓冲区50M,即使仅10个连接就会占用2GB内存,远超服务器可用空间,统一调整为2M,满足导入基础需求即可,牺牲性能换取内存稳定性。
新增/优化其他配置项
在[mysqld]段新增以下参数:
# 关闭无用查询缓存降低内存占用 query_cache_size = 0 query_cache_type = 0 # 跳过文件系统缓存直接写入SSD,减少额外内存占用 innodb_flush_method = O_DIRECT # 调小事务日志缓冲区 innodb_log_buffer_size = 8M # 调小网络传输缓冲区 net_buffer_length = 8K # 导入阶段关闭双写机制减少IO与内存开销,导入完成后改回1即可 innodb_doublewrite = 0 # 优化自增锁逻辑提升导入速度 innodb_autoinc_lock_mode = 2
保留原配置中以下参数即可,无需调整:
sql_mode="" key_buffer_size = 50M innodb_buffer_pool_size = 100M innodb_buffer_pool_instances = 2 innodb_log_file_size = 50M innodb_write_io_threads = 2 innodb_flush_log_at_trx_commit = 0 wait_timeout = 600 max_allowed_packet = 64M
导入操作辅助优化
- 导入前关闭服务器上所有非必要进程(如Web服务、定时任务等),尽可能释放内存空间。
- 若使用mysqldump导出的SQL文件,可将大文件拆分为100-200M的小文件逐个导入,每导入一个文件后触发一次MySQL内存释放,避免内存持续累积占用。
- 导入前调整MySQL进程的OOM优先级,避免被系统优先杀死:
echo -1000 > /proc/$(pidof mysqld)/oom_score_adj - 全程使用单线程导入,不要开启多线程导入工具,避免额外连接占用内存。
内容的提问来源于stack exchange,提问作者Nikola Milosevic
相关产品推荐
相关产品推荐

