1. 程式人生 > >Mysql之binlog日誌說明及利用binlog日誌恢復資料操作記錄

Mysql之binlog日誌說明及利用binlog日誌恢復資料操作記錄

在網上找到的一篇文章,覺得寫得很好,怕下次找不到了,顧轉載之,原文連結:

眾所周知,binlog日誌對於mysql資料庫來說是十分重要的。在資料丟失的緊急情況下,我們往往會想到用binlog日誌功能進行資料恢復(定時全備份+binlog日誌恢復增量資料部分),化險為夷!

廢話不多說,下面是梳理的binlog日誌操作解說:

一、初步瞭解binlog
MySQL的二進位制日誌binlog可以說是MySQL最重要的日誌,它記錄了所有的DDL和DML語句(除了資料查詢語句select),以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進位制日誌是事務安全型的。
----------------------------------------------------------------------------------------------------------------------------------------------
DDL
----Data Definition Language 資料庫定義語言 
主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,資料型別,表之間的連結和約束等初始化工作上,他們大多在建立表時使用。

DML
----Data Manipulation Language 資料操縱語言
主要的命令是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言
----------------------------------------------------------------------------------------------------------------------------------------------

mysqlbinlog常見的選項有以下幾個:
--start-datetime:從二進位制日誌中讀取指定等於時間戳或者晚於本地計算機的時間


--stop-datetime:從二進位制日誌中讀取指定小於時間戳或者等於本地計算機的時間 取值和上述一樣
--start-position:從二進位制日誌中讀取指定position 事件位置作為開始。
--stop-position:從二進位制日誌中讀取指定position 事件位置作為事件截至

*********************************************************************

一般來說開啟binlog日誌大概會有1%的效能損耗。
binlog日誌有兩個最重要的使用場景: 
1)MySQL主從複製:MySQL Replication在Master端開啟binlog,Master把它的二進位制日誌傳遞給slaves來達到
master-slave資料一致的目的。 
2)自然就是資料恢復

了,通過使用mysqlbinlog工具來使恢復資料。
binlog日誌包括兩類檔案:
1)二進位制日誌索引檔案(檔名字尾為.index)用於記錄所有的二進位制檔案
2)二進位制日誌檔案(檔名字尾為.00000*)記錄資料庫所有的DDL和DML(除了資料查詢語句select)語句事件。

二、開啟binlog日誌:
1)編輯開啟mysql配置檔案/etc/mys.cnf
[[email protected] ~]# vim /etc/my.cnf
在[mysqld] 區塊新增 
log-bin=mysql-bin 確認是開啟狀態(mysql-bin 是日誌的基本名或字首名);

2)重啟mysqld服務使配置生效
[[email protected] ~]# /etc/init.d/mysqld stop
[[email protected] ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]

3)檢視binlog日誌是否開啟
mysql> show variables like 'log_%'; 
+---------------------------------+---------------------+
| Variable_name | Value |
+---------------------------------+---------------------+
log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
| log_error | /var/log/mysqld.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
+---------------------------------+---------------------+
9 rows in set (0.00 sec)

三、常用的binlog日誌操作命令
1)檢視所有binlog日誌列表
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4102 |
+------------------+-----------+
2 rows in set (0.00 sec)

2)檢視master狀態,即最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 4102 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

3)flush重新整理log日誌,自此刻開始產生一個新編號的binlog日誌檔案
mysql> flush logs; 
Query OK, 0 rows affected (0.13 sec)

mysql> show master logs; 
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4145 |
| mysql-bin.000003 | 106 |
+------------------+-----------+
3 rows in set (0.00 sec)

注意:
每當mysqld服務重啟時,會自動執行此命令,重新整理binlog日誌;在mysqldump備份資料時加 -F 選項也會重新整理binlog日誌;

4)重置(清空)所有binlog日誌
mysql> reset master;
Query OK, 0 rows affected (0.12 sec)

mysql> show master logs; 
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)

