Zabbix-server遷移數據庫
今天登陸zabbix,發現zabbix-server磁盤已經到達了80%,發出了告警,如圖:
登入服務器一看,使用#ll -Shil發現以下幾個表太大了,占用了磁盤空間:
在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@js-online-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)
然後對原有的數據庫進行備份,#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為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。同時也要修改數據庫存放目錄:
這個時候就可以# systemctl start mariadb重啟mysql服務,啟動完後查看一下剛剛在my.cnf裏設置的“獨立表空間”功能是否OK,檢查語句是 show variables like ‘%per_table%‘;,如果看到“ON”,就是說明已經開啟了:
然後就可以還原數據庫了:
[root@js-online-zabbixserver zabbix]# mysql -uroot zabbix < /home/zabbix_db.sql
如果這個時候報錯,出現類似這樣的錯誤:
這個可能是數據庫緩存造成的,這個時候可以在數據庫裏使用#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
最後查看一下磁盤空間情況:
發現整個磁盤運行情況都OK了~,至此整個zabbix的數據庫遷移完成。
[參考資料]https://stackoverflow.com/questions/17914446/mysqldump-problems-with-restore-error-please-discard-the-tablespace-before-imp
本文出自 “生活就是等待戈多” 博客,請務必保留此出處http://chenx1242.blog.51cto.com/10430133/1983612
Zabbix-server遷移數據庫