1. 程式人生 > 資料庫 >一次生產環境mysql遷移操作(二)mysql空間釋放(碎片整理)

一次生產環境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;
...
...
...