MySQL 磁盘满了,怎么办??

问题

使用命令发现磁盘使用率为100%了,还剩几十兆。

一系列神操作:

备份数据库,删除实例、删除数据库表、重启mysql服务.结果磁盘空间均为释放

怎么办

网上查了很多资源,说要进行磁盘碎片化整理。原因是datafree占据的空间太多啦。具体可以通过这个sql查看。

SELECT CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB') AS data_size,
CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB') AS max_data_size,
CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB') AS data_free,
CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB') AS index_size
FROM information_schema.tables WHERE TABLE_NAME = 'datainfo';

这个是后来的图了,之前的图没有留,当时显示一张表里的data_free都达到了20个G。

网上推荐的做法如下所示,对表格进行碎片化整理。

ALTER TABLE datainfo ENGINE=InnoDB;  
ANALYZE TABLE datainfo;

optimize table datainfo;

僵局

查看数据库版本为5.562不支持inodb,要么选择升级数据库。正在这时,有个不好的消息发生了,那张表格给删掉了,但是磁盘空间还是没有释放啊。所以对表进行碎片化整理的路也走不通了,因为表没了。。。

后来的神操作:

1、使用命令查看mysql安装的位置和配置文件所在的地方

mysql 1118 945 0 14:28 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

2、关闭mysql

service mysql stop

3、删除datadir目录下的ibdata1、ib_logfile0 ib_logfile1这些文件

4、 移动mysql的启动参数

mv /etc/my.cnf ./abc

5、重新启动mysql 发现磁盘空间释放了

service mysql start

磁盘空间终于释放了,下一步数据库还原

1、采用navicate备份工具,进行数据库备份

备份成功后生成了,生成psc文件。

200409141055.psc

2、新建一个数据库实例,设置数据库名和字符集

3、然后对备份数据库进行还原,点击还原

4、开始进行还原

第一次还原后发现还原后数据库表建成功了,但是表里面没有数据。
后来网上查找资料发现是,遇到错误就停止了。所以更改了还原的配置,再次进行还原。
之前是这样设置的

还原时当成一个事务进行了,遇到错误就停止了。

更改配置:

重新进行还原,数据库里的数据有了,并且验证没有问题。

问题解决

mysql碎片化产生的原因:

