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