数据库所在服务器磁盘满了怎么办?

大家好,我是G探险者。
给大家拜个晚年哈,节后上班第一天,打开电脑,发现数据库服务器连不上了。


幸亏,节后第一天上班的人不太多,领导还没来,我一番鼓捣解决了这个问题。
所以做个总结,记录一下。

故障现象

使用mysql提供的客户端工具在命令行连接mysql数据库时,报错如下:
ERROR 2002 (HY000) Can't connect to local MySQL server through socket 'tmp/mysql.sock'

故障分析

这个错误通常表示MySQL客户端无法通过指定的socket连接到本地MySQL服务器。可能的原因和解决方法如下:

  1. MySQL服务器未运行: 确保MySQL服务器正在运行。你可以通过在终端中运行以下命令检查MySQL服务器的状态:

    systemctl status mysql
    

    如果MySQL服务器未运行,则需要启动它:

    sudo systemctl start mysql
    
  2. MySQL配置错误: 检查MySQL的配置文件(通常是/etc/mysql/my.cnf/etc/my.cnf),确认socket参数的设置是否正确。确保socket参数指向正确的MySQL socket文件路径。

  3. MySQL socket文件丢失或损坏: 检查MySQL服务器的数据目录,确认mysql.sock文件是否存在。如果不存在,可能需要重建MySQL socket文件。

  4. 权限问题: 确保MySQL客户端有足够的权限访问MySQL socket文件以连接到MySQL服务器。你可以尝试使用sudo命令以超级用户权限运行MySQL客户端。

  5. MySQL服务器正在监听TCP连接而非socket连接: 在某些情况下,MySQL服务器可能配置为仅监听TCP连接而不是socket连接。你可以尝试在连接时指定MySQL服务器的主机地址和端口。

故障定位

根据以往的经验,大概率是磁盘满了导致宕机。
那么如何确定是磁盘满了导致数据库宕机?

  1. 通过df -h 命令查看磁盘占用情况。分析下是哪个路径下的磁盘满了。
  2. 通过ps aux|grep mysql 命令查看启动mysql的命令。分析出mysql的部署位置,以及mysql的错误日志文件的位置。
  3. 通过查看mysql的错误日志,来确认。

    通过以上几步交叉确认,确实是数据库磁盘满了导致连接不上了。

那接下来怎么办呢?

