1. 程式人生 > >binlog恢復mysql資料庫超詳細步驟

binlog恢復mysql資料庫超詳細步驟

日常的資料備份及恢復測試,是DBA工作重中之重的事情,所以要做好備份及測試,日常的備份常見有mysqldump+binlog備份、xtrabackup+binlog備份,無論那一種,幾乎都少不了對binlog的備份,說明了binlog在資料恢復中的重要性,下面做個小測試,是工作中不少運維或者新人DBA容易犯的錯。


建立一個測試表tb1:

複製程式碼

<test>([email protected]) [xuanzhi]> show create table tb1\G
*************************** 1. row ***************************
       Table: tb1
Create Table: CREATE TABLE `tb1` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` char(10) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

<test>(
[email protected]
) [xuanzhi]>

複製程式碼

往表裡插入兩條資料:

複製程式碼

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('aa'),('bb');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

<test>([email protected]) [xuanzhi]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |       329 |
+----------------------+-----------+
1 row in set (0.00 sec)

<test>(
[email protected]
) [xuanzhi]>

複製程式碼

這個時候對資料備份,如果是xtrabackup備份的話,會在有xtrabackup_binlog_info檔案中記錄此時備份是到那個binlog檔案和pos點的,如果是mysqldump備份,則需要帶上--master-data=2這個引數,下面我們的資料量少,用mysqldump備份:

[[email protected] ~]# mysqldump -uroot -p123456  -R --events --triggers=true --master-data=2 --single-transaction xuanzhi > xuanzhi.sql
Warning: Using a password on the command line interface can be insecure.
[
[email protected]
~]# grep -i "CHANGE MASTER" xuanzhi.sql -- CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000001', MASTER_LOG_POS=329; [[email protected] ~]#

備份完後,繼續模擬資料庫有寫入,而還是寫在localhost-bin.000001

複製程式碼

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('cc'),('dd');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

<test>([email protected]) [xuanzhi]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |       538 |
+----------------------+-----------+
1 row in set (0.00 sec)

<test>([email protected]) [xuanzhi]> flush logs;
Query OK, 0 rows affected (0.01 sec)

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('ee');
Query OK, 1 row affected (0.00 sec)

<test>([email protected]) [xuanzhi]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |       589 |
| localhost-bin.000002 |       321 |
+----------------------+-----------+
2 rows in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

上面我們進行flush logs是為了模擬現在已經有多個binlog檔案了,恢復時進行多個binlog一起恢復。

進行誤操,把xunazhi庫drop了:

複製程式碼

<test>([email protected]) [xuanzhi]> drop database xuanzhi;
Query OK, 1 row affected (0.02 sec)

<test>([email protected]) [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

<test>([email protected]) [(none)]> 

複製程式碼

 建立資料xuanzhi,把備份匯入:

<test>([email protected]) [(none)]> create database xuanzhi;    
Query OK, 1 row affected (0.00 sec)
[[email protected] ~]# mysql -uroot -p123456 xuanzhi <./xuanzhi.sql 
Warning: Using a password on the command line interface can be insecure.
[[email protected] ~]# 

檢視資料:

複製程式碼

<test>([email protected]) [(none)]> use xuanzhi
Database changed
<test>([email protected]) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
+----+------+
2 rows in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

可以看到備份前的資料恢復了,我們現在要結合Binlog來恢復,但前提要找出誤操作前的pos點,也就是drop database xuanzhi前的pos點:

複製程式碼

[[email protected] ~]# mysqlbinlog -v --base64-output=DECODE-ROWS localhost-bin.000002 |grep -C 10  -i "drop database" 
### INSERT INTO `xuanzhi`.`tb1`
### SET
###   @1=5
###   @2='ee'
# at 290
#170327 21:10:55 server id 1313306  end_log_pos 321 CRC32 0x825a2f99    Xid = 78
COMMIT/*!*/;
# at 321
#170327 21:19:25 server id 1313306  end_log_pos 422 CRC32 0x8c139cac    Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1490620765/*!*/;
drop database xuanzhi
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[[email protected] ~]# mysql -uroot -p123456 xuanzhi <./xuanzhi.sql 
Warning: Using a password on the command line interface can be insecure.
[[email protected] ~]# 

複製程式碼

從上面可以看到,誤操作前的pos點是321,那我們現在通過binlog來進行資料恢復:

[[email protected] mysql-5.6]# mysqlbinlog --start-position=329 --stop-position=321 localhost-bin.000001 localhost-bin.000002 |mysql -uroot -p123456 xuanzhi
Warning: Using a password on the command line interface can be insecure.
[[email protected] mysql-5.6]# 

 --start-position是備份後記錄下的pos點, --stop-position是誤操前的pos點,如果批多個binlog檔案,那麼start-position是第一個binlog檔案的pos點,stop-position是最後一個binlog的pos點,下面我們看下資料是否恢復回來了:

複製程式碼

<test>([email protected]) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
|  3 | cc   |
|  4 | dd   |
|  5 | ee   |
+----+------+
5 rows in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

這裡要提的是進行恢復前,要把需要恢復的binlog備份好,或者移動拷貝一份到另一個目錄,因為進行資料匯入時也會繼續寫binlog。假如你沒有誤操作的情況下,就是想測試一下資料的恢復,很多人的操作是匯入備份,再從備份裡記錄的binlog檔名和pos點進行binlog恢復,發現步驟都很完美,也沒報錯,恢復後就是隻有備份時的資料,沒有備份後的資料,下面測試一下給大家看:

複製程式碼

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('aa'),('bb');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

<test>([email protected]) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
+----+------+
2 rows in set (0.00 sec)
<test>([email protected]) [xuanzhi]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |       329 |
+----------------------+-----------+
1 row in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

進行備份操作:

[[email protected] ~]# mysqldump -uroot -p123456 -R --events --triggers=true --master-data=2 --single-transaction xuanzhi > xuanzhi.sql
Warning: Using a password on the command line interface can be insecure.
[[email protected] ~]# grep -i "change master" xuanzhi.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000001', MASTER_LOG_POS=329;
[[email protected] ~]# 

繼續寫localhost-bin.000001後進行flush logs生成新的binlog再繼續寫資料,這裡只是想模擬localhost-bin.000001寫滿了切localhost-bin.000002,結合多個binlog一起恢復

複製程式碼

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('cc'),('dd');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

<test>([email protected]) [xuanzhi]> flush logs;
Query OK, 0 rows affected (0.00 sec)

<test>([email protected]) [xuanzhi]> insert into tb1 (name)  value ('dd');
Query OK, 1 row affected (0.01 sec)

<test>([email protected]) [xuanzhi]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |       589 |
| localhost-bin.000002 |       321 |
+----------------------+-----------+
2 rows in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

下面進行恢復測試,正常來說先把備份匯入:

[[email protected] ~]# mysql -uroot -p123456 xuanzhi <./xuanzhi.sql 
Warning: Using a password on the command line interface can be insecure.
[[email protected] ~]# 

檢視資料,只有備份的那兩條記錄:

複製程式碼

<test>([email protected]) [xuanzhi]> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
|  2 | bb   |
+----+------+
2 rows in set (0.00 sec)

<test>([email protected]) [xuanzhi]> 

複製程式碼

那現在通過localhost-bin.000001,localhost-bin.000002來恢復後面那3條資料,那麼起始pos是那個呢,就是上面備份完後備份檔案裡的那個pos,我們進到binlog的存放路徑:

 可以看到備份後的資料是沒有恢復回來的。為什麼呢?因為匯入備份的時候,又開始寫binlog了,而你恢復時用的binlog也就是現在匯入備份時正在寫的binlog。大體過程是這樣的:

1、匯入備份後,備份的所有操作都寫進最後一個binlog了,也就是上面的localhost-bin.000002

2、進行binlog恢復,從備份檔案裡的pos點開始,按理來說是可以恢復到最新資料的,但是上面匯入了備份,匯入時的所有操作都會記錄到localhost-bin.000002

3、備份匯入時會有DROP TABLE和CREATE TABLE的動作寫進binlog裡,所以最終得到的資料,還是備份時的資料。

總結:

        一、在恢復全備資料之前必須將該binlog檔案移出,否則恢復過程中,會繼續寫入語句到binlog,最終導致增量恢復資料部分變得比較混亂

        二、做好資料檔案及binlog的備份至關重要,但不是備份完就算了,要定期進行資料恢復測試或演練

        三、恢復時建議對外停止更新,即禁止更新資料庫

相關推薦

binlog恢復mysql資料庫詳細步驟

日常的資料備份及恢復測試,是DBA工作重中之重的事情,所以要做好備份及測試,日常的備份常見有mysqldump+binlog備份、xtrabackup+binlog備份,無論那一種,幾乎都少不了對binlog的備份,說明了binlog在資料恢復中的重要性,下面做個小測試,是工

在linux系統上安裝mysql-5.6.27資料庫詳細步驟

安裝前準備:到mysql官網(https://dev.mysql.com/downloads/mysql/)下載mysql編譯好的二進位制安裝包,來到官網,我們拉到頁面的下部,找到相應的版本,如圖所示內

MySQL資料庫詳細配置(win7\win10)

1、首先下載MySQL 最新版本下載地址 2、解壓檔案 最好別帶中文路徑,防止一些麻煩。我的地址如下:D:\MySQL\mysql-5.7.22-winx64\bin(這個地址為bin目錄的路徑,之後需要用到) 3、配置環境變數 win7進入環境變數 右擊計算機點選屬性,

利用binlog恢復mysql資料庫資料

前提:mysql資料庫開啟了binlog日誌      通過  show variables like 'log_%'; 檢視是否開啟binlog日誌。      操作步驟:     在資料庫中

基於binlog恢復mysql資料庫

找到對應時間的binlog檔案 mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /var/lib/mysql/mysql-bin.000538| sed -n '/### DELETE FROM `cl

