一次生產環境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
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,這裏須要將共享表空間設置爲獨立表空間。 備註: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; ... ... ...