解决办法

  1. 释放磁盘空间:

    • 删除不必要的文件或目录:
      rm -rf /path/to/unneeded_files_or_directories
      
    • 清理临时文件:
      sudo rm -rf /tmp/*
      
  2. 清理 MySQL 日志文件:

    • 删除旧的错误日志文件:
      sudo rm /var/log/mysql/error.log
      
    • 清理慢查询日志文件:
      sudo rm /var/log/mysql/slow.log
      
    • 调整二进制日志文件的大小和轮转策略:
      # 编辑 MySQL 配置文件
      sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
      # 设置二进制日志文件大小
      binlog_size = 100M
      # 设置二进制日志文件轮转策略
      expire_logs_days = 7
      
  3. 优化数据库:

    • 删除不必要的数据:
      DELETE FROM table_name WHERE condition;
      
    • 重新组织表格和索引:
      OPTIMIZE TABLE table_name;
      
    • 压缩表格:
      ALTER TABLE table_name ENGINE=InnoDB;
      
  4. 增加磁盘空间:

    • 添加新的磁盘分区并挂载到 MySQL 数据目录下,例如:
      # 创建新的分区
      sudo fdisk /dev/sdb
      # 格式化分区
      sudo mkfs.ext4 /dev/sdb1
      # 创建挂载点
      sudo mkdir /mnt/mysql_data
      # 挂载新的分区
      sudo mount /dev/sdb1 /mnt/mysql_data
      
  5. 重新启动 MySQL 服务:

    sudo systemctl restart mysql
    

以上解决办法,能顶得了一时,顶不了一世,如何系统的解决这类问题呢?

对头,通过shell脚本来实现自动化,解放咱们的双手。

自动化解决

  1. 定期备份和归档数据:

    • 使用 mysqldump 命令定期备份数据库,并将备份数据归档到其他存储位置,例如:
      mysqldump -u username -p database_name > /path/to/backup/db_backup_$(date +'%Y-%m-%d_%H-%M-%S').sql
      
    • 将备份数据上传到云存储服务或网络共享目录,确保数据安全可靠。
    • 定期备份的自动化脚本。
      #!/bin/bash
      
      # MySQL 连接参数
      DB_USER="your_username"
      DB_PASSWORD="your_password"
      DB_NAME="your_database_name"
      
      # 备份目录和文件名
      BACKUP_DIR="/path/to/backup"
      BACKUP_FILE="${BACKUP_DIR}/db_backup_$(date +'%Y-%m-%d_%H-%M-%S').sql"
      
      # 执行备份
      mysqldump -u"${DB_USER}" -p"${DB_PASSWORD}" "${DB_NAME}" > "${BACKUP_FILE}"
      
      # 检查备份是否成功
      if [ $? -eq 0 ]; then
          echo "数据库备份成功:${BACKUP_FILE}"
      else
          echo "数据库备份失败"
      fi
      
  2. 监控磁盘空间:

    • 设置监控系统,定期检查数据库服务器的磁盘空间使用情况,例如使用 df -h 命令:
      df -h /path/to/mysql_data_directory
      
    • 使用监控工具(如 Nagios、Zabbix 等)来监控磁盘空间,并设置警报规则,当磁盘空间即将满时发送警报通知管理员。
  3. 定期清理历史数据:

    • 使用定期的数据清理任务来清理数据库中的历史数据,例如删除一周前的日志记录:
      DELETE FROM log_table WHERE timestamp_column < NOW() - INTERVAL 7 DAY;
      
    • 定期清理的自动化脚本。
       #!/bin/bash
       # MySQL 连接参数
       DB_USER="your_username"
       DB_PASSWORD="your_password"
       DB_NAME="your_database_name"
         
       # 清理历史数据的 SQL 语句
       CLEANUP_SQL="DELETE FROM log_table WHERE timestamp_column < NOW() - INTERVAL 7 DAY;"
       
       # 执行清理操作
       mysql -u"${DB_USER}" -p"${DB_PASSWORD}" -e"${CLEANUP_SQL}" "${DB_NAME}"
      
  4. 优化数据库:

    • 使用 EXPLAIN 命令分析查询语句的执行计划,并优化查询语句、索引和表结构,以减少数据库的存储空间使用量。
  5. 增加磁盘空间:

    • 添加额外的磁盘并将其挂载到数据库目录下,例如:
      # 创建新的分区
      sudo fdisk /dev/sdb
      # 格式化分区
      sudo mkfs.ext4 /dev/sdb1
      # 创建挂载点
      sudo mkdir /mnt/mysql_data
      # 挂载新的分区
      sudo mount /dev/sdb1 /mnt/mysql_data
      

通过以上示例,你可以系统性的解决数据库服务器因为磁盘满了导致连接不上的问题,并确保数据库服务器的稳定运行。请根据你的具体情况和需求调整示例中的路径和参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394687.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试redis篇-02缓存穿透

原理 例&#xff1a; 一个get请求&#xff1a;api/news/getById/1 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 解决方案一 缓存空数据&#xff0c;查询返回的数据为空&#xff0c;仍把…

Visual Studio Code安装Oracle SQL Developer插件

Visual Studio Code&#xff0c;简称VS Code&#xff0c;是最流行的IDE之一。SQL Developer作为面向 Oracle 数据库专业人员的查询、开发和管理工具&#xff0c;现已可作为插件&#xff08;Extension&#xff09;在VS Code中安装。无需安装 Java, .NET, 和Oracle Client 。 数…

多线程——

一、为什么要有多线程&#xff1f; 1、线程与进程 进程&#xff1a;进程是程序的基本执行实体 举例&#xff1a;在任务管理器中&#xff0c;一个软件运行之后&#xff0c;它就是一个进程 线程&#xff1a;&#xff08;简单理解&#xff0c;线程就说应用软件中互相独立&…

Positive SSL 证书介绍

Positive SSL 是一种受欢迎的 SSL 证书&#xff0c;提供了卓越的安全性、性价比和品牌信任。以下是对 Positive SSL 在这些方面的简要介绍&#xff1a; 1. 安全性&#xff1a; Positive SSL 证书采用强大的加密技术&#xff0c;确保网站和用户之间的数据传输是安全的。它使用…

PyCharm 取消所有断点

PyCharm 取消所有断点 1. Run -> View Breakpoints...2. Python Line Breakpoint3. Remove - DoneReferences 1. Run -> View Breakpoints… 2. Python Line Breakpoint ​​​ 3. Remove - Done References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

spring boot自动装配及自动装配条件判断

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

第三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:pyttsx3实现语音助手经典案例

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录一、项目背景和目标二、雏形示例代码三、扩展思路介绍四、与其他库和API集成示例代码五、自定义语音示例代码六、多语言支持示例代码七、语音控制应用程序示例代码八、文本转语音…

WouoUI-PageVersion 一个用于快速构建具有丝滑OLED_UI动画的项目

WouoUI-PageVersion 写在前面 简介&致谢 Air001的TestUI例子的b站的演示视频 Air001的LittleClock例子的b站演示视频: https://www.bilibili.com/video/BV1J6421g7H1/ Stm32的TestUI例子的b站演示视频: https://www.bilibili.com/video/BV1mS421P7CZ/ 所有演示的工程文…

黑马程序员微信小程序学习总结9.插槽(slot)、父子组件中的通信的3种方式和自定义组件behaviors

目录 自定义组件中&#xff1a;插槽&#xff08;slot&#xff09;自定义组件中&#xff1a;父子组件中的通信的3种方式属性绑定&#xff08;总结7讲过&#xff09;事件绑定&#xff08;子向父传参&#xff09;获取组件实例 自定义组件behaviors同名字段的覆盖和组合规则&#x…

Kotlin基础——泛型

泛型类型参数 编译器一般可以推导出类型实参 若创建空的list&#xff0c;则需要显示指定类型实参&#xff0c;可以用如下两种方式 val name: MutableList<String> mutableListOf()val name2 mutableListOf<String>()泛型函数 public fun <T> List<T&…

宝塔安装MySQL、设置MySQL密码、设置navicat连接

1、登录宝塔面板进行安装 2、设置MySQL连接密码 3、安装好了设置navicat连接 登录MySQL [roothecs-394544 ~]# mysql -uroot -p Enter password: 切换到MySQL数据 mysql> use mysql Database changed mysql> 查询用户信息 mysql> select host,user from user; ---…

生信学院|02月23日《ECAD数据到MCAD模型》

课程主题&#xff1a;ECAD数据到MCAD模型 课程时间&#xff1a;2024年02月23日 14:00-14:30 主讲人&#xff1a;陈冬冬 生信科技 售后服务工程师 CircuitWorks概述CircuitWorks工具栏&#xff1b;零部件库和属性信息&#xff1b;对ECAD数据的基本操作&#xff1b;将装配体输…

绝地求生:pubg全年活动整理

2023年整理&#xff0c;2024展望。2023年1月是4神兽&#xff0c;24年2月是西游&#xff0c;25年1月呢&#xff1f; 2023新3月4神兽结束后是AUG黑箱和6周年。 2024年3月也会出成长型武器黑箱和7周年。 4月&#xff1a;新通行证、战队联名、服装套装。 5月&#xff1a;是一些套装…

学习Android的第十六天

目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorH…

基于Java SSM框架实现精准扶贫管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现精准扶贫管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用户的需…

【HarmonyOS】鸿蒙开发之Slider组件——第3.5章

组件应用场景: 设备音量大小&#xff0c;调节屏幕亮度等需求 slider组件内options属性简介 value&#xff1a;滑动条当前进度值。 min&#xff1a;设置滑动条设置最小值。 max&#xff1a;设置滑动条设置最大值&#xff0c;默认为 100 。 step&#xff1a;设置滑动条滑动跳动…

遨博I20协作臂关节逆解组Matlab可视化

AUBO I20协作臂关节逆解组Matlab可视化 前言1、RTB使用注意点2、代码与效果2.1、完整代码2.2、运行效果 总结 前言 注意&#xff1a;请预先配置好Matlab和RTB机器人工具箱环境&#xff0c;本文使用matlab2022b和RTB10.04版本 工作需要&#xff0c;使用matlab实现对六轴机械臂…

初识 Rust 语言

目录 前言一、Rust 的背景二、Rust的特性三、部署开发环境&#xff0c;编写一个简单demo1、在ubuntu 20.04部署环境2、编写demo测试 四、如何看待Linux内核引入Rust 前言 自Linux 6.1起&#xff0c;初始的Rust基础设施被添加到Linux内核中。此后为了使内核驱动程序能够用Rust编…

Vue3+vite搭建基础架构(6)--- 使用vue-router

Vue3vite搭建基础架构&#xff08;6&#xff09;--- 使用vue-router 说明官方文档安装vue-router使用vue-router测试vue-router 说明 这里记录下自己在Vue3vite的项目使用vue-router的过程&#xff0c;不使用ts语法&#xff0c;方便以后直接使用。这里承接自己的博客Vue3vite搭…

在SpringBoot中@PathVariable与@RequestParam的区别

PathVariable GetMapping("/{userId}")public R<User> getUserById(PathVariable Long userId) {return userService.getUserById(userId);} // 根据id获取一条数据 function getStudentDataByIdAndDisplayInput(id) {// 发送 AJAX 请求$.ajax({url: /dorm/st…