database - 如何在MySQL中收缩/清除ibdata1文件

我在localhost中使用MySQL作为在R中执行统计的“查询工具”,也就是说,每次运行R脚本时,我创建一个新数据库(A),创建一个新表(B),将数据导入B ,提交查询以获得我需要的内容,然后我删除B并删除A.

它对我来说很好,但我意识到ibdata文件大小正在迅速增加,我在MySQL中没有存储任何内容,但ibdata1文件已超过100 MB。

我使用或多或少的默认MySQL设置进行设置,有没有办法可以在一段固定的时间后自动缩小/清除ibdata1文件?

8个解决方案

735 votes

information_schema没有缩小是一个特别恼人的MySQL功能。 除非删除所有数据库,删除文件并重新加载转储,否则实际上无法收缩informations_schema文件。

但您可以配置MySQL,以便将每个表(包括其索引)存储为单独的文件。 这样,information_schema就不会那么大。 根据Bill Karwin的评论,默认情况下启用MySQL版本5.6.6。

不久前我做到了这一点。 但是,要将服务器设置为为每个表使用单独的文件,您需要更改information_schema以启用此功能:

[mysqld]

innodb_file_per_table=1

[http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html]

如果您想从information_schema回收空间,您实际上必须删除该文件:

除information_schema和informations_schema数据库外,执行所有数据库,过程,触发器等的information_schema

删除除上述2个数据库之外的所有数据库

停止mysql

删除information_schema和informations_schema文件

启动mysql

从转储恢复

在步骤5中启动MySQL时,将重新创建information_schema和informations_schema文件。

现在你适合去。 当您创建新数据库进行分析时,这些表将位于单独的information_schema文件中,而不是informations_schema中。由于您通常不久后删除数据库,因此将删除ibd*文件。

