標籤:zabbix資料庫空間不足 ibdata1佔用空間過大 zabbixibdata1佔用空間過大
之前一直沒有去關心Zabbbix伺服器儲存空間問題,最近Zabbix警示提示/根目錄磁碟空間不足,於是登入Zabbix看了一下,發現根目錄只有1.3MB了,這怎麼辦了?第一個想到的是擴充根目錄,結果發現不是用的LVM,採用的是標準的,心想也還可以救,就和Windows一樣將D盤、E盤刪除,再將D盤的空間擴充給C盤就OK啊,於是開始著手操作(注意提前備份虛擬機器,最好做一個快照,出問題了好恢複)
[[email protected] /]# df -h檔案系統 容量 已用 可用 已用% 掛載點/dev/sda2 9.8G 9.8G 1.3M 100% //dev/sda5 6.2G 33M 6.1G 1% /home/dev/sda1 197M 143M 55M 73% /boot
查看檔案系統,我需要擴充的是sda2,也就是說我需要刪除sda3、sda4、sda5來擴充sda2,發現這是不太可能的,因為需要擴充sda2需要umount /dev/sda2再去擴充來解決,而系統硬碟是不能夠umount的,會提示裝置忙。看來這個方案被推翻的(因為我只知道通過這一種方式來進行擴充標準類型的磁碟,也許有其它好的方法我不知道的。)
[[email protected] /]# fdisk -l磁碟 /dev/sda:21.5 GB, 21474836480 位元組,41943040 個扇區Units = 扇區 of 1 * 512 = 512 bytes扇區大小(邏輯/物理):512 位元組 / 512 位元組I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤類型:dos磁碟標識符:0x0003dc46裝置 Boot Start End Blocks Id System/dev/sda1 * 2048 411647 204800 83 Linux/dev/sda2 411648 20891647 10240000 83 Linux/dev/sda3 20891648 29083647 4096000 82 Linux swap / Solaris/dev/sda4 29083648 41943039 6429696 5 Extended/dev/sda5 29085696 41943039 6428672 83 Linux
現在磁碟擴容不了,看來只能夠檢測是哪個檔案佔用空間比較大,然後再從這個檔案上下手解決問題了,通過檢測到現是/var/lib/mysql/下的libdata1檔案過大已經達到了6.7G(檢測方法:du -sh /*,再逐步檢測即可),我立即想到了zabbix的資料庫的原因。
[[email protected] mysql]# ls -lh總用量 6.7G-rw-rw----. 1 mysql mysql 16K 12月 1 14:15 aria_log.00000001-rw-rw----. 1 mysql mysql 52 12月 1 14:15 aria_log_control-rw-rw----. 1 mysql mysql 6.7G 12月 29 14:24 ibdata1-rw-rw----. 1 mysql mysql 5.0M 12月 29 14:24 ib_logfile0-rw-rw----. 1 mysql mysql 5.0M 12月 29 14:21 ib_logfile1drwx------. 2 mysql mysql 4.0K 11月 16 17:10 mysqlsrwxrwxrwx 1 mysql mysql 0 12月 29 13:45 mysql.sockdrwx------. 2 mysql mysql 4.0K 11月 16 17:10 performance_schemadrwx------. 2 mysql mysql 8.0K 11月 16 17:17 zabbix_db
隨後Google發現zabbix的資料庫它的表模式是共用資料表空間模式,隨著資料增長ibdata1會越來越大,效能方面也會有影響,而且innodb把資料和索引都放在ibdata1下。
共用資料表空間模式:
InnoDB 預設會將所有的資料庫InnoDB引擎的表資料存放區在一個共用空間中:ibdata1,增刪資料庫的時候ibdata1檔案不會自動收縮,單個資料庫的備份也將成為問題。通常只能將資料使用mysqldump 匯出,然後再匯入解決這個問題。
獨立資料表空間模式:
優點:
1、每個表都有自已獨立的資料表空間。
2、每個表的資料和索引都會存在自已的資料表空間中。
3、可以實現單表在不同的資料庫中移動。
4、空間可以回收(drop/truncate table方式動作表空間不能自動回收)
5、對於使用獨立資料表空間的表,不管怎麼刪除,資料表空間的片段不會太嚴重的影響效能,而且還有機會處理。
缺點:
單表增加比共用空間方式更大。
結論:
共用資料表空間在Insert操作上有一些優勢,但在其它都沒獨立資料表空間表現好,所以我們要改成獨立資料表空間。當啟用獨立資料表空間時,需要調整innodb_open_files參數。
但是這裡還有一個問題,就是就算我們將現在的空間調整出來了,但是因為我們的根目錄本身只有10G,後面資料庫大了,還是會出現這種情況,所以我們還是得調整資料庫,將它存放的位置移除根目錄,同時調整為獨立資料表空間,來一勞永逸的解決這個問題。
首先先在虛擬機器上添加一個100G的磁碟,然後對這個磁碟分割,再將這個磁碟掛載到/ZabbixDB目錄,再備份資料庫,遷移資料庫存放位置至ZabbixDB目錄,然後修改資料庫為獨立資料表空間模式,再還原資料庫即可;
1、添加磁碟並格式化磁碟
[[email protected]_server /]# fdisk /dev/sdb[[email protected]_server /]# mkfs.xfs -f /dev/sdb1[[email protected]_server /]# fdisk -l磁碟 /dev/sdb:107.4 GB, 107374182400 位元組,209715200 個扇區Units = 扇區 of 1 * 512 = 512 bytes扇區大小(邏輯/物理):512 位元組 / 512 位元組I/O 大小(最小/最佳):512 位元組 / 512 位元組磁碟標籤類型:dos磁碟標識符:0xabdf27bd裝置 Boot Start End Blocks Id System/dev/sdb1 2048 209715199 104856576 83 Linux
2、掛載磁碟並設定開機自動掛載
[[email protected]_server /]# mkdir /ZabbixDB[[email protected]_server /]# mount /dev/sdb1 /ZabbixDB[[email protected]_server /]# vi /etc/fstab[[email protected]_server /]# /dev/sdb1 /ZabbixDB xfs default 1 2
3、備份資料庫
因為現在的資料庫比較大,我們先查看一下哪些錶的歷史資料比較多
MariaDB [zabbix_db]> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema=‘zabbix_db‘;+----------------------------+---------------+------------+| table_name | total_mb | table_rows |+----------------------------+---------------+------------+| events | 116.76562500 | 904289 || history | 555.81250000 | 7038124 || history_uint | 5674.50000000 | 59219866 || trends | 46.57812500 | 581682 || trends_uint | 270.95312500 | 2228048 |+----------------------------+---------------+------------+113 rows in set (0.05 sec)
可以看到history和history_uint這兩個錶的歷史資料最多。
另外就是trends,trends_uint中也存在一些資料。
由於資料量太大,按照普通的方式delete資料的話基本上不太可能。
所以決定直接採用truncate table的方式來快速清空這些表的資料,再使用mysqldump匯出資料,刪除共用資料表空間資料檔案,重新匯入資料。
2)停止相關服務,避免寫入資料
[[email protected]_server /]# systemctl stop zabbix-server[[email protected]_server /]# systemctl stop httpd
3)清空曆史資料
[[email protected]_server /]# mysql -uroot -pmysql > use zabbix;Database changedmysql > 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)
4)備份資料庫
[[email protected]_server /]# mysqldump -uroot -p zabbix_db > /home/zabbix_db.sql
5)停止資料庫並刪除共用資料表空間資料檔案
[[email protected]_server /]# systecmtl stop mariadb[[email protected]_server /]# cd /var/lib/mysql[[email protected]_server /]# rm -rf ib*
4、遷移資料庫存放位置
[[email protected]_server /]# mkdir /ZabbixDB/DB[[email protected]_server /]# chown -vR mysql:mysql /ZabbixDB/DB[[email protected]_server /]# chmod -vR 700 /etc/ZabbixDB/DB[[email protected]_server /]# cp -av /var/lib/mysql* /ZabbixDB/DB[[email protected]_server /]# vi /etc/my.cnf[mysqld]#可以修改InnoDB為獨立資料表空間模式,每個資料庫的每個表都會產生一個資料空間。innodb_file_per_table=1#修改資料庫存放目錄datadir=/ZabbixDB/DB/mysqlsocket=/var/lib/mysql/mysql.sock
再啟動資料庫服務
[[email protected]_server /]# systemctl start mariadb
啟動服務以後,我們需要檢測一下獨立資料表空間的功能是否已經正常開啟,當為ON時說明已經開啟
[[email protected]_server /]#mysql -u root -pMariaDB [(none)]> show variables like ‘%per_table%‘;+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_file_per_table | ON |+-----------------------+-------+1 row in set (0.00 sec)
5、還原資料庫
[[email protected]_server /]# mysqldump -uroot -p zabbix < /data/zabbix_db.sql或[[email protected]_server /]# mysql -uroot -p zabbix < /data/zabbix_db.sql
6、恢複相關服務
[[email protected]_server /]# systemctl start zabbix-server[[email protected]_server /]# systemctl start httpd
這時候我們再檢測資料庫及磁碟空間,會探索資料庫已經存放至/ZabbixDB/DB/mysql目錄,而根目錄空間恢複正常了。
[[email protected]_server mysql]# pwd/ZabbixDB/DB/mysql[[email protected]_server mysql]# ls -l總用量 29712-rwxrwxrwx. 1 mysql mysql 16384 12月 29 18:16 aria_log.00000001-rwxrwxrwx. 1 mysql mysql 52 12月 29 18:16 aria_log_control-rwxrwxrwx. 1 mysql mysql 8820 12月 29 16:42 columns_priv.frm-rwxrwxrwx. 1 mysql mysql 0 12月 29 16:42 columns_priv.MYD-rwxrwxrwx. 1 mysql mysql 4096 12月 29 16:42 columns_priv.MYI-rwxrwxrwx. 1 mysql mysql 9582 12月 29 16:42 db.frm-rwxrwxrwx. 1 mysql mysql 880 12月 29 16:42 db.MYD-rwxrwxrwx. 1 mysql mysql 5120 12月 29 16:42 db.MYI
#磁碟空間
[[email protected]_server mysql]# df -lh檔案系統 容量 已用 可用 已用% 掛載點/dev/sda2 9.8G 3.1G 6.8G 31% //dev/sdb1 100G 1.9G 99G 2% /ZabbixDB
至此,Zabbix磁碟空間不足及資料庫儲存位置遷移完成。
本文出自 “系統營運【SystemDevOps】” 部落格,謝絕轉載!
從Linux系統磁碟空間不足引發的Zabbix伺服器資料庫遷移