ibdata1文件太大的解决办法

[TOC]

现状

  • 突然收到 zabbix-server服务器的磁盘报警,登录 mysql 看到 zabbix 使用了 63GB,但是 zabbix 目录仅1.9MB,而 ibdata1 却有 84GB
[root@zabbix-server]# cd /var/lib/mysql
[root@zabbix-server]# du -sh *
84G     ibdata1
5.0M    ib_logfile0
5.0M    ib_logfile1
1.9M    zabbix           #.实际63G

发生原因

  • 由于未启用独立表空间(即innodb_file_per_table=OFF),导致mysql将数据、索引、元数据全都存入到ibdata1文件中,时间久了这个文件就会变的非常大
  • 对一些没用的大表进行清空和优化依然无效果,因为对共享表空间不起作用
MariaDB [zabbix]> truncate table xxx; optimize table xxx;

MariaDB [zabbix]> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+

解决办法

参考如下方法,把数据分别保存在各数据库子目录里的方法,这样新产生的ibdata1文件就不会太大了

  • 1、利用 mysqldump 对zabbix库做一次逻辑备份(此mysql也只有zabbix这一个用户库)
mysqldump --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --triggers --events --routines --skip-tz-utc -uroot -p --databases zabbix > /data/zabbix.20181219.sql
  • 2、停止MySQL服务
systemctl stop mariadb.service
  • 3、删除ibdata1、ib_logfile*等共享表空间数据文件
cd /var/lib/mysql/
mv ibdata1 ibdata1.$(date +%Y%m%d%H%M%S)
mv ib_logfile0 ib_logfile0.$(date +%Y%m%d%H%M%S)
mv ib_logfile1 ib_logfile1.$(date +%Y%m%d%H%M%S)
  • 4、修改my.cnf增加innodb_file_per_table独立表空间参数
vi /etc/my.cnf

在[mysqld]下添加一行
innodb_file_per_table=1
  • 5、启动MySQL服务
systemctl start mariadb.service
  • 6、查看参数是否生效
MariaDB [zabbix]> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
  • 7、将逻辑备份导入
mysql -uroot -p zabbix < /data/zabbix.20181219.sql
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2021-12-14 21:42:11

results matching ""

    No results matching ""