Mysql binlog備份數據及恢復數據,學會這個,我在也不怕刪庫跑路啦~


導讀

  我一直都主張,技多不壓身(沒有學不會的技術,只有不學習的人),多學一項技能,未來就少求人一次。網上經常聽到xxx刪庫跑路,萬一真的遇到了,相信通過今天的學習,也能將數據再恢復回來~~~

  當然啦,備份數據/還原數據也是挺重要的,可以看我另一篇:點我直達

  如果感覺這樣還不安全,可以考慮授予用戶權限:點我直達

介紹

  記錄着mysql數據庫中的一些增刪改操作(沒有查詢)

功能

  1. 數據復制(主從復制)
  2. 數據恢復

注意事項

  開啟二進制日志會有性能的消耗!!!

查看二進制日志是否開啟

查看是否開啟:show variables like 'log_bin%';

 

開啟二進制日志

  修改my.cnf文件

[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小寫不明感,敏感為
lower_case_table_names=1
# skip-grant-tables
log-bin=/usr/local/mysql/log_bin_data/mysql-bin
server-id=1
切換:cd /usr/local/mysql/
創建目錄(用於存放二進制日志):mkdir log_bin_data

注意:
1、log_bin_data必須要有mysql權限
2、修改權限:chown -R mysql:mysql /usr/local/mysql/log_bin_data

修改my.cnf: vim /usr/local/mysql/my.cnf

在[mysqld]下添加
log-bin=/usr/local/mysql/log_bin_data/mysql-bin
server-id=1


修改完之后,一定要重啟mysql服務:service mysql restart

 

 

  此時繼續查看二進制日志是否開啟,現在可以看到已經開啟

查看binlog日志列表

show master logs;

 

 

刷新二進制日志

  刷新/重啟mysql服務,都會在加一個binlog日志文件

flush logs;

重置(清空)日志文件

  有時候感覺日志文件沒啥用,還占用空間,可以使用下面命令重置日志文件

登錄mysql:mysql -uroot -proot
刪除binlog:reset master

二進制備份

  備份好二進制日志文件之后,往表中插入一條記錄,然后將數據庫給刪掉,等會使用二進制日志恢復數據庫

描述:備份本地db2庫,並壓縮存放到/mysql_data_back下

切換:cd /usr/local/mysql/bin 語法:./mysqldump -u用戶 -p密碼 -F --databases 數據庫 | gzip > 路徑+文件名 備份:./mysqldump -uroot -proot -F --databases db2 | gzip > /mysql_data_back/db2.sql.gz 新增一條記錄: INSERT INTO `db2`.`nba_player`(`id`, `countryEn`, `teamName`, `birthDay`, `country`, `teamCityEn`, `code`, `displayAffiliation`, `displayName`, `schoolType`, `teamConference`, `teamConferenceEn`, `weight`, `teamCity`, `playYear`, `jerseyNo`, `teamNameEn`, `draft`, `displayNameEn`, `birthDayStr`, `heightValue`, `position`, `age`, `playerId`) VALUES (999999, 'Croatia', '快船', 858661200000, '克羅地亞', 'LA', 'ivica_zubac', 'Croatia', '伊維察 祖巴茨', '', '西部', 'Western', '108.9 公斤', '洛杉磯', 3, '40', 'Clippers', 2016, 'Ivica Zubac', '1997-03-18', 2.16, '中鋒', 22, '1627826');

剛才的所有操作,都會記錄在binlog日志文件中!

 

binlog恢復數據

  剛才我們備份數據庫之前,新增一條記錄,id=9999,恢復回去之后,如果有這條記錄,說明我們恢復成功啦

查看binlog里的日志

語法:./mysqlbinlog binlog日志文件

切換:/usr/local/mysql/bin

查看binlog日志 :./mysqlbinlog /usr/local/mysql/log_bin_data/mysql-bin.000002

  如果查看binlog日志報錯,解決方法

添加:--no-defaults參數
./mysqlbinlog --no-defaults /usr/local/mysql/log_bin_data/mysql-bin.000002

將binlog日志轉換普通文件

語法:./mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v binlog日志文件 > 導出文件路徑

./mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v /usr/local/mysql/log_bin_data/mysql-bin.000002 > /mysql_data_back/bin-log.sql

恢復數據方式

根據binlog日志的時間

根據binlog的位置

 

找到刪除庫的行

./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n |grep -iw 'drop'


./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n | sed -n '行數1,行數2p'

./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n | sed -n '59,70p'

開始恢復數據

先恢復數據庫

  先將原先備份的數據庫給備份回來

切換: cd /mysql_data_back

解壓: gunzip -d db2.sql.gz 

恢復數據:mysql -uroot -proot -h 127.0.0.1 < /mysql_data_back/db2.sql

  此時數據庫已經恢復回來,但是新增的那條記錄沒有恢復回來(id=9999)

恢復binlog

 

語法:./mysqlbinlog --no-defaults --set-charset=utf8 --stop-position="停止位置" binlog日志 | mysql -u用戶 -p密碼
./mysqlbinlog --no-defaults --set-charset=utf8 --stop-position="761" /usr/local/mysql/log_bin_data/mysql-bin.000002 | mysql -uroot -proot

恢復某一段記錄
./mysqlbinlog --no-defaults --set-charset=utf8 --start-position="開始坐標" --stop-position="結束坐標" | mysql -uroot -proot

備注

  本次案例,我先備份一次數據庫然后新增一條記錄再把數據庫給刪了,我先恢復數據庫(恢復的數據庫中是沒新增的這條記錄),通過binlog將新增的記錄,回滾到數據庫中

搞定


免責聲明!

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



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