AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 624457
Accepted
Antoine Benkemoun
Antoine Benkemoun
Asked: 2014-08-28 07:16:35 +0800 CST2014-08-28 07:16:35 +0800 CST 2014-08-28 07:16:35 +0800 CST

与 puppet-dashboard 一起使用时,如何防止 MySQL 增加其磁盘空间使用量?

  • 772

设置

我们有一个使用 MySQL v5.1.73(innoDB 存储引擎)和 puppet-dashboard 版本 1.2.23 设置的 Debian Linux。您可能已经猜到了,puppet-dashboard 使用 MySQL 作为其后端。

此外,它不应该是相关的,但这是 vSphere 5.5 上的 VMware 虚拟机。

问题

问题在于,尽管 puppet 节点的数量和运行频率保持相对相同,但 MySQL 使用的磁盘空间仍在以令人不安的方式不断增加,以至于现在已经成为一个问题。

下图说明了这个问题。

磁盘空间下降

我们已经实施了两个 cron 作业,应该可以释放磁盘空间。它们如下,并且都每天运行:

  • 耙 RAILS_ENV=生产数据库:原始:优化
  • rake RAILS_ENV=生产报告:修剪:孤立最多=3 单位=星期一

您可以在图中看到的下降是 cron 作业正在运行并占用更多空间以试图释放一些空间。

未启用 MySQL 二进制日志。此服务器上使用的 95% 的磁盘空间位于 /var/lib/mysql/dashboard_production,这是存储 MySQL 数据的目录。

我们之前在使用不同的应用程序(Zabbix 监控)时遇到过这个问题,不得不转储数据库并重新导入以释放空间。这是一个非常痛苦的过程,不是一个非常优雅的解决方案,但它最终奏效了。

有什么办法可以回收这个磁盘空间?我们能做些什么来阻止这种行为?

编辑 1

我们确实在使用 innoDB,并且我们没有使用配置指令“innodb_file_per_table”。

按照 Felix 的要求,命令的输出如下:

+----------------------+-------------------+-------------+
| table_schema         | table_name        | data_length |
+----------------------+-------------------+-------------+
| dashboard_production | resource_statuses | 39730544640 |
| dashboard_production | metrics           |   643825664 |
| dashboard_production | report_logs       |   448675840 |
| dashboard_production | timeline_events   |    65634304 |
| dashboard_production | reports           |    50937856 |
| dashboard_production | resource_events   |    38338560 |
| glpidb               | glpi_crontasklogs |    21204608 |
| ocsweb               | softwares         |     8912896 |
| ocsweb               | deploy            |     5044208 |
| phpipam              | logs              |     1269584 |
+----------------------+-------------------+-------------+

此外,我将尝试没有提到的“孤立”选项以及其他替代方案的报告:修剪任务,并将保持此问题的更新。

编辑 2

我运行了 reports:prune rake 任务,尽管删除了 230000 份报告,但它继续占用更多空间……因此,我将继续使用其他选项。

在此处输入图像描述

解决方案

在删除数据库中三分之二的条目后,它只释放了 200MB 的磁盘空间,这是毫无意义的。我们最终转储了内容并重新导入它,注意启用“innodb_file_per_table”。

我们只需要等待,看看这是否能长期解决解决方案,但目前似乎是这样。

mysql
  • 1 1 个回答
  • 4102 Views

