一次生產環境mysql遷移操作(二)mysql空間釋放(碎片整理)

一次生產環境mysql遷移操作(一)數據歸檔
一次生產環境mysql遷移操作(二)mysql空間釋放(碎片整理)
上文中增加了定時歸檔,現在一些大表磁盤空間一直不釋放,導致數據庫文件越來越大。現在介紹下數據導入導出方案。

方案選擇

暫時有兩種方案選擇:
1、停機數個小時,使用mysqldump進行備份(大表只最近導出10天的數據)和恢復,並將共享表空間設置爲獨立表空間
2、mysql使用OPTIMIZE 來進行碎片整理
2、搭建主從集羣,記錄備份時間點,然後將數據重新導入到從庫,最後將從庫切換爲主庫。

經過對比1、2、3,方案一操作簡單,比較靈活可以先導入近一天數據,以後的數據慢慢導入,方案二需要鎖表,且時間太長,而我們數據庫版本是5.5.47且innodb-file-per-table參數沒設置,所以不適合該方案,方案三操作比較麻煩,時間也需要很久,經過評估停機時間可以縮短爲1小時,最後選擇方案1。

實施

前置步驟

1、從我們歸檔的數據庫中導出近期半個月數據。

mkdir -p /mnt/backup/mysql/
cd /mnt/backup/mysql/

mysqldump -uroot -p1 -t --skip-add-locks --single-transaction --quick --databases xxx --tables table1 --where 'clock >1543161600 and clock <=1543939200' >table1_1126-1204.sql
mysqldump -uroot -p1 -t --skip-add-locks --single-transaction --quick --databases xxx --tables table2 --where 'clock >1543161600 and clock <=1543939200' >table2_1126-1204.sql
...
...
...

2、從生產數據庫中導出近一天的數據

比如說我們準備12月10升級,這裏我們可以提前到處那六張大表的數據,該步驟可以不用停服務,並且不影響數據庫正常運行。

mkdir -p /mnt/backup/mysql/
cd /mnt/backup/mysql/

mysqldump -uroot -p1 -t --skip-add-locks --single-transaction --quick --databases xxx --tables table1 --where 'clock >1543939200 and clock <=1544371200' >table1_1205-1209.sql
mysqldump -uroot -p1 -t --skip-add-locks --single-transaction --quick --databases xxx--table2 --where 'clock >1543939200 and clock <=1544371200' >table2_1205-1209.sql
...
...
...

操作步驟

1、停止相關服務

systemctl stop httpd
systemctl stop supervisord
systemctl stop xxx-server.service

2、執行清理腳本

由於這些大表都已經分區,所以清理就只需要保留當天的分區,以前的分區可以都drop掉,由於不同的庫清理腳本不一樣,所以腳本我這裏就不列出來了

3、導出其餘表數據

使用mysqldump導出主數據庫中除了那6個大表以外的其他所有數據庫的數據

mkdir -p /mnt/backup/mysql/
cd /mnt/backup/mysql/
mysqldump -R -uroot -p1 --databases db1 db2alert db3 guacamole --ignore-table=db1.table1 --ignore-table=db1.table2 > mysqldump.sql

備份mysql數據庫中的用戶和數據庫信息

mysqldump -t -uroot -p1 --databases mysql> mysql_info_data.sql

4、使用mysqldump 分別導出 6個大表清理後的數據

cd /mnt/backup/mysql/
mysqldump -uroot -p1 --databases xxx --tables table1 --where 'clock >1544371200' >table1.sql
mysqldump -uroot -p1 --databases xxx --tables table2 --where 'clock >1544371200' >table2.sql
...
...
...

5、刪除所有數據庫

mysql -uroot -p1 

drop database db1;
drop database db2;
drop database db3;

刪除數據/var/lib/mysql下日誌文件

systemctl stop mariadb

rm -rf /var/lib/mysql/ib*

#查看空間是否釋放
df

6、配置/etc/my.cnf

修改/etc/my.cnf,這裏需要將共享表空間設置爲獨立表空間。
備註:mysql 5.6.7版本後會默認開啓獨立表空間innodb-file-per-table=on
當前服務現在使用的版本是5.5.47,所以需要在my.cnf中進行配置,而openstack用的是5.6.22所以不用設置。
添加下面一句:

[mysqld]
innodb-file-per-table=1

systemctl start mariadb


mysql -uroot -p1
 
#查看設置是否生效,如果是on則說明已生效
show variables like '%per_table%';

7、分批導入數據庫

cd /mnt/backup/mysql
mysql -uroot -p1

source mysqldump.sql;

use db1
source table1.sql;
source table2.sql;
...
...
...

8、驗證數據

mysql -uroot -p1

use db1
show table status like 'table1%';

9、重啓服務並驗證

systemctl start httpd
systemctl start supervisord
systemctl start xxx-server.service

可以說現在服務運行正常了,現在就是慢慢導入歷史數據了

後置步驟

導入歷史數據

cd /mnt/backup/mysql
mysql -uroot -p1

use db1
source table1_1205-1209.sql;
source table2_1205-1209.sql;
...
...
...

發佈了228 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章