MySQL被黑客攻击勒索5000美元,幸好有备份
生活随笔
收集整理的這篇文章主要介紹了
MySQL被黑客攻击勒索5000美元,幸好有备份
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:IT邦德
中國(guó)DBA聯(lián)盟(ACDU)成員,目前從事DBA及程序編程
(Web\java\Python)工作,主要服務(wù)于生產(chǎn)制造
現(xiàn)擁有 Oracle 11g OCP/OCM、
Mysql、Oceanbase(OBCA)認(rèn)證
分布式TBase\TDSQL數(shù)據(jù)庫(kù)、國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫(kù)以及紅帽子認(rèn)證
從業(yè)8年DBA工作,在數(shù)據(jù)庫(kù)領(lǐng)域有豐富的經(jīng)驗(yàn)擅長(zhǎng)主流數(shù)據(jù)Oracle、MySQL、PG 運(yùn)維開發(fā),
備份恢復(fù),安裝遷移,性能優(yōu)化、故障應(yīng)急處理等。
文章目錄
- 前言
- 一、設(shè)計(jì)場(chǎng)景
- 二、技術(shù)點(diǎn)
- 三、服務(wù)器信息
- 四、準(zhǔn)備工作
- 4.1 開啟binlog日志功能
- 4.2 新建目錄,執(zhí)行
- 4.3 修改所屬的用戶/組:(不修改,mysql無法重啟)
- 4.4 修改mysql配置文件,執(zhí)行
- 4.5 重啟mysql,執(zhí)行
- 五、編寫全量備份腳本(Mysql-FullyBak.sh)
- 六、編寫增量備份腳本
- 七、設(shè)置定時(shí)任務(wù)crontab
- 八、恢復(fù)操作
前言
近期項(xiàng)目馬上要交付了,結(jié)果數(shù)據(jù)庫(kù)別黑客惡意攻擊,項(xiàng)目馬上要交付了,面臨違約,幸好有備份,項(xiàng)目順利交付,本文將MySQL備份的方法做了詳細(xì)闡述黑客被攻擊發(fā)送的短信
一、設(shè)計(jì)場(chǎng)景
1)增量備份在周一到周六凌晨3點(diǎn),復(fù)制mysql-bin.00000*到指定目錄; 2)全量備份則使用mysqldump將整個(gè)數(shù)據(jù)庫(kù)導(dǎo)出, 每周日凌晨3點(diǎn)執(zhí)行,并會(huì)刪除上周留下的mysq-bin.00000*,然后對(duì)mysql的備份操作會(huì)保留在bak.log文件中。二、技術(shù)點(diǎn)
Mysqldump、mysqlbinlog、crontab
三、服務(wù)器信息
主機(jī):centos7;數(shù)據(jù)庫(kù):mysql5.7
四、準(zhǔn)備工作
4.1 開啟binlog日志功能
binlog日志默認(rèn)不開啟,記錄的是mysql數(shù)據(jù)庫(kù)dml的操作
mysql> show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-------+4.2 新建目錄,執(zhí)行
which mysql #mkdir /home/mysql #cd /home/mysql #mkdir mysql-bin #增量日志文件目錄4.3 修改所屬的用戶/組:(不修改,mysql無法重啟)
#chown -R mysql.mysql mysql-bin4.4 修改mysql配置文件,執(zhí)行
#vim /etc/my.cnf 其中,server-id表示單個(gè)結(jié)點(diǎn)的id,這里由于只有一個(gè)結(jié)點(diǎn), 所以可以把id隨機(jī)指定為一個(gè)數(shù),這里將id設(shè)置成1。 若集群中有多個(gè)結(jié)點(diǎn),則id不能相同(對(duì)于5.7以下版本不需要指定server-id); log_bin指定binlog日志文件的存儲(chǔ)路徑,日志文件以mysql-bin開頭。 加入以下內(nèi)容: server-id=1 log_bin=/home/mysql/mysql-bin/mysql-bin4.5 重啟mysql,執(zhí)行
#service mysqld restart --root用戶執(zhí)行(5)查看日志文件
#cd /home/mysql/mysql-bin [root@Jeames mysql-bin]# ll total 8 -rw-r----- 1 mysql oinstall 154 Jan 14 05:45 mysql-bin.000001 -rw-r----- 1 mysql oinstall 39 Jan 14 05:45 mysql-bin.index (6)進(jìn)入數(shù)據(jù)庫(kù),查看啟動(dòng)效果 #mysql -uroot -p #show variables like '%log_bin%'; +---------------------------------+---------------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------------+ | log_bin | ON | | log_bin_basename | /home/mysql/mysql-bin/mysql-bin | | log_bin_index | /home/mysql/mysql-bin/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+---------------------------------------+五、編寫全量備份腳本(Mysql-FullyBak.sh)
進(jìn)入/home/mysql目錄 新建目錄:mkdir backup 進(jìn)入backup目錄,新建daily目錄:mkdir daily 切換到/home/mysql目錄,執(zhí)行 #vim Mysql-FullyBak.sh --腳本中注意日期中+前面的空格及單引號(hào) -------------------------------------------------------- #mysqldump to Fully backup mysql data per week! source /etc/profile BakDir=/home/mysql/backup LogFile=/home/mysql/backup/bak.log Date=`date +%Y%m%d` Begin=`date +"%Y年%m月%d日 %H:%M:%S"` cd $BakDir DumpFile=$Date.sql GZDumpFile=$Date.sql.tgz /usr/bin/mysqldump -uroot -proot --quick --events --databases wmp --flush-logs \ --delete-master-logs --single-transaction >$DumpFile /bin/tar -zvcf $GZDumpFile $DumpFile /bin/rm $DumpFile oldDate=`date -d '7 days ago' +%Y%m%d` oldBakFile=${oldDate}".sql.tgz" /bin/rm $oldBakFile Last=`date +"%Y年%m月%d日 %H:%M:%S"` echo 開始:$Begin 結(jié)束:$Last $GZDumpFile succ >> $LogFile cd $BakDir/daily /bin/rm -f *參數(shù)說明: –flush-logs 結(jié)束當(dāng)前日志,生成新日志文件。 –delete-master-logs 清除以前的日志,以釋放空間。 –quick 該選項(xiàng)在導(dǎo)出大表時(shí)很有用,它強(qiáng)制 MySQLdump 從服務(wù)器查詢?nèi)〉糜涗浿苯虞敵龆皇侨〉盟杏涗浐髮⑺鼈兙彺娴絻?nèi)存中。 –single-transaction 該選項(xiàng)在導(dǎo)出數(shù)據(jù)之前提交一個(gè) BEGIN SQL語句,BEGIN 不會(huì)阻塞任何應(yīng)用程序且能保證導(dǎo)出時(shí)數(shù)據(jù)庫(kù)的一致性狀態(tài)。它只適用于事務(wù)表,例如 InnoDB 和 BDB。 –events 導(dǎo)出事件 –master-data=2 其中參數(shù)–master-data=[0|1|2] 0: 不記錄 1:記錄為CHANGE MASTER語句 2:記錄為注釋的CHANGE MASTER語句 –master-data=2 選項(xiàng)將會(huì)在輸出SQL中記錄下完全備份后新日志文件的名稱, 用于日后恢復(fù)時(shí)參考,例如輸出的備份SQL文件中含有: CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106;六、編寫增量備份腳本
切換到/home/mysql目錄,執(zhí)行: #vim Mysql-DailyBak.sh ------------------------------------------- #use cp to bakup mysql data everyday! source /etc/profile BakDir=/home/mysql/backup/daily BinDir=/home/mysql/mysql-bin LogFile=/home/mysql/backup/bak.log BinFile=/home/mysql/mysql-bin/mysql-bin.index /usr/bin/mysqladmin -uroot -proot flush-logs Counter=`wc -l $BinFile |awk '{print $1}'` #產(chǎn)生新的mysql-bin.00000*文件 NextNum=0 #比對(duì)$Counter和¥NextNum這兩個(gè)值來確定文件是不是最新的 for file in `cat $BinFile` dobase=`basename $file`#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./NextNum=`expr $NextNum + 1`if [[ $NextNum -eq $Counter ]]thenecho $base skip! >> $LogFileelsedest=$BakDir/$baseif(test -e $dest)#test -e用于檢測(cè)目標(biāo)文件是否存在,存在就寫exist!到$LogFile去thenecho $base exist! >> $LogFileelsecp $BinDir/$base $BakDirecho $base copying >> $LogFilefi fi donechmod a+x test.sh --給所有用戶執(zhí)行test.sh讀寫的權(quán)限七、設(shè)置定時(shí)任務(wù)crontab
在命令行輸入: #crontab -e 添加相應(yīng)的任務(wù),wq存盤退出 #每個(gè)星期日凌晨3:00執(zhí)行完全備份腳本 0 3 * * 0 /bin/bash -x /home/mysql/Mysql-FullyBak.sh >/dev/null 2>&1 #周一到周六凌晨3:00做增量備份 0 3 * * 1-6 /bin/bash -x /home/mysql/Mysql-DailyBak.sh >/dev/null 2>&1 (2)查看定時(shí)任務(wù):#crontab -l參數(shù)與說明: crontab -u //設(shè)定某個(gè)用戶的cron服務(wù),一般root用戶在執(zhí)行這個(gè)命令的時(shí)候需要此參數(shù) ;crontab -l //列出某個(gè)用戶cron服務(wù)的詳細(xì)內(nèi)容;crontab -r //刪除所有用戶的cron服務(wù);crontab -e //編輯某個(gè)用戶的cron服務(wù);例如:root查看自己的cron設(shè)置:crontab -u root -l例如:root刪除用戶fred的cron設(shè)置:crontab -u fred -r 補(bǔ)充: (1)可直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應(yīng)的任務(wù)(針對(duì)整個(gè)系統(tǒng)的crontab文件); (2)crontab執(zhí)行定時(shí)任務(wù)的記錄會(huì)寫入到/var/log/cron這個(gè)文件中,該記錄以帳號(hào)為區(qū)分。八、恢復(fù)操作
恢復(fù)過程亦會(huì)寫入日志文件,如果數(shù)據(jù)量很大,建議先關(guān)閉binlog日志功能 1、場(chǎng)景:假設(shè)早上9點(diǎn)的時(shí)候,數(shù)據(jù)庫(kù)被攻擊,drop了整個(gè)數(shù)據(jù)庫(kù)! 2、恢復(fù)思路: 利用全備的sql文件中記錄的CHANGE MASTER語句,binlog文件及其位置點(diǎn)信息, 找出binlog文件中增量的那部分。 用mysqlbinlog命令將上述的binlog文件導(dǎo)出為sql文件,并剔除其中的drop語句。 通過全備文件和增量binlog文件導(dǎo)出的sql文件,就可以恢復(fù)到完整的數(shù)據(jù)?;謴?fù)步驟: (1)首先,解壓最新的全量備份文件,進(jìn)入備份文件目錄,執(zhí)行 #cd /home/mysql/backup #tar -zxvf XXX.sql.tgz (2)查看全備之后新增的binlog文件,執(zhí)行 #grep CHANGE XXX.sql --全備文件 即mysql-bin.000027的154行,因此在該文件之前的binlog文件中的數(shù)據(jù)都已經(jīng)包含在這個(gè)全備的sql文件中。 (3)將其他binlog文件(除去mysql-bin.000027)導(dǎo)出sql文件,執(zhí)行 #mysqlbinlog mysql-bin.00000X >00Xbin.sql (4) vim編輯最新的00Xbin.sql刪除其中的drop語句 (5)恢復(fù)全備數(shù)據(jù),執(zhí)行: #mysql -uroot -p < XXX.sql 如:#mysql -uroot -p < 20210115.sql(7)恢復(fù)增量數(shù)據(jù),執(zhí)行(wmp為數(shù)據(jù)庫(kù)名稱) #mysql -uroot -p wpm<00Xbin.sql 如:#mysql -uroot -p wmp<000027bin.sql補(bǔ)充(若沒刪除,直接通過增量備份恢復(fù)) 若要恢復(fù)mysql-bin.000027文件的154行之后的信息 進(jìn)入到mysql-bin.000027目錄,執(zhí)行(wmp為數(shù)據(jù)庫(kù)名) #cd daily #mysqlbinlog --start-position=154 --database=wmp mysql-bin.000027 | mysql -uroot -p 至此數(shù)據(jù)庫(kù)全部恢復(fù)完成總結(jié)
以上是生活随笔為你收集整理的MySQL被黑客攻击勒索5000美元,幸好有备份的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux手机纠错软件,纠错神笔Lern
- 下一篇: CESM2笔记——porting-新机器