mysql 歷史數據表遷移方案


當業務運行一段時間后,會出現有些表數據量很大,可能對系統性能產生不良的影響,常見的如訂單表、登錄log表等,這些數據很有時效性,比如我們一般很少去查上個月的訂單,最多也就是報表統計會涉及到。

在我們的數據庫中,用戶登錄表就是這種類型的表,一般而言,表中的數據是不可逆的,只有插入操作沒有刪除或者修改操作,表示在過去一段時間內完成的事實業務數據。比如登錄表表示一段時間內用戶的登錄信息,登錄一次游戲就會在數據庫中記錄一條數據。

1、對於備份這類表的策略是:

  1. 第一次備份全表的數據導入到備份表中,也就是全備。
  2. 以后每天只將增加的量自動遷移到備份表中,這里通過自增列的值相比較得到增量,如第一次全備導入備份表,這時自增列的最大值為max(idx),通過這個值到從庫中查詢,只要大於這個值的所有記錄形成增量。
  3. 備份完成后,分批刪除主庫上的數據。

2、下面是具體操作步驟:

  •    第一次全備和恢復
select * from table into outfile "/data/backup/xxxx.txt";  --導出備份數據
load data infile "/data/backup/ xxxx.txt " into table bak_table;  --在另外服務器備份表中恢復
  •    腳本程序實現:拉取線上服務器上的增量數據,然后導入本服務器,實現增量備份

  1)需要在同一目錄下建立三個sql腳本,如a.sql  b.sql  c.sql

   a.sql: 拼接增量備份sql,形成備份語句

use report;
select concat('use report;select * from t_user_session where user_session_idx>',max(user_session_idx),' into outfile "/data/backup/incrementalbackup/t_user_session_ios1.txt";') from t_user_session;

   b.sql:接受a.sql的輸出

   c.sql: 負責恢復數據

use report;
load data infile '/data/backup/incrementalbackup/t_user_session_ios1.txt' into table t_user_session_ios1;

  2)loadlog1.sh:通過輸入a.sql,生成備份語句到b.sql中。用於在線上服務器執行增量備份數據。

#!/bin/bash
 /data/mysql/bin/mysql -h 127.0.0.1 -uroot -p'******' -N  < /data/backup/scripts/a.sql > /data/backup/scripts/b.sql

  3)loadlog2.sh:連接到線上服務器,刪除以前備份文件,並通過b.sql進行數據導出,然后刪除本地服務器上上次備份的文件。

1 #!/bin/bash
2 
3 ssh root@1.1.1.1 "/data/backup/scripts/del_bak_file.sh"
4 
5 /data/mysql/bin/mysql -uroot -p'*****' -h'1.1.1.1' < /data/backup/scripts/b.sql
6 
7 rm -f /data/backup/incrementalbackup/*.txt  

  4)loadlog3.sh:將備份服務器上導出的數據文件拷貝到本地服務器

1 #!/bin/bash
2 scp root@10.10.67.114:/data/backup /*.txt /data/backup/

  5)loadlog4.sh:加載數據到本地服務器

1 #!/bin/bash
2 
3 /data/mysql/bin/mysql -h 127.0.0.1 -uroot -p'*******' < /data/backup/scripts/c.sql

  6)loadlogall.sh:用於統一執行loadlog1-4,並輸入日志。

 1      #!/bin/bash
 2 
 3      echo '------start-loadlog.sh-----'>> /data/backup/scripts/logs/loadlog.log
 4 
 5      date "+%Y-%m-%d %H:%M:%S" >>  /data/backup/scripts/logs/loadlog.log
 6      /data/backup/scripts/loadlog.sh
 7 
 8      echo '----end--loadlog.sh-----'   >>   /data/backup/scripts/logs/loadlog.log
 9 
10      /data/backup/scripts/loadlog2.sh
11 
12      echo '----end---loadlog2.sh------' >>  /data/backup/scripts/logs/loadlog.log
13 
14      /data/backup/scripts/loadlog3.sh
15 
16      echo '------end-loadlog3.sh------------' >> /data/backup/scripts/logs/loadlog.log
17 
18      /data/backup/scripts/loadlog4.sh
19 
20      echo '-----end-loadlog4.sh----------'  >>  /data/backup/scripts/logs/loadlog.log

  7)將loadlogall.sh加入定時目錄,每隔1個小時拉取一次。

      crontab -e

      --編輯文件      分 時 天 月 周 年 命令

到這里備份就完成了,然后可以清理部分的歷史數據了,當然了,這里幾個loadlog*.sh顯得有些繁瑣,這里為了一步一步看得更清楚些,完全可以把這些整合到一個shell腳本里。

 

未完待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM