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

一次生產環境mysql遷移操做(一)數據歸檔mysql

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

上文中增長了定時歸檔,如今一些大表磁盤空間一直不釋放,致使數據庫文件愈來愈大。如今介紹下數據導入導出方案。數據庫

方案選擇

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

通過對比一、二、3,方案一操做簡單,比較靈活能夠先導入近一天數據,之後的數據慢慢導入,方案二須要鎖表,且時間太長,而咱們數據庫版本是5.5.47且innodb-file-per-table參數沒設置,因此不適合該方案,方案三操做比較麻煩,時間也須要好久,通過評估停機時間能夠縮短爲1小時,最後選擇方案1。.net

實施

前置步驟

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

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
...
...
...

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

好比說咱們準備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
...
...
...

操做步驟

一、中止相關服務

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

二、執行清理腳本

因爲這些大表都已經分區,因此清理就只須要保留當天的分區,之前的分區能夠都drop掉,因爲不一樣的庫清理腳本不同,因此腳本我這裏就不列出來了code

三、導出其他表數據

使用mysqldump導出主數據庫中除了那6個大表之外的其餘全部數據庫的數據server

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數據庫中的用戶和數據庫信息blog

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

四、使用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
...
...
...

五、刪除全部數據庫

mysql -uroot -p1 

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

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

systemctl stop mariadb

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

#查看空間是否釋放
df

六、配置/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%';

七、分批導入數據庫

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

source mysqldump.sql;

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

八、驗證數據

mysql -uroot -p1

use db1
show table status like 'table1%';

九、重啓服務並驗證

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;
...
...
...
相關文章
相關標籤/搜索