當業務運行一段時間后,會出現有些表數據量很大,可能對系統性能產生不良的影響,常見的如訂單表、登錄log表等,這些數據很有時效性,比如我們一般很少去查上個月的訂單,最多也就是報表統計會涉及到。
在我們的數據庫中,用戶登錄表就是這種類型的表,一般而言,表中的數據是不可逆的,只有插入操作沒有刪除或者修改操作,表示在過去一段時間內完成的事實業務數據。比如登錄表表示一段時間內用戶的登錄信息,登錄一次游戲就會在數據庫中記錄一條數據。
1、對於備份這類表的策略是:
- 第一次備份全表的數據導入到備份表中,也就是全備。
- 以后每天只將增加的量自動遷移到備份表中,這里通過自增列的值相比較得到增量,如第一次全備導入備份表,這時自增列的最大值為max(idx),通過這個值到從庫中查詢,只要大於這個值的所有記錄形成增量。
- 備份完成后,分批刪除主庫上的數據。
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腳本里。
未完待續。。。