MySQL單個大表增量備份+索引+結構變更簡單方法
阿新 • • 發佈:2021-02-06
由於使用了低版本mysql,且是myisam引擎,在進行一個千萬級資料表加索引時過於緩慢,安全起見採用增量模式備份新表,通過重新命名方式遷移結構到新的備份表。
測試版本,目前針對的是MySQL低版本模式進行的測試,與此版本無關。
以下操作皆可以直接用於測試,是編寫文章過程實際SQL
思路,依據原始表,建立三個insert,update,delete表,依賴主鍵ID,並建立三個觸發器,然後全量備份原始表為一個新表,因為原始表資料的增刪改都會記錄在三個表,故單表SQL的操作記錄可以直接拿到。這時選一個時間,或做好指令碼,暫停原始表寫入,匯出觸發器建立的insert,update,delete表記錄,重新匯入備份SQL到備份表中,原始表和備份表改名實現大表操作如加索引,欄位等模式。
1.建立資料庫
create database test_db;
use test_db;
2.建立原始表和insert,update,delete表
建立原始表,這個表就是我們要備份的表了
# 原始表 CREATE TABLE `back_test` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL default 0, `friend_id` int(11) NOT NULL default 0, `dir_id` int(11) NOT NULL default 0, `created` int(11) NOT NULL default 0, PRIMARY KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #插入記錄表 create table back_test_insert like back_test; #更新記錄表 create table back_test_update like back_test; #刪除記錄表 create table back_test_delete ( `id` int(11));
3.建立資料觸發器
SHOW TRIGGERS; delimiter // create trigger back_test_insert after insert on back_test for each row begin insert into back_test_insert set id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created; end// create trigger back_test_update after update on back_test for each row begin replace into back_test_update set id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created; end// create trigger back_test_delete after delete on back_test for each row begin insert into back_test_delete values(old.id); end// delimiter ;
4.加入測試資料
insert into back_test values(null,1,10,1,1198464252);
insert into back_test values(null,1,11,1,1198464252);
insert into back_test values(null,1,2,1,1198464252);
insert into back_test values(null,2,10,1,1198464252);
insert into back_test values(null,2,12,1,1198464252);
insert into back_test values(null,3,12,1,1198464252);
update back_test set dir_id=5 where user_id=3;
update back_test set dir_id=4 where user_id=3;
delete from back_test where user_id=2 and friend_id=12;
5.匯出觸發器記錄備份SQL
退出mysql,使用linux命令列執行備份
mysql -uhomestead -psecret -e "use test_db;select concat('replace into back_test set id=',id,',user_id=',user_id,',friend_id=',friend_id,',dir_id=',dir_id,',created=',created,';') from back_test_insert;">>backup_ii.sql
mysql -uhomestead -psecret -e "use test_db;select concat('update back_test set user_id=',user_id,',friend_id=',friend_id,',dir_id=',dir_id,',created=',created,' where id=',id,';') from back_test_update;">>backup_uu.sql
mysql -uhomestead -psecret -e "use test_db;select concat('delete from back_test where id=',id,';') from back_test_delete">>backup_dd.sql
6.遷移備份
檢視備份檔案結構,依據匯出的備份檔案,暫停資料庫寫入,匯入insert,update,delete表的SQL到備份表,重新命名原始表和備份表,實現資料結構或索引更改。
參考文獻:MySQL大表備份的簡單方法