四、檢視binlog日誌內容,常用有兩種方式:
1)使用mysqlbinlog自帶檢視命令法:
注意:
-->binlog是二進位制檔案,普通檔案檢視器cat、more、vim等都無法開啟,必須使用自帶的mysqlbinlog命令檢視
-->binlog日誌與資料庫檔案在同目錄中
-->在MySQL5.5以下版本使用mysqlbinlog命令時如果報錯,就加上 “--no-defaults”選項

檢視mysql的資料存放目錄,從下面結果可知是/var/lib//mysql
[[email protected] ~]# ps -ef|grep mysql
root 9791 1 0 21:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9896 9791 0 21:18 pts/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 9916 9699 0 21:18 pts/0 00:00:00 mysql -px xxxx
root 9919 9715 0 21:23 pts/1 00:00:00 grep --color mysql

[[email protected] ~]# cd /var/lib/mysql/
[[email protected] mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock ops test

使用mysqlbinlog命令檢視binlog日誌內容,下面擷取其中的一個片段分析:
[[email protected] mysql]# mysqlbinlog mysql-bin.000002
..............
# at 624
#160925 21:29:53 server id 1 end_log_pos 796 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474810193/*!*/;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')        #執行的sql語句
/*!*/;
# at 796
#160925 21:29:53 server id 1 end_log_pos 823 Xid = 17                  #執行的時間
.............

解釋:
server id 1 : 資料庫主機的服務號;
end_log_pos 796: sql結束時的pos節點
thread_id=11: 執行緒號

2)上面這種辦法讀取出binlog日誌的全文內容比較多,不容易分辨檢視到pos點資訊
下面介紹一種更為方便的查詢命令:
命令格式:
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
引數解釋:
IN 'log_name' :指定要查詢的binlog檔名(不指定就是第一個binlog檔案)
FROM pos :指定從哪個pos起始點開始查起(不指定就是從整個檔案首個pos點開始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查詢總條數(不指定就是所有行)

mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 125 |
| mysql-bin.000002 | 823 |
+------------------+-----------+
2 rows in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000002'\G;
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 106
Event_type: Query
Server_id: 1
End_log_pos: 188
Info: use `ops`; drop table customers
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 188
Event_type: Query
Server_id: 1
End_log_pos: 529
Info: use `ops`; CREATE TABLE IF NOT EXISTS `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum('m','w') NOT NULL DEFAULT 'm',
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*************************** 4. row ***************************
Log_name: mysql-bin.000002
Pos: 529
Event_type: Query
Server_id: 1
End_log_pos: 596
Info: BEGIN
*************************** 5. row ***************************
Log_name: mysql-bin.000002
Pos: 596
Event_type: Intvar
Server_id: 1
End_log_pos: 624
Info: INSERT_ID=1
*************************** 6. row ***************************
Log_name: mysql-bin.000002
Pos: 624
Event_type: Query
Server_id: 1
End_log_pos: 796
Info: use `ops`; insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')
*************************** 7. row ***************************
Log_name: mysql-bin.000002
Pos: 796
Event_type: Xid
Server_id: 1
End_log_pos: 823
Info: COMMIT /* xid=17 */
7 rows in set (0.00 sec)

ERROR: 
No query specified

mysql>

上面這條語句可以將指定的binlog日誌檔案,分成有效事件行的方式返回,並可使用limit指定pos點的起始偏移,查詢條數!
如下操作示例:
a)查詢第一個(最早)的binlog日誌:
mysql> show binlog events\G;

b)指定查詢 mysql-bin.000002這個檔案:
mysql> show binlog events in 'mysql-bin.000002'\G;

c)指定查詢 mysql-bin.000002這個檔案,從pos點:624開始查起:
mysql> show binlog events in 'mysql-bin.000002' from 624\G;

d)指定查詢 mysql-bin.000002這個檔案,從pos點:624開始查起,查詢10條(即10條語句)
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10\G;

e)指定查詢 mysql-bin.000002這個檔案,從pos點:624開始查起,偏移2行(即中間跳過2個),查詢10條
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G;

五、利用binlog日誌恢復mysql資料

以下對ops庫的member表進行操作
mysql> use ops;
mysql> CREATE TABLE IF NOT EXISTS `member` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `name` varchar(16) NOT NULL,
-> `sex` enum('m','w') NOT NULL DEFAULT 'm',
-> `age` tinyint(3) unsigned NOT NULL,
-> `classid` char(6) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.10 sec)

mysql> show tables;
+---------------+
| Tables_in_ops |
+---------------+
| member |
+---------------+
1 row in set (0.00 sec)

mysql> desc member;
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| sex | enum('m','w') | NO | | m | |
| age | tinyint(3) unsigned | NO | | NULL | |
| classid | char(6) | YES | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

事先插入兩條資料
mysql> insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+-----------+-----+-----+---------+
2 rows in set (0.00 sec)

下面開始進行場景模擬:
1)
ops庫會在每天凌晨4點進行一次完全備份的定時計劃任務,如下:
[[email protected] ~]# crontab -l
0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz

這裡手動執行下,將ops資料庫備份到/opt/backup/ops_$(date +%F).sql.gz檔案中:
[[email protected] ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz
Enter password: 
[[email protected] ~]# ls /opt/backup/
ops_2016-09-25.sql.gz
-----------------
引數說明:
-B:指定資料庫
-F:重新整理日誌
-R:備份儲存過程等
-x:鎖表
--master-data:在備份語句裡新增CHANGE MASTER語句以及binlog檔案及位置點資訊
-----------------
待到資料庫備份完成,就不用擔心資料丟失了,因為有完全備份資料在!!

由於上面在全備份的時候使用了-F選項,那麼當資料備份操作剛開始的時候系統就會自動重新整理log,這樣就會自動產生
一個新的binlog日誌,這個新的binlog日誌就會用來記錄備份之後的資料庫“增刪改”操作
檢視一下:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

也就是說, mysql-bin.000003 是用來記錄4:00之後對資料庫的所有“增刪改”操作。

2)
早上9點上班了,由於業務的需求會對資料庫進行各種“增刪改”操作。
比如:在ops庫下member表內插入、修改了資料等等:

先是早上進行插入資料:
mysql> insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
Query OK, 5 rows affected (0.08 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

3)
中午又執行了修改資料操作:
mysql> update ops.member set name='李四' where id=4;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update ops.member set name='小二' where id=2;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

4)
在下午18:00的時候,悲劇莫名其妙的出現了!
手賤執行了drop語句,直接刪除了ops庫!嚇尿!
mysql> drop database ops;
Query OK, 1 row affected (0.02 sec)

5)
這種時候,一定不要慌張!!!
先仔細檢視最後一個binlog日誌,並記錄下關鍵的pos點,到底是哪個pos點的操作導致了資料庫的破壞(通常在最後幾步);

先備份一下最後一個binlog日誌檔案:
[[email protected] ~]# cd /var/lib/mysql/
[[email protected] mysql]# cp -v mysql-bin.000003 /opt/backup/
`mysql-bin.000003' -> `/opt/backup/mysql-bin.000003'
[[email protected] mysql]# ls /opt/backup/
mysql-bin.000003 ops_2016-09-25.sql.gz

接著執行一次重新整理日誌索引操作,重新開始新的binlog日誌記錄檔案。按理說mysql-bin.000003
這個檔案不會再有後續寫入了,因為便於我們分析原因及查詢ops節點,以後所有資料庫操作都會寫入到下一個日誌檔案。
mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

6)
讀取binlog日誌,分析問題。
讀取binlog日誌的方法上面已經說到。
方法一:使用mysqlbinlog讀取binlog日誌:
[[email protected] ~]# cd /var/lib/mysql/
[[email protected] mysql]# mysqlbinlog mysql-bin.000003

