從Linux系統磁盤空間不足引發的Zabbix服務器數據庫遷移

        之前一直沒有去關心Zabbbix服務器存儲空間問題,最近Zabbix報警提示/根目錄磁盤空間不足,於是登錄Zabbix看了一下,發現根目錄只有1.3MB了,這怎麼辦了?第一個想到的是擴展根目錄,結果發現不是用的LVM,採用的是標準的,心想也還可以救,就和Windows一樣將D盤、E盤刪除,再將D盤的空間擴展給C盤就OK啊,於是開始着手操作(注意提前備份虛擬機,最好做一個快照,出問題了好恢復)

[root@zabbixserver /]# 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的,會提示設備忙。看來這個方案被推翻的(因爲我只知道通過這一種方式來進行擴展標準類型的磁盤,也許有其它好的方法我不知道的。)

[root@zabbixserver /]# 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的數據庫的原因。

[root@zabbixserver 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_logfile1
drwx------. 2 mysql mysql 4.0K 11月 16 17:10 mysql
srwxrwxrwx  1 mysql mysql    0 12月 29 13:45 mysql.sock
drwx------. 2 mysql mysql 4.0K 11月 16 17:10 performance_schema
drwx------. 2 mysql mysql 8.0K 11月 16 17:17 zabbix_db


隨後谷歌發現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、添加磁盤並格式化磁盤

[root@zabbix_server /]# fdisk /dev/sdb
[root@zabbix_server /]# mkfs.xfs -f /dev/sdb1
[root@zabbix_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、掛載磁盤並設置開機自動掛載

[root@zabbix_server /]# mkdir /ZabbixDB
[root@zabbix_server /]# mount /dev/sdb1 /ZabbixDB
[root@zabbix_server /]# vi /etc/fstab
[root@zabbix_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)停止相關服務,避免寫入數據

[root@zabbix_server /]# systemctl stop zabbix-server
[root@zabbix_server /]# systemctl stop httpd


3)清空歷史數據

[root@zabbix_server /]# 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)


4)備份數據庫

[root@zabbix_server /]# mysqldump -uroot -p zabbix_db > /home/zabbix_db.sql


5)停止數據庫並刪除共享表空間數據文件

[root@zabbix_server /]# systecmtl stop mariadb
[root@zabbix_server /]# cd /var/lib/mysql
[root@zabbix_server /]# rm -rf ib*


4、遷移數據庫存放位置

[root@zabbix_server /]# mkdir /ZabbixDB/DB
[root@zabbix_server /]# chown -vR mysql:mysql /ZabbixDB/DB
[root@zabbix_server /]# chmod -vR 700 /etc/ZabbixDB/DB
[root@zabbix_server /]# cp -av /var/lib/mysql* /ZabbixDB/DB
[root@zabbix_server /]# vi /etc/my.cnf
[mysqld]
#可以修改InnoDB爲獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。
innodb_file_per_table=1
#修改數據庫存放目錄
datadir=/ZabbixDB/DB/mysql
socket=/var/lib/mysql/mysql.sock


再啓動數據庫服務

[root@zabbix_server /]# systemctl start mariadb


啓動服務以後,我們需要檢測一下獨立表空間的功能是否已經正常開啓,當爲ON時說明已經開啓

[root@zabbix_server /]#mysql -u root -p
MariaDB [(none)]> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)


5、還原數據庫

[root@zabbix_server /]# mysqldump -uroot -p zabbix < /data/zabbix_db.sql
或
[root@zabbix_server /]# mysql -uroot -p zabbix < /data/zabbix_db.sql


6、恢複相關服務

[root@zabbix_server /]# systemctl start zabbix-server
[root@zabbix_server /]# systemctl start httpd


這時候我們再檢測數據庫及磁盤空間,會發現數據庫已經存放至/ZabbixDB/DB/mysql目錄,而根目錄空間恢復正常了。

[root@zabbix_server mysql]# pwd
/ZabbixDB/DB/mysql
[root@zabbix_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


#磁盤空間

[root@zabbix_server mysql]# df -lh
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda2       9.8G  3.1G  6.8G   31% /
/dev/sdb1       100G  1.9G   99G    2% /ZabbixDB


至此,Zabbix磁盤空間不足及數據庫存儲位置遷移完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章