[http://dev.mysql.com/doc/refman/5.1/en/drop-database.html]

你可能已经看到了这个:

[http://bugs.mysql.com/bug.php?id=1341]

通过使用命令information_schema或informations_schema,可以从ibdata1中提取数据和索引页面以分离文件。 但是,除非您执行上述步骤,否则ibdata1不会缩小。

关于information_schema,这是不必要的也不可能丢弃。 它实际上只是一堆只读视图,而不是表。 并且没有与它们相关联的文件,甚至也不是数据库目录。 informations_schema正在使用内存db-engine,并在mysqld停止/重启时被删除并重新生成。 见[https://dev.mysql.com/doc/refman/5.7/en/information-schema.html。]

John P answered 2019-01-21T02:36:23Z

34 votes

加入John P的答案,

对于Linux系统,可以使用以下命令完成步骤1-6:

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

sudo rm /var/lib/mysql/ib_logfile

(and delete any other ib_logfile's that may be named ib_logfile0, ib_logfile1 etc...)

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

警告:如果此mysql实例上有其他数据库,这些说明将导致您丢失其他数据库。 确保修改步骤1,2和6,7以涵盖您希望保留的所有数据库。

Vinay Vemula answered 2019-01-21T02:38:14Z

33 votes

删除innodb表时,MySQL不会释放ibdata文件中的空间,这就是它不断增长的原因。 这些文件几乎不会缩小。

如何缩小现有的ibdata文件:

[http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html]

您可以编写脚本并安排脚本在一段固定的时间后运行,但对于上述设置,似乎多个表空间是一个更简单的解决方案。

如果使用配置选项innodb_file_per_table,则会创建多个表空间。 也就是说,MySQL为每个表而不是一个共享文件创建单独的文件。 这些单独的文件存储在数据库的目录中,删除此数据库时将删除它们。 这应该消除了在您的情况下缩小/清除ibdata文件的需要。

有关多个表空间的更多信息:

[http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html]

titanoboa answered 2019-01-21T02:39:15Z

14 votes

如果你为你的(某些)MySQL表使用InnoDB存储引擎,你可能已经遇到了其默认配置的问题。 您可能已经注意到MySQL的数据目录(在Debian / Ubuntu中 - / var / lib / mysql)中有一个名为“ibdata1”的文件。 它几乎包含了MySQL实例的所有InnoDB数据(它不是事务日志),并且可能会变得非常大。 默认情况下,此文件的初始大小为10Mb,并自动扩展。 不幸的是,通过设计InnoDB数据文件无法收缩。 这就是为什么DELETE,TRUNCATE,DROP等不会回收文件使用的空间。

我想你可以找到很好的解释和解决方案:

[http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/]

Vik answered 2019-01-21T02:39:50Z

6 votes

如果您的目标是监视MySQL可用空间并且无法阻止MySQL缩小您的ibdata文件,那么请通过表状态命令获取它。 例:

MySQL&gt;5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'

MySQL&lt;5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'

然后将此值与您的ibdata文件进行比较:

du -b ibdata1

资料来源:[http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html]

Cyno answered 2019-01-21T02:40:37Z

4 votes

在新版本的mysql-server食谱上面会粉碎“mysql”数据库。在旧版本中它可以工作。 在新的一些表中切换到表类型INNODB,这样做会损坏它们。最简单的方法是转储所有数据库,卸载mysql-server,加入仍然是my.cnf:

[mysqld]

innodb_file_per_table=1

erase all in /var/lib/mysql

install mysql-server

restore users and databases

adjustable_wrench answered 2019-01-21T02:40:59Z

4 votes

在bash中快速编写接受的答案程序:

#!/usr/bin/env bash

DATABASES="$(mysql -e 'show databases \G' | grep "^Database" | grep -v '^Database: mysql$\|^Database: binlog$\|^Database: performance_schema\|^Database: information_schema' | sed 's/^Database: //g')"

mysqldump --databases $DATABASES -r alldatabases.sql && echo "$DATABASES" | while read -r DB; do

mysql -e "drop database \`$DB\`"

done && \

/etc/init.d/mysql stop && \

find /var/lib/mysql -maxdepth 1 -type f \( -name 'ibdata1' -or -name 'ib_logfile*' \) -delete && \

/etc/init.d/mysql start && \

mysql < alldatabases.sql && \

rm -f alldatabases.sql

保存号为/root/.my.cnf,运行方式为/var/lib/mysql。

不包括/root/.my.cnf,/var/lib/mysql,performance_schema(和binlog目录)。

假设您在/root/.my.cnf中拥有管理员凭据,并且您的数据库位于默认的/var/lib/mysql目录中。

您还可以在运行此脚本后清除二进制日志以重新获得更多磁盘空间:

PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;

Pierre-Alexis de Solminihac answered 2019-01-21T02:41:46Z

-1 votes

如前所述,你不能缩小ibdata1(这样做你需要转储和重建),但通常也没有真正的需要。

使用autoextend(可能是最常见的大小设置)ibdata1预分配存储,每次接近满时都会增长。 这使得写入速度更快,因为已经分配了空间。

删除数据时,它不会缩小,但文件中的空间会标记为未使用。 现在,当您插入新数据时,它将重新使用文件中的空白空间,然后再进一步增长文件。

所以如果你真的需要这些数据,它只会继续增长。 除非你真的需要空间用于其他应用程序,否则可能没有理由缩小它。

steveayre answered 2019-01-21T02:42:28Z

mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件相关推荐

  1. 如何在MySQL中缩小/清除ibdata1文件

    我将localhost中的MySQL用作在R中执行统计信息的"查询工具",也就是说,每次运行R脚本时,我都会创建一个新的数据库(A),创建一个新的表(B),然后将数据导入B ,提交 ...

  2. textarea选中行删除_Easy Data Transform如何在Excel中删除重复的行?

    Excel用户经常希望删除具有重复值的行.例如,要删除包含重复电子邮件的行,那么Easy Data Transform如何在Excel中删除重复的行?下面一起来看看吧. 先在您的Mac上安装Easy ...

  3. linux强制移除pdf密码,分享|如何在 Linux 中从一个 PDF 文件中移除密码

    今天,我碰巧分享一个受密码保护的 PDF 文件给我的一个朋友.我知道这个 PDF 文件的密码,但是我不想透露密码.作为代替,我只想移除密码并发送文件给他.我开始在因特网上查找一些简单的方法来从 PDF ...

  4. Acrobat Pro DC 教程:如何在 PDF 中插入其他 PDF 文件?

    欢迎观看 Acrobat Pro DC 教程,小编带大家学习 Acrobat Pro DC 的基本工具和使用技巧,了解如何在 PDF 中插入其他 PDF文件. 在 Acrobat Pro DC 中选择 ...

  5. android 大文件加密,如何在android中加密大视频文件

    我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...

  6. 如何在MyEclipse中反编译class文件

    反编译class文件,以前都是用的jd-gui.exe这个绿色软件.最近学到了如何在Myeclipse中直接查看class文件,这里记录一下. 1.下载net.sf.jadclipse_3.3.0.j ...

  7. mysql连接clickhouse_如何在ClickHouse中使用MySQL客户端

    目录 介绍 安装 2.1成功完成安装后,启动ProxySQL. 创建ClickHouse用户 从MySQL客户端连接到ClickHouse 查询ClickHouse之类的MySQL 局限性 6.1结论 ...

  8. Winform中使用Mysql.Data.dll实现连接Mysql数据库并执行sql语句(排除ddl等非法语句的执行)

    场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 与上面实现的流程类似 ...

  9. php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql

    相对与PHP5,PHP7的最大变化之一是移除了mysql扩展,推荐使用mysqli或者pdo_mysql,实际上在PHP5.5开始,PHP就着手开始准备弃用mysql扩展,如果你使用mysql扩展,可 ...

最新文章

  1. Linux文件系统:概览(思维导图)
  2. Cloud Insight!StatsD 系监控产品新宠!
  3. 一个好用的时间管理Chrome扩展 - Calendar and Countdown
  4. python小白逆袭大神课程心得_python小白逆袭大神(深度学习7日训练营)——心得体会...
  5. 想进美团不知道选哪个技术岗位?这里有一份通关秘籍!
  6. 牧马人鼠标g13鼠标宏_达尔优EM910牧马人轻量化游戏鼠标评测
  7. python3 enumerate()函数笔记
  8. 【算法】汉诺塔 移动
  9. MySQL报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException
  10. thinkphp视图中插入php代码
  11. 后端如何收取多个文件_一次上传多个文件机制的两种解决方案
  12. WebView 指南
  13. 算法设计与分析基础(第3版)
  14. MYSQL学习心得6
  15. 计算机软件企业申请商标,软件商标注册申请流程
  16. js简单交互动画,运动吧
  17. OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
  18. Python 3 入门,看这篇就够了
  19. 【开源】STM32硬盘音圈电机闭环控制
  20. 计算机大学生论文参考文献,大学生计算机外文外文 大学生计算机论文参考文献哪里找...

热门文章

  1. Python培训:Python有哪些函数?你了解几种?
  2. Python培训教程分享:有哪些值得使用的爬虫开源项目?
  3. 新手入门API测试必要了解的知识
  4. Java基础学习总结(9)——this关键字
  5. 关于虚拟化技术软硬件兼容问题的探讨
  6. IDE set arguments
  7. linux修正系统错误指令fsck和badblocks
  8. Linux下,各种解压缩命令集合
  9. 更加安全的存取账户密码
  10. Silverlight C# 游戏开发:Silverlight开发环境