方法二:登入伺服器,並檢視(推薦此種方法)
mysql> show binlog events in 'mysql-bin.000003';

+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000003 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000003 | 106 | Query | 1 | 173 | BEGIN |
| mysql-bin.000003 | 173 | Intvar | 1 | 201 | INSERT_ID=3 |
| mysql-bin.000003 | 201 | Query | 1 | 444 | use `ops`; insert into ops.member(`name`,`sex`,`age`,`gsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') |
| mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ |
| mysql-bin.000003 | 471 | Query | 1 | 538 | BEGIN |
| mysql-bin.000003 | 538 | Query | 1 | 646 | use `ops`; update ops.member set name='李四' where id= |
| mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ |
| mysql-bin.000003 | 673 | Query | 1 | 740 | BEGIN |
| mysql-bin.000003 | 740 | Query | 1 | 848 | use `ops`; update ops.member set name='小二' where id= |
| mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ |
| mysql-bin.000003 | 875 | Query | 1 | 954 | drop database ops |
| mysql-bin.000003 | 954 | Rotate | 1 | 997 | mysql-bin.000004;pos=4 |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
13 rows in set (0.00 sec)

或者:

mysql> show binlog events in 'mysql-bin.000003'\G;
.........
.........
*************************** 12. row ***************************
Log_name: mysql-bin.000003
Pos: 875
Event_type: Query
Server_id: 1
End_log_pos: 954
Info: drop database ops
*************************** 13. row ***************************
Log_name: mysql-bin.000003
Pos: 954
Event_type: Rotate
Server_id: 1
End_log_pos: 997
Info: mysql-bin.000004;pos=4
13 rows in set (0.00 sec)

通過分析,造成資料庫破壞的pos點區間是介於 875--954 之間(這是按照日誌區間的pos節點算的),只要恢復到875前就可

7)
先把凌晨4點全備份的資料恢復:
[[email protected] ~]# cd /opt/backup/
[[email protected] backup]# ls
mysql-bin.000003 ops_2016-09-25.sql.gz
[[email protected] backup]# gzip -d ops_2016-09-25.sql.gz 
[[email protected] backup]# mysql -uroot -p -v < ops_2016-09-25.sql 
Enter password: 
--------------
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */
--------------

--------------
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */
--------------

.............
.............

--------------
/*!40111 SET [email protected]_SQL_NOTES */
--------------

這樣就恢復了截至當日凌晨(4:00)前的備份資料都恢復了。

mysql> show databases;                        #發現ops庫已經恢復回來了
mysql> use ops;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_ops |
+---------------+
| member |
+---------------+
1 row in set (0.00 sec)

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+-----------+-----+-----+---------+
2 rows in set (0.00 sec)

mysql>

但是這僅僅只是恢復了當天凌晨4點之前的資料,在4:00--18:00之間的資料還沒有恢復回來!!
怎麼辦呢?
莫慌!這可以根據前面提到的mysql-bin.000003的新binlog日誌進行恢復。

8)
從binlog日誌恢復資料
恢復命令的語法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u使用者名稱 -p密碼 資料庫名

--------------------------------------------------------
常用引數選項解釋:
--start-position=875 起始pos點
--stop-position=954 結束pos點
--start-datetime="2016-9-25 22:01:08" 起始時間點
--stop-datetime="2019-9-25 22:09:46" 結束時間點
--database=zyyshop 指定只恢復zyyshop資料庫(一臺主機上往往有多個數據庫,只限本地log日誌)
-------------------------------------------------------- 
不常用選項: 
-u --user=name 連線到遠端主機的使用者名稱
-p --password[=name] 連線到遠端主機的密碼
-h --host=name 從遠端主機上獲取binlog日誌
--read-from-remote-server 從某個MySQL伺服器上讀取binlog日誌
--------------------------------------------------------
小結:實際是將讀出的binlog日誌內容,通過管道符傳遞給mysql命令。這些命令、檔案儘量寫成絕對路徑;

a)完全恢復(需要手動vim編輯mysql-bin.000003,將那條drop語句剔除掉)
[[email protected] backup]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

b)指定pos結束點恢復(部分恢復):
--stop-position=471 pos結束節點(按照事務區間算,是471)
注意:
此pos結束節點介於“member表原始資料”與更新“name='李四'”之前的資料,這樣就可以恢復到更改“name='李四'”之前的資料了。
操作如下:
[[email protected] ~]# /usr/bin/mysqlbinlog --stop-position=471 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

恢復截止到更改“name='李四'”之間的資料(按照事務區間算,是673)
[[email protected] ~]# /usr/bin/mysqlbinlog --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

c)指定pso點區間恢復(部分恢復):
更新 name='李四' 這條資料,日誌區間是Pos[538] --> End_log_pos[646],按事務區間是:Pos[471] --> End_log_pos[673]

更新 name='小二' 這條資料,日誌區間是Pos[740] --> End_log_pos[848],按事務區間是:Pos[673] --> End_log_pos[875]

c1)
單獨恢復 name='李四' 這步操作,可這樣:
按照binlog日誌區間單獨恢復:
[[email protected] ~]# /usr/bin/mysqlbinlog --start-position=538 --stop-position=646 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

按照事務區間單獨恢復
[[email protected] ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c2)
單獨恢復 name='小二' 這步操作,可這樣:
按照binlog日誌區間單獨恢復:
[[email protected] ~]# /usr/bin/mysqlbinlog --start-position=740 --stop-position=848 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

按照事務區間單獨恢復
[[email protected] ~]# /usr/bin/mysqlbinlog --start-position=673 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c3)
將 name='李四'、name='小二' 多步操作一起恢復,需要按事務區間,可這樣:
[[email protected] ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

檢視資料庫:
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |

相關推薦

Mysqlbinlog日誌說明利用binlog日誌恢復數據操作記錄

Language 命令 ani art ase 回來 log日誌 slaves update 眾所周知,binlog日誌對於mysql數據庫來說是十分重要的。在數據丟失的緊急情況下,我們往往會想到用binlog日誌功能進行數據恢復(定時全備份+binlog日誌恢復增量數據部

Mysqlbinlog日誌說明利用binlog日誌恢復資料操作記錄

在網上找到的一篇文章,覺得寫得很好,怕下次找不到了,顧轉載之,原文連結:眾所周知,binlog日誌對於mysql資料庫來說是十分重要的。在資料丟失的緊急情況下,我們往往會想到用binlog日誌功能進行資料恢復(定時全備份+binlog日誌恢復增量資料部分),化險為夷!廢話不多

windows下mysql開啟binlog日誌利用binlog日誌恢復資料筆記

1、開啟binlog日誌。 找到mysql安裝目錄,開啟配置檔案my.ini 在[mysqld]下新增: bin-log=mysql-bin 儲存後重啟mysql。此時在data目錄會生成mysql-bin.000001和mysql-bin.index。 注意:My

MySQLdelete 忘加where條件誤刪除恢復

MySQL之delete刪除恢復一、mysql環境介紹: mysql數據庫指定字符集位utf8,同時表的字符集也得為utf8,同時mysql要開啟row模式的bin-log日誌 /etc/my.cnf文件字符集參數設置: [root@git-server ~]# grep character-set /etc

MySQLdelete 忘加where條件誤刪除恢復方法二

delete忘加where條件誤刪除恢復和昨天介紹的MySQL之delete 忘加where條件誤刪除恢復的mysql的環境條件是一樣的:mysql數據庫指定字符集位utf8,同時表的字符集也得為utf8,同時mysql要開啟row模式的bin-log日誌 創建一張測試表測試: create table My

keepalived 高可用日誌說明實戰配置日誌路徑

local sysconfig water size 實戰 syslog 查看 onf 說明 日誌文件查看tail -f /var/log/message修改日誌路徑vi /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="

Linux的rsyslog日誌採集journald的日誌

一、rsyslog日誌        Linux核心由很多的子系統組成,包含網路、檔案訪問、記憶體管理等,子系統需要給使用者傳送一些訊息,這些訊息內容包括訊息的重要來源以及重要性等,所有這些子系統都要把訊息傳從到一個可以維護的

MySQL如何利用ibd檔案恢復資料

前言 資料庫丟失之痛 磁碟壞道、斷電等意外不是常態,但遇上了就足夠你“驚心動魄”! 如果是資料庫損壞造成的資料丟失,Binlog也不可用了,怎麼辦?~~ 為了在短時間內無損恢復資料以保證業務穩定性,除了利用binlog,我們還修煉了一招新的恢復技能! 正文 還記得我們之前寫過的《只需一招,讓失控的研

MySQL主從延遲複製實踐生產故障案例恢復實踐

主庫插入資料: mysql> create database lanlan; Query OK, 1 row affected (0.00 sec) 主庫插入完資料1秒以後,從庫執行show databases;檢視資料是否及時同步了,結果如下: mysql> show databases; +—

mysql建庫建表連接數據庫操作

ica 如果 每次 進入 用戶表 ide 名稱 exit p地址 自己做個整理 省的每次都去搜~~ 1、本地連接mysql: 一般可以直接鍵入命令 mysql -uroot -p 回車後提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進

mysqlworkbench如何只匯出(insert語句)資料

https://www.jianshu.com/p/a5cd14bc5499 1. 說明: 出發點:   由於特殊原因,我們只想匯出資料庫中的資料(insert into語句格式的),但是在網上找到的資源很少(關於linux),因此特撰此文。 2. 環境 mys

SpringCloud或SpringBoot+Mybatis-Plus利用AOP+mybatis外掛實現資料操作記錄更新對比

引文   本文主要介紹如何使用Spring AOP + mybatis外掛實現攔截資料庫操作並根據不同需求進行資料對比分析,主要適用於系統中需要對資料操作進行記錄、在更新資料時準確記錄更新欄位 核心:AOP、mybatis外掛(攔截器)、mybatis-Plus實體規範、資料對比 1、相關技術簡介 mybat

Redis利用appendonly.aof恢復資料

Redis利用appendonly.aof恢復資料 1、修改配置檔案,開啟appendonly [[email protected] ~]# cd /var/lib/redis/6379/ [[email protected] 6379]# ls dump.r

安卓效能優化Activity和Fragment通過onSaveInstanceState()儲存和恢復資料

Activity和Fragment 都有自己的生命週期,而且很類似.Fragment比Activity多了onAttach()和onCreateView()這些方法.整體它們兩者是一樣的週期,都會經歷從建立檢視( onCreate(),onCreateView(),onSt

mysql 查詢表中不包含另一張表的資料記錄

tabletouser表 submit 表 查詢submit表中的記錄,只需要年份(time)和表名(tab_id) ,但是如果在tabletouser表中存在相同的年份(year)和表(tabletouser)則不能從submit中提取出 開始想從 submit表中得

MySQL利用binlog回滾DML操作

require shell腳本 table 開發人員 date操作 生成 options root flashback 簡介:數據庫運行過程中難免會發生誤操作,特別是在測試環境 開發人員或測試人員有時會誤刪或者更新錯誤某些數據。這時可以用binlog閃回DML操作。 條件:

MySQLshow binlog events介紹

comm gin reat tro str inf des use create show binlog events;只查看第一個binlog文件的內容: mysql> show binlog events; +------------------+-----+--

利用binlog恢復mysql資料庫資料

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

LOG的含義 : Mysql binlog介紹

1、什麼是binlog         binlog是一個二進位制格式的檔案,用於記錄使用者對資料庫更新的SQL語句資訊,例如更改資料庫表和更改內容的SQL語句都會記錄到binlog裡,但是對庫表等內容的查詢不會記錄。    預設情

mysql binlog系列(一)----binlog介紹、日誌格式、資料檢視等

(一) binlog介紹 binlog,即二進位制日誌,它記錄了資料庫上的所有改變,並以二進位制的形式儲存在磁碟中; 它可以用來檢視資料庫的變更歷史、資料庫增量備份和恢復、Mysql的複製(主從資料庫的複製)。 (二) binlog格式 binlog