Eclipse連線MySQL資料庫詳細步驟

本人在寫這篇部落格的時候也是菜鳥一隻,百度“Java連線mysql資料庫、eclipse連線資料庫”等文章一大堆,可總是報錯。 下面的操作是經本人驗證,確實可行,包括了jar包匯入、用jdbc連線my

Myeclipse中通過JDBC連線MySQL資料庫詳細步驟

首先要說明的是,使用jdbc連線資料庫並不難,只要你按照接下來的步湊一步一步的做,理清思路,相信你肯定能夠成功。 一、準備工作 下載JDBC驅動。 網上有許多驅動可供下載,但魚龍混雜,可能部分讀者不知

MySQL資料庫遷移詳細步驟

========================================================================================== 一、背景簡介 ==================================

JSP中使用JDBC連線MySQL資料庫詳細步驟

1,首先在自己新建的專案文字框中輸入Web Project的名稱,然後單擊下一步。 2,繼續單擊下一步 3,把Generate web.xml deployment descriptor複選框勾上。 4,單擊Finish,完成Web project工程的建立。 5,開啟MyEclipse Date

使用binlog日誌恢復MySQL資料庫刪除資料的方法

binlog日誌簡介: binlog 就是binary log,二進位制日誌檔案,這個檔案記錄了MySQL所有的DDL和DML(除了資料查詢語句)語句,以事件形式記錄,還包含語句所執行的消耗的時間。 binlog日誌包括兩類檔案: 1)二進位制日誌索引檔案(檔名字尾為.index):用於

