MySQL导入2.6GB .sql文件遇进程休眠及服务器自动关闭问题
问题描述
需要导入一个2.6GB的.sql文件,执行命令:
sudo mysql -u root -p <dbname> > ~/<filename>.sql
此前已通过phpMyAdmin创建对应数据库。命令运行30分钟后,在另一个窗口执行SHOW PROCESSLIST;得到如下结果:
mysql> SHOW PROCESSLIST; +-----+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+------+-----------+------+---------+------+-------+------------------+ | 149 | root | localhost | test | Sleep | 1716 | | NULL | | 155 | root | localhost | NULL | Query | 0 | init | SHOW PROCESSLIST | +-----+------+-----------+------+---------+------+-------+------------------+ 2 rows in set (0.00 sec)
请问进程为何处于休眠状态?该如何解决?另外,MySQL服务器在偏好设置中启动后频繁自动关闭,该如何处理?
一、导入进程休眠的原因及解决办法
原因
- 命令重定向符号用反了:你当前用的是
>(输出重定向),这个命令的作用是把MySQL的查询结果导出到指定文件,而非把文件内容导入数据库。MySQL客户端会一直等待你输入SQL指令,但你没有任何输入,所以进程进入Sleep状态。 - 若命令正确仍出现Sleep,可能是导入过程中遇到锁表、系统资源不足(内存/CPU不够)等问题导致进程挂起,但你的情况核心是命令写错了。
解决步骤
- 修正导入命令:把重定向符号改成
<,正确的导入命令为:
sudo mysql -u root -p <dbname> < ~/<filename>.sql
执行后输入root密码,即可开始导入。
2. 监控导入状态:导入大文件时,再次执行SHOW PROCESSLIST;,正常情况下State列会显示Executing、Copying to tmp table等执行中的状态,而非Sleep。
3. 优化大文件导入速度:针对2.6GB的大文件,可做以下优化:
- 导入前在MySQL客户端执行:
导入完成后执行SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;COMMIT;恢复设置,避免频繁提交和约束检查拖慢速度。 - 修改MySQL配置文件(
my.cnf/my.ini),调大max_allowed_packet(建议设为256M以上)、innodb_buffer_pool_size(尽量分配系统可用内存的70%)等参数,提升导入性能。
二、MySQL服务器频繁自动关闭的处理办法
- 优先查看错误日志:错误日志会记录崩溃原因,常见位置:
- Linux:
/var/log/mysql/error.log - Mac(brew安装):
/usr/local/var/mysql/[你的主机名].err - Windows:
C:\ProgramData\MySQL\MySQL Server X.X\Data\[你的主机名].err
查看日志里的报错关键词,比如out of memory、permission denied等,定位问题。
- Linux:
- 检查目录权限:确保MySQL的数据目录和日志目录的所有者是
mysql用户,权限正确:sudo chown -R mysql:mysql /var/lib/mysql sudo chmod -R 755 /var/lib/mysql - 调整内存配置:若日志显示内存不足,修改
my.cnf中的内存参数:innodb_buffer_pool_size:不要超过系统可用内存的70%,比如8G内存设为4Gkey_buffer_size:MyISAM引擎用,设为128M-256M即可
- 检查端口占用:确认3306端口没被其他程序占用:
若有占用,停止对应程序或修改MySQL配置文件中的netstat -tulpn | grep 3306port参数换端口。 - 重新初始化MySQL:若以上方法无效,先备份数据,再执行初始化命令:
完成后重启MySQL服务。sudo mysqld --initialize --user=mysql
内容的提问来源于stack exchange,提问作者Uday Bhargav
相关产品推荐
相关产品推荐

