1. 程式人生 > 其它 >MySQL單個大表增量備份+索引+結構變更簡單方法

MySQL單個大表增量備份+索引+結構變更簡單方法

技術標籤:mysqlmysql資料庫sql觸發器

由於使用了低版本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大表備份的簡單方法