將oracle11安裝到虛擬機器並在本機進行遠端操控oracle資料庫詳細步驟另附資源)

文末附所有要用到的資源下載連結 一、背景 當我們在安裝oracle資料庫第一次安裝失敗時,解除安裝是一件超級令人頭大的事情,而且很多時候根本解除安裝不乾淨,而且oracle資料庫很大,當我們本機開啟的服務過多,會影響機器的執行! 這樣就急需一個解決辦法—— 那就是將oracle1

Mysql資料庫詳細安裝步驟

一、下載 1. 進入mysql官網,登陸自己的Oracle賬號(沒有賬號的自己註冊一個),下載Mysql,下載地址:http://dev.mysql.com/downloads/mysql/ 2

Qt中純C++項目發布為dll的方法(詳細步驟

exe 程序 con ostream address 只需要 include free windows 眾所周知,我們可以將C++項目中的類以及函數導出,形成 .dll 文件,以供其他程序使用,下面將說明Qt環境下的使用方法。 首先創建共享庫,步驟如下:

centos7+tomcat部署JavaWeb項目詳細步驟

com version 重新登錄 項目部署 防火墻 類型 執行命令 到你 java環境安裝 本文從http://www.cnblogs.com/cyl048/p/6873124.html轉載 我們平時訪問的網站大多都是發布在雲服務器上的,比如阿裏雲、騰訊雲等。對於新手,尤其

Linux離線安裝mysql 5.6詳細步驟

詳細步驟 export 軟件 zxvf 安裝數據庫 pass 系統啟動 nbsp 復制 一、安裝MySQL 1、下載安裝包 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 2、卸載系統自帶的Mariadb rpm -qa|grep

恢復 MySQL 資料庫人為誤操作丟失的資料

1. 全量備份與增量備份理論基礎 1.1 全量備份 全量資料就是資料庫中的所有資料,全量備份就是把資料庫中所有的資料進行備份。 1.2 增量備份 增量資料就是從上次全量備份之後,到下一次全備之前時間段更新的新資料。對於 MySQL 來說,binlog 日誌就是 MySQL 的增量資料。 1.3 按天

Linux-CentOS7下安裝Elasticsearch6.3.0詳細步驟

檢測是否安裝了Elasticsearch ps aux|grep elasticsearch 1、安裝JDK Elastic 需要 Java 8 環境 安裝JDK具體操作,請點選連結 2、下載Elasticsearch wget https://artifacts.elast

恢復MySQL資料庫刪除的資料

在日常運維工作中,對於資料庫的備份是至關重要的!資料庫對於網站的重要性使得我們對 MySQL 資料庫的管理不容有失!然而是人總難免會犯錯誤,說不定哪天大腦短路了,誤操作把資料庫給刪除了,怎麼辦? 下面,就 MySQL 資料庫誤刪除後的恢復方案進行說明。 一、工作場景 (1)MySQL資料庫每晚12:00

centos7安裝zabbix3.0詳細步驟解析【轉】

安裝前準備: 1.1 安裝依賴包: yum -y install wget net-snmp-devel OpenIPMI-devel httpd openssl-devel java lrzsz fping-devel libcurl-devel perl-DBI pc

如何使用Mysqldump備份和恢復MySQL資料庫

如何使用mysqldump備份和恢復MySQL資料庫 本教程介紹如何使用mysqldump實用程式從命令列備份和還原MySQL或MariaDB資料庫。 mysqldump實用程式建立的備份檔案基本上是一組可用於重新建立原始資料庫的SQL語句。 如果不備份資料庫,則軟體錯誤或硬碟驅動器故