如何收缩Mysql的ibdata1文件

如何收缩Mysql的ibdata1文件,第1张

修改表引擎

1.对每个InnoDB表执行 ALTER TABLE table_name ENGINE=MyISAM

2.停止Mysql服务;

3.移除InnoDB相关文件ibdata1等;

4.修改my.cnf中的参数,添加innodb_file_per_table;

在my.cnf中[mysqld]下设置

innodb_file_per_table=1

5.启动Mysql服务;

6.将刚才修改后的那些表改回InnoDB:ALTER TABLE table_name ENGINE=InnoDB;

导出InnoDB表

1.使用mysqldump命令导出所有的InnoDB表,例如: mysqldump –add-drop-table –extended-insert –disable-keys –quick ‘db_name’ –tables ‘tbl_name’ >‘db_name.tbl_name.sql’

2.删掉这些表:

◦SET FOREIGN_KEY_CHECKS=0

◦DROP TABLE db_name.tbl_name

◦DROP TABLE db_name1.tbl_name1

◦–– DROP other tables here…

◦SET FOREIGN_KEY_CHECKS=1

3.停止Mysql服务;

4.移除InnoDB相关文件ibdata1等;

5.修改my.cnf中的参数,添加innodb_file_per_table;

6.启动Mysql服务;

7.在Mysql Console下导入表:

◦SET FOREIGN_KEY_CHECKS=0

◦SOURCE db_name.tbl_name.sql

◦SOURCE db_name1.tbl_name1.sql

◦–– SOURCE other files here…

◦SET FOREIGN_KEY_CHECKS=1

导出整个数据

这个是我常用的,虽然他和耗磁盘和时间,但是确实是最简便的:

1.导出所有的数据: /usr/bin/mysqldump ––extended-insert ––all-databases ––add-drop-database ––disable-keys ––flush-privileges ––quick ––routines ––triggers >all-databases.sql

2.停止Mysql服务;

3.重命名mysql数据文件夹;

4.修改my.cnf中的参数,添加innodb_file_per_table;

5.mysql_install_db重新初始化mysqld;

6.开启Mysql服务

7.进入Mysql Console执行:

◦SET FOREIGN_KEY_CHECKS=0

◦SOURCE all-databases.sql

◦SET FOREIGN_KEY_CHECKS=1

8.重启数据库测试OK就领赏去吧。

如果因为断电或者直接关机导致idb文件出错,就需要重构这些文件

[mysqld]

加 innodb_force_recovery=1

以前的小应用没有注意这个问题,现在遇到了mysql表中删除了100W数据,但是体检只有一点点变小,删除前是4.7G,删除后是4.6G。优化以后2.2G,哼哼哼哼。。。

查资料知道原因是mysql默认是不自动收缩的,所以删除数据体积不会变小。

我们需要手动优化来收缩数据。

方法一:使用Navicat的最优化功能

因为我是使用Navicat作为工具,所以推荐使用这个功能。选中需要优化的表,最优化即可。

方法二:运行命令优化

optimizetable数据表名称

方法三:自动批处理。说白了,还是运行命令

建议一个自动运行任务,每隔一段时间自动运行一下。

一、查询mysql表是否为分区表:可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等信息 SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='xw_coobill_order' 二、查询表有多少个分区 SELECT TABLE_NAME, COUNT(*) AS CNT FROM information_schema.PARTITIONS WHERE PARTITION_NAME IS NOT NULL GROUP BY TABLE_NAME ORDER BY CNT DESC LIMIT 50 三、分析执行语句 explain partitions select * from range_datetime where hiredate >= '20151207124503' and hiredate<='20151210111230' 四、分区管理 常规HASH和线性HASH的增加收缩分区的原理是一样的。增加和收缩分区后原来的数据会根据现有的分区数量重新分布。HASH分区不能删除分区,所以不能使用DROP PARTITION *** 作进行分区删除 *** 作; 只能通过ALTER TABLE ... COALESCE PARTITION num来合并分区,这里的num是减去的分区数量; 可以通过ALTER TABLE ... ADD PARTITION PARTITIONS num来增加分区,这里是null是在原先基础上再增加的分区数量。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6135873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存