1 个回答

  • Voted
  1. Best Answer
    Jaydee
    2014-08-28T07:30:04+08:002014-08-28T07:30:04+08:00

    我发现这篇文章似乎很好地解决了这个问题

    http://ximunix.blogspot.co.uk/2014/01/howto-cleanup-puppet-reports-and-db.html

    发表者 Ximena Cardinali

    小故事是开始小批量删除报告,然后从 MySQL 中回收空间


    HOWTO 清理木偶报告和数据库

    如果 Puppet Dashboard 的数据库使用数 GB 并且每天都在变大,这是一种收回一些空间的方法。

    作为 Puppet Dashboard 日常维护的一部分,您应该每天运行两个 rake 作业。

    cd /usr/share/puppet-dashboard
    env RAILS_ENV=production rake reports:prune upto=5 unit=day
    env RAILS_ENV=production rake reports:prune:orphaned
    

    您可以更改 RAILS_ENV 和天数 (day)、周数 (wk)、月数 (mon) 等以匹配您的系统及其需求。

    1. 停止传入报告:

      cd /path/to/puppet-dashboard

      env RAILS_ENV=生产脚本/delayed_job -p dashboard -m stop

    2. 开始小批量删除报表

    继续努力争取保留报告的时间长度。原因是 Innodb 表在一次删除超过 10k 行时性能很差。如果您尝试删除几十万行,它将超时,并且无论如何您都必须将其分解为较小的删除。此外,Ruby rake 进程可能会使用您的所有 RAM,并且可能在完成之前被内核杀死。这种进展应该适用于大多数人,但如果您有很多个月的数据,您可能希望从最早的一两个月的记录开始。在我们的案例中,我们只保留 2 周(14 天)的报告。

    env RAILS_ENV=production rake reports:prune upto=6 unit=mon
    env RAILS_ENV=production rake reports:prune upto=4 unit=mon
    env RAILS_ENV=production rake reports:prune upto=2 unit=mon
    env RAILS_ENV=production rake reports:prune upto=3 unit=wk
    env RAILS_ENV=production rake reports:prune upto=1 unit=wk
    env RAILS_ENV=production rake reports:prune upto=5 unit=day
    
    1. 确定从 MySQL 回收空间的最佳方法

    根据 MySQL 的配置方式,有两种回收空间的方法。运行此命令以确定是否启用了“innodb_file_per_table”。如果是,则应将其设置为“ON”。注意:对于这种情况,我建议在您的 MySQL 上使用 innodb。

    mysqladmin variables -u root -p | grep innodb_file_per_table
    

    您还可以列出数据库以查看是否有更大的数据文件。最有可能很大的表是 resource_statuses.ibd。

    ls -lah /var/lib/mysql/dashboard_production
    ...
    -rw-rw---- 1 mysql mysql      8.9K Jan 08 12:50 resource_statuses.frm
    -rw-rw---- 1 mysql mysql       15G Jan 08 12:50 resource_statuses.ibd
    ...
    
    1. 以简单的方式回收空间

    如果 MySQL 配置了 innodb_file_per_table 并且您的 Dashoard DB 显示您的数据位于大型表文件中,请执行以下操作:

    mysql -u root -p
    use puppet_dashboard;
    OPTIMIZE TABLE resource_statuses;
    

    这将根据当前数据创建一个新表并将其复制到位。如果您在此过程中进行列表,您应该会看到如下内容:

    -rw-rw---- 1 mysql mysql       8.9K Jan  08 12:50 resource_statuses.frm
    -rw-rw---- 1 mysql mysql        15G Jan  08 12:50 resource_statuses.ibd
    -rw-rw---- 1 mysql mysql       8.9K Jan  08 12:50 #sql-379_415.frm
    -rw-rw---- 1 mysql mysql       238M Jan  08 12:51 #sql-379_415.ibd
    

    完成后,它会将 tmp 文件复制到位。在这种情况下,我们从 15GB 增加到 708MB。

    -rw-rw---- 1 mysql mysql 8.9K Jan 08 13:01 resource_statuses.frm
    -rw-rw---- 1 mysql mysql 708M Jan 08 13:03 resource_statuses.ibd
    
    1. 以艰难的方式回收空间

    如果您的系统未配置 innodb_file_per_table 或所有当前数据都驻留在大型 ibdata 文件中,那么回收空间的唯一方法是擦除整个安装并重新导入所有数据。整体方法应该是这样的:首先配置innodb_file_per_table,dump所有数据库,然后停止Mysql,删除/var/lib/mysql,运行mysql_install_db再次创建/var/lib/mysql,启动MySQL,最后重新导入数据。由于数据导入,无需优化步骤。

    1. 最后,重启delayed_job:

      cd /path/to/puppet-dashboard

      env RAILS_ENV=生产脚本/delayed_job -p dashboard -n 2 -m start

    2. 每日报告清理和数据库维护:

    对于每日报告清理,您可以创建一个简单的 BASH 脚本,该脚本按时间搜索 /var/lib/puppet/reports 上的报告(在我们的例子中为 mtime +14),删除它们,然后使用 (upto=2 unit= wk) 并将其设置在您的 crontab 中。脚本的一个示例可以是:

    #!/bin/bash
    REPORTS=`find /var/lib/puppet/reports -type f -mtime +14`
    for i in $REPORTS; do rm -f $i; done
    
    cd /usr/share/puppet-dashboardenv RAILS_ENV=production rake reports:prune upto=2 unit=wk
    
    • 3

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve