阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux系统磁盘空间不足Zabbix服务器数据库迁移

183次阅读
没有评论

共计 3904 个字符,预计需要花费 10 分钟才能阅读完成。

今天登陆 Zabbix,发现 zabbix-server 磁盘已经超过了 80%,发出了告警,如图:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

登入服务器一看,使用 #ll -Shil 发现以下几个数据表太大了,占用了磁盘空间很多:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

在 mysql 里查看也是这样(我的 zabbix 的 databases 就叫 zabbix):

mysql> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema=’zabbix’;
+—————————-+—————+————+
| table_name                | total_mb      | table_rows |
+—————————-+—————+————+
| events                    | 2876.00000000 |  23659702 |
| history                    | 3005.60937500 |  36816179 |
| history_uint              | 2762.26562500 |  35895354 |
| trends_uint                | 1189.60937500 |  16612396 |
| trends                    |  831.59375000 |  11548652 |
+—————————-+—————+————+
113 rows in set (0.08 sec)
上面几个就是数据比较大的表,那么我们重点就是对他们开刀。由于数据量太大,按照普通的方式 delete 数据的话基本上不太可能。所以决定直接采用 truncate table 的方式来快速清空这些表的数据,再使用 mysqldump 导出数据,删除共享表空间数据文件,重新导入数据。

这个时候我们先停止 zabbxi-server。

systemctl stop zabbix-server
systemctl stop httpd
然后登陆 mysql,清除历史数据:

[root@www.linuxidc.com-zabbixserver ~] # mysql -uroot -p
mysql > use zabbix;
Database changed
mysql > truncate table history;
Query OK, 123981681 rows affected (0.23 sec)
mysql > optimize table history;
1 row in set (0.02 sec)
mysql > truncate table history_uint;
Query OK, 57990562 rows affected (0.12 sec)
mysql > optimize table history_uint;
1 row in set (0.03 sec)
注意!如果在这一步,你先选择了 delete,比如先删除了 history_uint 里 7 天之前的数据:

mysql> delete from history_uint where clock<unix_timestamp(adddate(now(),-7));
但是你删了半天,发现数据量太大,这么删太慢了,又想到 zabbix 还有每小时统计一次的趋势数据,所以想干脆连 7 天的记录都不要了,于是查找并干掉了 delete 进程然后改用了 truncate,如下:

mysql> show processlist;
mysql> kill 136765
mysql> truncate table history_uint
这样的话,你会发现 truncate 的速度很很慢的,就会很奇怪。答案其实不是 truncate 慢,而是直接死锁了! 这个时候如果查看一下线程就会发现 truncate 正在等待 insert、select 等等锁。

为什么会这样呢?是因为 truncate 没有拿到 mdl 锁,MySQL 在回滚 delete 回滚结束前持有 mdl 锁,truncate 被锁后续 insert 被 truncate 锁(表锁),杀掉 truncate 就可以正常 insert、select,完成 delete 回滚,回滚完成后就可以 truncate 了。这是一种锁阻塞现象。

这个时候就只能杀掉 truncate 线程,等待 MySQL 的 delete 回滚结束,然后重新去 truncate 表。

插播结束,现在可以对原有的数据库进行备份,#mysqldump -uroot - p 密码 zabbix > /home/zabbix_db.sql。

备份完毕之后,就可以# systecmtl stop mariadb 关闭掉 mysql,同时删除掉共享表空间数据文件,#rm -rf /var/lib/mysql/ib*。

然后准备一个空间比较大的盘,比如这个新磁盘就叫 ZabbixDB,然后在里面建立一个 DB 文件夹。然后将 /ZabbixDB/DB 的所属组和用户都改成 mysql,语句是:# chown -vR mysql:mysql /ZabbixDB/DB。

改完了之后再给予 700 权限:# chmod -vR 700 /etc/ZabbixDB/DB。

然后就把整个 /var/lib/mysql* 的内容都导入到 ZabbixDB/DB 里:#cp -av /var/lib/mysql* /ZabbixDB/DB。

修改 my.cnf,在 [mysqld] 添加一句:innodb_file_per_table=1,这是修改 InnoDB 为独立表空间模式,每个数据库的每个表都会生成一个数据空间。同时也要修改数据库存放目录:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

这个时候就可以# systemctl start mariadb 重启 mysql 服务,启动完后查看一下刚刚在 my.cnf 里设置的“独立表空间”功能是否 OK,检查语句是 show variables like ‘%per_table%’;,如果看到“ON”,就是说明已经开启了:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

然后就可以还原数据库了:

[root@js-online-zabbixserver zabbix]# mysql -uroot zabbix < /home/zabbix_db.sql
如果这个时候报错,出现类似这样的错误:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

这个可能是数据库缓存造成的,这个时候可以在数据库里使用 FLUSH TABLES;,不过这多半会不好使。

那么这个时候,就去新的 mysql 目录夹,即 /ZabbixDB/DB,然后进入数据库 zabbix,发现这个文件夹有很多文件,但是每一个文件都是既有一个.ibd 又有一个.frm 的,而这个“globalmacro”是只有 ibd 而没有.frm 的,所以这个时候我们可以先把这个 globalmacro.ibd 转移到别的地方去,然后重新执行

# mysql -uroot zabbix < /home/zabbix_db.sql
还原数据库即可。

最后启动 zabbix-server:

systemctl start zabbix-server
systemctl start httpd
最后查看一下磁盘空间情况:

Linux 系统磁盘空间不足 Zabbix 服务器数据库迁移

发现整个磁盘运行情况都 OK 了~,至此整个 zabbix 的数据库迁移完成。

[参考资料]https://stackoverflow.com/questions/17914446/mysqldump-problems-with-restore-error-please-discard-the-tablespace-before-imp

更多 Zabbix 相关教程集合

在 Ubuntu 16.04 服务器上安装 Zabbix 3.2  http://www.linuxidc.com/Linux/2017-07/145519.htm 

CentOS 7 LNMP 环境搭建 Zabbix3.0  http://www.linuxidc.com/Linux/2017-02/140134.htm 

Ubuntu 16.04 安装部署监控系统 Zabbix2.4  http://www.linuxidc.com/Linux/2017-03/141436.htm 

Zabbix 监控安装部署及警报配置  http://www.linuxidc.com/Linux/2017-03/141611.htm 

Zabbix 触发器表达式详解 http://www.linuxidc.com/Linux/2017-03/141921.htm 

Ubuntu 16.04 下安装部署 Zabbix3.0  http://www.linuxidc.com/Linux/2017-02/140395.htm 

CentOS 6.3 下 Zabbix 监控 apache server-status http://www.linuxidc.com/Linux/2013-05/84740.htm 

CentOS 7 下 Zabbix 3.0 安装详解 http://www.linuxidc.com/Linux/2017-03/141716.htm 

CentOS 7.4 安装 Zabbix 3.4  http://www.linuxidc.com/Linux/2017-09/147202.htm

64 位 CentOS 6.2 下安装 Zabbix 2.0.6   http://www.linuxidc.com/Linux/2014-11/109541.htm 

ZABBIX 的详细介绍:请点这里
ZABBIX 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148776.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计3904字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中