(1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;

(2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;

(3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;

清除碎片的优点:

降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率

注意:

1.MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可(我们现在是每月凌晨4点清理mysql所有实例下的表碎片)。

2.在OPTIMIZE TABLE运行过程中,MySQL会锁定表。因此,这个操作一定要在网站访问量较少的时间段进行。

3.清理student的105万条数据, OPTIMIZE TABLE 库.student;本地测试需要37秒。

自测:

大家可以用这条语句看看自己的系统的datafree大不大

show table status from 表名;

原文发表于 TesterHome
地址:https://testerhome.com/topics/23049 近期热文推荐:

1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

<think>好的,我现在遇到了无法连接本机的MySQL服务器的问题,需要一步步解决。首先,我得理清可能的原因,然后逐一排查。 首先,我应该检查MySQL服务是否正在运行。不同的操作系统有不同的方法。比如在Windows上,可以通过服务管理器查看MySQL的状态;而在Linux系统(比如Ubuntu)下,可能需要使用systemctl命令。如果服务没启动,自然无法连接,这时候启动服务应该能解决问题。 接下来,如果服务已经运行,但连接仍然失败,可能需要检查MySQL的监听地址。默认情况下,MySQL可能只绑定在本地回环地址127.0.0.1上,这意味着只能从本机访问。如果需要远程连接,或者确保本地应用能正确连接,可能需要修改配置文件(如my.cnf或my.ini),将bind-address设置为0.0.0.0,或者注释掉该行,然后重启MySQL服务。 然后,用户权限问题也是一个常见原因。即使服务运行正常,如果用户没有从特定主机连接的权限,也会导致连接被拒绝。例如,用户可能只被授权从localhost连接,而尝试使用127.0.0.1或者其他IP地址连接时会被拒绝。这时候需要用管理员账号登录MySQL,检查用户的权限,使用GRANT语句修改权限,或者创建允许从特定主机连接的用户。 防火墙设置也不能忽视。本机的防火墙可能阻止了MySQL的端口(默认3306),需要检查防火墙规则,确保端口是开放的。在Linux上,可以使用ufw或iptables查看规则,Windows则通过防火墙高级设置来检查入站规则。 端口冲突也是一个可能性,虽然不常见。如果另一个应用程序用了3306端口,MySQL就无法启动。这时候需要用netstat或者类似的工具检查端口用情况,结束冲突进程或者修改MySQL的端口配置。 此外,检查连接方式是否正确。比如,使用命令行连接时,可能需要指定-h参数为主机地址,-P指定端口,-u指定用户,-p提示输入密码。如果主机地址填写错误(比如用了本地IP而非127.0.0.1),或者端口号不对,也会导致连接失败。 如果以上步骤都检查过,问题依然存在,可能需要查看MySQL的错误日志,通常在数据目录下的hostname.err文件,或者通过系统日志工具查找相关错误信息。日志中可能会提示更具体的错误原因,比如配置文件错误、权限问题、磁盘空间不足等。 还有,确保使用的客户端库和MySQL服务器版本兼容。有时候,旧版本的客户端可能无法连接到新版本的服务器,或者存在协议不匹配的问题。更新客户端或服务器到兼容的版本可能解决。 最后,如果所有方法都尝试过仍然无效,可以考虑重新安装MySQL,或者寻求社区和官方文档的支持,看看是否有已知的问题和解决方案。</think>无法连接本机的MySQL服务器可按以下步骤排查: --- ### 一、检查MySQL服务状态 $$ systemctl status mysql $$ 1. **未运行**:启动服务 ```bash systemctl start mysql # Linux # 或通过Windows服务管理器启动 ``` 2. **已运行但异常**:查看错误日志 ```bash tail -f /var/log/mysql/error.log # 默认日志路径 ``` --- ### 二、验证监听配置 1. 检查MySQL绑定地址 修改配置文件(`my.cnf`或`my.ini`): ```ini bind-address = 0.0.0.0 # 允许所有IP连接 # 或注释掉此行 ``` > 需重启服务生效:`systemctl restart mysql` 2. 确认端口用 ```bash netstat -tuln | grep 3306 # 检查3306端口是否被监听 ``` --- ### 三、排查用户权限 1. 登录MySQL控制台 ```bash mysql -u root -p ``` 2. 检查用户授权 ```sql SELECT user, host FROM mysql.user; -- 查看允许连接的主机 GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost' IDENTIFIED BY '密码'; FLUSH PRIVILEGES; ``` --- ### 四、防火墙与端口放行 1. **Linux防火墙** ```bash ufw allow 3306/tcp # Ubuntu iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # CentOS ``` 2. **Windows防火墙** - 控制面板 → 高级安全 → 入站规则 → 允许3306端口 --- ### 五、测试连接方式 1. 本地连接命令 ```bash mysql -h 127.0.0.1 -P 3306 -u 用户名 -p ``` 2. 指定socket连接(仅限Linux) ```bash mysql -S /var/run/mysqld/mysqld.sock -u 用户名 -p ``` --- ### 六、其他可能原因 1. **配置文件错误** 检查`my.cnf`语法: ```bash mysqld --validate-config ``` 2. **磁盘空间不足** ```bash df -h # 检查MySQL数据目录所在分区 ``` --- ### 总结流程图 ```mermaid graph TD A[无法连接MySQL] --> B{服务是否运行?} B -->|否| C[启动服务] B -->|是| D{监听地址是否正确?} D -->|否| E[修改bind-address] D -->|是| F{用户权限是否允许?} F -->|否| G[调整用户授权] F -->|是| H{防火墙是否放行?} H -->|否| I[开放3306端口] H -->|是| J[检查日志定位具体错误] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值