一、開啟binlog。
先查看binlog是否開啟
mysql> show variables like "log_bin"; +---------------+-------+ |Variable_name | Value +---------------+-------+ | log_bin OFF +---------------+-------+ 1 row in set (0.00 sec)
值為OFF,需開啟,開啟binlog方式如下:
#vim /etc/my.cnf
在[mysqld]中加入
log-bin = mysql-bin log-bin = /usr/local/mysql/log/mysql-bin.log
重啟mysql服務
#service mysqld stop #service mysqld start
二、類比資料寫入
建庫
create database backup;
建表
CREATE TABLE `number` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', `updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
寫入資料
程序2-1
#coding:utf8 #python2.7 import MySQLdb import time def connect_mysql(db_host="192.168.11.169",user="martin",passwd="martin",db="backup",charset="utf8"): conn = MySQLdb.connect(host=db_host,user=user,passwd=passwd,db=db,charset=charset) conn.autocommit(True) return conn.cursor() #数据插入 for i in range(0,10): #time=time.strftime("%Y-%m-%d %H:%M:%S") sql = 'insert into number(updatetime) values(%s)' values = [(time.strftime("%Y-%m-%d %H:%M:%S"))] db1 = connect_mysql() print db1.executemany(sql,values)
查詢資料
mysql> select * from number; +-------+------------------------+ | id | updatetime +--------------------------------+ | 1 | 2016-06-29 23:27:15 | | 2 | 2016-06-29 23:27:15 | | 3 | 2016-06-29 23:27:15 | | 4 | 2016-06-29 23:27:15 | | 5 | 2016-06-29 23:27:15 | | 6 | 2016-06-29 23:27:15 | | 7 | 2016-06-29 23:27:15 | | 8 | 2016-06-29 23:27:15 | | 9 | 2016-06-29 23:27:15 | | 10 | 2016-06-29 23:27:15 | +-------+------------------------+ 10 rows in set (0.00 sec)
三、全量備份
mysqldump -uroot -p -F --master-data=2 backup |gzip> /martin/data/backup_$(date +%F).sql.gz
註:加-F能刷新binlog,方便恢復時操作。
四、模擬寫入增量資料
繼續執行程序2-1。
查詢資料
mysql> select * from number; +----+---------------------------+ | id | updatetime | +----+---------------------------+ | 1 | 2016-06-29 23:27:15 | | 2 | 2016-06-29 23:27:15 | | 3 | 2016-06-29 23:27:15 | | 4 | 2016-06-29 23:27:15 | | 5 | 2016-06-29 23:27:15 | | 6 | 2016-06-29 23:27:15 | | 7 | 2016-06-29 23:27:15 | | 8 | 2016-06-29 23:27:15 | | 9 | 2016-06-29 23:27:15 | | 10 | 2016-06-29 23:27:15 | | 11 | 2016-06-29 23:31:03 | | 12 | 2016-06-29 23:31:03 | | 13 | 2016-06-29 23:31:03 | | 14 | 2016-06-29 23:31:03 | | 15 | 2016-06-29 23:31:03 | | 16 | 2016-06-29 23:31:03 | | 17 | 2016-06-29 23:31:03 | | 18 | 2016-06-29 23:31:03 | | 19 | 2016-06-29 23:31:03 | | 20 | 2016-06-29 23:31:03 | +-------+---------------------+ 20 rows in set (0.00 sec)
五、增量備份
保留mysql-bin.000002及之後的binlog即可。
六、模擬誤操作
delete from number;
七、再次寫入增量資料
執行程序2-1
select * from bumber;
+------+------------------------+ | id | updatetime | +------+------------------------+ | 21 | 2016-06-29 23:41:06 | | 22 | 2016-06-29 23:41:06 | | 23 | 2016-06-29 23:41:06 | | 24 | 2016-06-29 23:41:06 | | 25 | 2016-06-29 23:41:06 | | 26 | 2016-06-29 23:41:06 | | 27 | 2016-06-29 23:41:06 | | 28 | 2016-06-29 23:41:06 | | 29 | 2016-06-29 23:41:06 | | 30 | 2016-06-29 23:41:06 | +------+------------------------+ 10 rows in set (0.00 sec)
八、恢復
此時發現先前的delete操作為誤操作,急需恢復,恢復過程如下
給該表加上讀鎖
lock table number read;
將全量備份的資料匯入
#cd /martin/data/ #gzip -d number_2016-06-29.sql.gz #grep -i "change" *.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;
刷新日誌
#mysqladmin -uroot -p'martin' flush-logs #cd /usr/local/mysql/log #ls|grep mysql-bin|grep -v index mysql-bin.000001 mysql-bin.000002 mysql-bin.000003
可確定mysql-bin.000002為增量資料binlog
導入全量備份
#cd /martin/data/ #mysql -uroot -p backup < number_2016-06-29.sql #cp /usr/local/mysql/log/mysql-bin.000002 /martin/data/ #mysqlbinlog mysql-bin.000002 >bin.sql #vim bin.sql
在bin.sql找到之前的delete語句,刪除
mysql -uroot -p <bin.sql
九、確認已復原資料
登入mysql
#mysql -uroot -p'martin' backup select * from number;
+----+---------------------+ | id | updatetime | +----+---------------------+ | 1 | 2016-06-29 23:27:15 | | 2 | 2016-06-29 23:27:15 | | 3 | 2016-06-29 23:27:15 | | 4 | 2016-06-29 23:27:15 | | 5 | 2016-06-29 23:27:15 | | 6 | 2016-06-29 23:27:15 | | 7 | 2016-06-29 23:27:15 | | 8 | 2016-06-29 23:27:15 | | 9 | 2016-06-29 23:27:15 | | 10 | 2016-06-29 23:27:15 | | 11 | 2016-06-29 23:31:03 | | 12 | 2016-06-29 23:31:03 | | 13 | 2016-06-29 23:31:03 | | 14 | 2016-06-29 23:31:03 | | 15 | 2016-06-29 23:31:03 | | 16 | 2016-06-29 23:31:03 | | 17 | 2016-06-29 23:31:03 | | 18 | 2016-06-29 23:31:03 | | 19 | 2016-06-29 23:31:03 | | 20 | 2016-06-29 23:31:03 | | 21 | 2016-06-29 23:41:06 | | 22 | 2016-06-29 23:41:06 | | 23 | 2016-06-29 23:41:06 | | 24 | 2016-06-29 23:41:06 | | 25 | 2016-06-29 23:41:06 | | 26 | 2016-06-29 23:41:06 | | 27 | 2016-06-29 23:41:06 | | 28 | 2016-06-29 23:41:06 | | 29 | 2016-06-29 23:41:06 | | 30 | 2016-06-29 23:41:06 | +----+---------------------+ 30 rows in set (0.00 sec)
恢復完成!以上就是本文的全部內容,在操作資料庫時候要多加小心盡量避免誤操作,如果萬一遇到了,希望這篇文章能幫助大家。