mysql binlog介紹以及通過binlog實(shí)現(xiàn)數(shù)據(jù)恢復(fù)

mysql的二進(jìn)制日志binlog可以說是mysql最重要的日志滤港,它記錄了所有數(shù)據(jù)更新sql眯勾,以事件形式記錄湃番,還包含語句所執(zhí)行的消耗的時(shí)間,mysql的二進(jìn)制日志是事務(wù)安全型的赌结。binlog日志主要用于mysql主從復(fù)制和數(shù)據(jù)恢復(fù)捞蛋。
原文地址:代碼匯個(gè)人博客 http://www.codehui.net/info/66.html

簡(jiǎn)單了解binlog

binlog是一個(gè)二進(jìn)制格式的文件,用于記錄用戶對(duì)數(shù)據(jù)庫更新的sql語句信息柬姚,但是不包括select和show這類操作拟杉,因?yàn)檫@類操作對(duì)數(shù)據(jù)本身并沒有修改。然后量承,若操作本身并沒有導(dǎo)致數(shù)據(jù)庫發(fā)生變化搬设,那么該操作也會(huì)寫入二進(jìn)制日志。

默認(rèn)情況下撕捍,binlog日志是二進(jìn)制格式的拿穴,不能使用查看文本工具的命令(比如,cat忧风,vi等)查看默色,而使用mysqlbinlog解析查看。

一般來說開啟二進(jìn)制日志大概會(huì)有1%的性能損耗狮腿,其他介紹可以查看 官網(wǎng)文檔介紹

binlog作用

binlog日志有兩個(gè)最重要的使用場(chǎng)景

1腿宰、mysql主從復(fù)制

MySQL Replication在Master端開啟binlog呕诉,Master把它的二進(jìn)制日志傳遞給slaves來達(dá)到master-slave數(shù)據(jù)一致的目的。
可以參考:《mysql 主從復(fù)制 基于binlog 簡(jiǎn)單實(shí)踐》

2吃度、數(shù)據(jù)恢復(fù)

通過使用mysqlbinlog程序處理二進(jìn)制日志文件甩挫,來使恢復(fù)數(shù)據(jù)。

binlog日志包括兩類文件

1规肴、二進(jìn)制日志索引文件(文件名后綴為.index)用于記錄所有的二進(jìn)制文件
2捶闸、二進(jìn)制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句select)語句事件。在mysql 主從復(fù)制中有見到拖刃。

開啟binlog日志

1、修改配置文件

可以通過如下命令查看mysql讀取的配置文件贪绘,順序排前的優(yōu)先

root@ba586179fe4b:/# mysql --help|grep 'my.cnf'
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

編輯配置文件兑牡,然后重啟mysql

root@ba586179fe4b:/# vi /etc/my.cnf

[mysqld]
# 開啟二進(jìn)制日志功能,mysql-bin 是日志的基本名或前綴名
log-bin=mysql-bin

2税灌、登錄數(shù)據(jù)庫 mysql -u root -p123456

查看binlog日志是否開啟均函,log_bin為ON表示開啟binlog日志

mysql> show variables like 'log_%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| log_error                       |       |
| log_output                      | FILE  |
| log_queries_not_using_indexes   | OFF   |
| log_slave_updates               | OFF   |
| log_slow_queries                | OFF   |
| log_warnings                    | 1     |
+---------------------------------+-------+
8 rows in set (0.00 sec)

binlog日志常用操作命令

1、查看所有binlog日志列表

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

2菱涤、查看master狀態(tài)苞也,即最后(最新)一個(gè)binlog日志的編號(hào)名稱,及其最后一個(gè)操作事件pos結(jié)束點(diǎn)(Position)值

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

3粘秆、刷新log日志如迟,自此刻開始產(chǎn)生一個(gè)新編號(hào)的binlog日志文件

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

4、重置(清空)所有binlog日志

mysql> reset master;
Query OK, 0 rows affected (0.01 sec)

查看binlog日志內(nèi)容攻走,常用有兩種方式

1殷勘、使用mysqlbinlog自帶查看命令

注: binlog是二進(jìn)制文件,普通文件查看器cat more vi等都無法打開昔搂,必須使用自帶的 mysqlbinlog 命令查看玲销,binlog日志與數(shù)據(jù)庫文件在同目錄中(我的環(huán)境配置安裝是選擇在/usr/local/mysql/data中)
在MySQL5.5以下版本使用mysqlbinlog命令時(shí)如果報(bào)錯(cuò),就加上"--no-defaults"選項(xiàng)

mysql數(shù)據(jù)存放在/var/lib/mysql目錄摘符,通過mysqlbinlog打開日志文件

/usr/local/mysql/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000001

截取最后一次執(zhí)行的日志片段

# at 1778
#190221  6:58:51 server id 1  end_log_pos 1899  Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1550732331/*!*/;
INSERT INTO `proxy` (`id`, `name`) VALUES ('6', 'code')
/*!*/;
# at 1899
#190221  6:58:51 server id 1  end_log_pos 1926  Xid = 45
  • 主要參數(shù)解釋:
    • server id 1 : 數(shù)據(jù)庫主機(jī)的服務(wù)號(hào)贤斜;
    • end_log_pos 1899: sql結(jié)束時(shí)的pos節(jié)點(diǎn)
    • thread_id=1: 線程號(hào)

2、使用show binlog events命令查看

上面這種辦法讀取出binlog日志的全文內(nèi)容較多逛裤,不容易分辨查看pos點(diǎn)信息瘩绒,這里介紹一種更為方便的查詢命令:

mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

選項(xiàng)解析:

IN 'log_name' 指定要查詢的binlog文件名(不指定就是第一個(gè)binlog文件)
FROM pos 指定從哪個(gè)pos起始點(diǎn)開始查起(不指定就是從整個(gè)文件首個(gè)pos點(diǎn)開始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查詢總條數(shù)(不指定就是所有行)

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

mysql> show binlog events in 'mysql-bin.000001'\G;
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 107
       Info: Server ver: 5.5.62-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 107
 Event_type: Query
  Server_id: 1
End_log_pos: 178
       Info: BEGIN
*************************** 3. row ***************************
   Log_name: mysql-bin.000001
        Pos: 178
 Event_type: Query
  Server_id: 1
End_log_pos: 299
       Info: use `codehui`; INSERT INTO `proxy` (`id`, `name`) VALUES ('6', 'code')
*************************** 4. row ***************************
   Log_name: mysql-bin.000001
        Pos: 299
 Event_type: Xid
  Server_id: 1
End_log_pos: 326
       Info: COMMIT /* xid=61 */
4 rows in set (0.00 sec)

ERROR: 
No query specified

mysql>

上面這條語句可以將指定的binlog日志文件,分成有效事件行的方式返回别凹,并可使用limit指定pos點(diǎn)的起始偏移草讶,查詢條數(shù)。

  • 查詢第一個(gè)(最早)的binlog日志:
mysql> show binlog events\G;
  • 指定查詢 mysql-bin.000021 這個(gè)文件:
mysql> show binlog events in 'mysql-bin.000021'\G;
  • 指定查詢 mysql-bin.000021 這個(gè)文件炉菲,從pos點(diǎn):8224開始查起:
mysql> show binlog events in 'mysql-bin.000021' from 8224\G;
  • 指定查詢 mysql-bin.000021 這個(gè)文件堕战,從pos點(diǎn):8224開始查起坤溃,查詢10條
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10\G;
  • 指定查詢 mysql-bin.000021 這個(gè)文件,從pos點(diǎn):8224開始查起嘱丢,偏移2行薪介,查詢10條
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10\G;

通過binlog數(shù)據(jù)恢復(fù)

這個(gè)數(shù)據(jù)測(cè)試比較麻煩,我們先模擬個(gè)場(chǎng)景

codehui數(shù)據(jù)庫會(huì)在每天凌晨1點(diǎn)使用計(jì)劃任務(wù)進(jìn)行一次備份越驻,這里先手動(dòng)執(zhí)行一下備份任務(wù)汁政。然后就有了數(shù)據(jù)庫截止今天凌晨1點(diǎn)的數(shù)據(jù)庫備份文件。早上9點(diǎn)和中午12點(diǎn)數(shù)據(jù)庫都執(zhí)行了增刪改操作缀旁,然后下午18點(diǎn)直接刪掉了codehui數(shù)據(jù)庫记劈,場(chǎng)景大概就是這樣,下面進(jìn)行測(cè)試數(shù)據(jù)的恢復(fù)并巍。

先在codehui數(shù)據(jù)庫插入測(cè)試數(shù)據(jù)

mysql> use codehui;
Database changed
mysql> CREATE TABLE `test` (
    -> `id` int(11) NOT NULL AUTO_INCREMENT,\
    -> `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
    -> PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.10 sec)

mysql> desc test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `test` (`id`, `name`) VALUES ('1', 'code');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `test` (`id`, `name`) VALUES ('2', 'php');
Query OK, 1 row affected (0.04 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | code |
|  2 | php  |
+----+------+
2 rows in set (0.00 sec)

mysql>

1目木、先備份一下數(shù)據(jù)庫
備份數(shù)據(jù)庫方法mysqldump,詳細(xì)請(qǐng)參見 mysql 數(shù)據(jù)備份

root@ba586179fe4b:/# /usr/local/mysql/bin/mysqldump -uroot -p123456 -B -F -R -x --master-data=2 codehui|gzip > /opt/backup/codehui.bak.sql.gz
root@ba586179fe4b:/# ls /opt/backup
codehui.bak.sql.gz

mysqldump備份方法參數(shù)說明:

-B:指定數(shù)據(jù)庫
-F:刷新日志
-R:備份存儲(chǔ)過程等
-x:鎖表

--master-data:在備份語句里添加CHANGE MASTER語句以及binlog文件及位置點(diǎn)信息

由于上面在全備份的時(shí)候使用了-F選項(xiàng)懊渡,那么當(dāng)數(shù)據(jù)備份操作剛開始的時(shí)候系統(tǒng)就會(huì)自動(dòng)刷新log刽射,這樣就會(huì)自動(dòng)產(chǎn)生一個(gè)新的binlog日志,這個(gè)新的binlog日志就會(huì)用來記錄備份之后的數(shù)據(jù)庫"增刪改"操作

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

也就是說剃执, mysql-bin.000003 是用來記錄凌晨1點(diǎn)之后對(duì)數(shù)據(jù)庫的所有"增刪改"操作誓禁。

2、早上9點(diǎn)對(duì)數(shù)據(jù)庫進(jìn)行"增"操作肾档,新插入3條數(shù)據(jù)

mysql> INSERT INTO `test` (`id`, `name`) VALUES ('3', 'java'),('4','golang'),('5','shell');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | code   |
|  2 | php    |
|  3 | java   |
|  4 | golang |
|  5 | shell  |
+----+--------+
5 rows in set (0.00 sec)

3摹恰、中午12點(diǎn)對(duì)數(shù)據(jù)庫進(jìn)行"改"操作,修改1條數(shù)據(jù)

mysql> UPDATE `test` SET `name`='mysql' WHERE `id`='1';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | mysql  |
|  2 | php    |
|  3 | java   |
|  4 | golang |
|  5 | shell  |
+----+--------+
5 rows in set (0.00 sec)

4阁最、下午18點(diǎn)戒祠,某程序員因心情不爽準(zhǔn)備跑路,刪掉了數(shù)據(jù)庫codehui

mysql> drop database codehui;
Query OK, 3 rows affected (0.14 sec)

5速种、此刻先別慌姜盈,他忘記了我們還有大招,就是binlog日志配阵。
先仔細(xì)查看最后一個(gè)binlog日志馏颂,并記錄下關(guān)鍵的pos點(diǎn),到底是哪個(gè)pos點(diǎn)的操作導(dǎo)致了數(shù)據(jù)庫的破壞(通常在最后幾步)棋傍;

我們先備份一下最后一個(gè)binlog日志

root@ba586179fe4b:/# cp -v /var/lib/mysql/mysql-bin.000003 /opt/backup/
'/var/lib/mysql/mysql-bin.000003' -> '/opt/backup/mysql-bin.000003'

此時(shí)執(zhí)行一次刷新日志索引操作僵朗,重新開始新的binlog日志記錄文件侮穿。理論說 mysql-bin.000003 這個(gè)文件不會(huì)再有后續(xù)寫入了(便于我們分析原因及查找pos點(diǎn))慢蜓,以后所有數(shù)據(jù)庫操作都會(huì)寫入到下一個(gè)日志文件肛响;

mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)

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

6、讀取日志 分析問題,讀取日志方法上面已經(jīng)說到派昧,這里使用第二種

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 |         107 | Server ver: 5.5.62-log, Binlog ver: 4                                                              |
| mysql-bin.000003 |  107 | Query       |         1 |         178 | BEGIN                                                                                              |
| mysql-bin.000003 |  178 | Query       |         1 |         327 | use `codehui`; INSERT INTO `test` (`id`, `name`) VALUES ('3', 'java'),('4','golang'),('5','shell') |
| mysql-bin.000003 |  327 | Xid         |         1 |         354 | COMMIT /* xid=184 */                                                                               |
| mysql-bin.000003 |  354 | Query       |         1 |         425 | BEGIN                                                                                              |
| mysql-bin.000003 |  425 | Query       |         1 |         544 | use `codehui`; INSERT INTO `proxy` (`id`, `name`) VALUES ('1', 'my')                               |
| mysql-bin.000003 |  544 | Xid         |         1 |         571 | COMMIT /* xid=188 */                                                                               |
| mysql-bin.000003 |  571 | Query       |         1 |         642 | BEGIN                                                                                              |
| mysql-bin.000003 |  642 | Query       |         1 |         784 | use `codehui`; UPDATE `proxy` SET `name`='mysql' WHERE (`id`='1') AND (`name`='my') LIMIT 1        |
| mysql-bin.000003 |  784 | Xid         |         1 |         811 | COMMIT /* xid=190 */                                                                               |
| mysql-bin.000003 |  811 | Query       |         1 |         882 | BEGIN                                                                                              |
| mysql-bin.000003 |  882 | Query       |         1 |         995 | use `codehui`; UPDATE `test` SET `name`='mysql' WHERE `id`='1'                                     |
| mysql-bin.000003 |  995 | Xid         |         1 |        1022 | COMMIT /* xid=192 */                                                                               |
| mysql-bin.000003 | 1022 | Query       |         1 |        1109 | drop database codehui                                                                              |
| mysql-bin.000003 | 1109 | Rotate      |         1 |        1152 | mysql-bin.000004;pos=4                                                                             |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------+
15 rows in set (0.00 sec)

到這里是不很興奮黔姜,看到了備份之后執(zhí)行的所有的"增刪改"記錄。
通過分析蒂萎,造成數(shù)據(jù)庫破壞的pos點(diǎn)區(qū)間是介于 1022--1109 之間(這是按照日志區(qū)間的pos節(jié)點(diǎn)算的)秆吵,只要恢復(fù)到1109前就可。

7五慈、恢復(fù)凌晨1點(diǎn)的備份數(shù)據(jù)纳寂,也就是剛才手動(dòng)備份的數(shù)據(jù)

root@ba586179fe4b:/# cd /opt/backup/
root@ba586179fe4b:/opt/backup# ls
codehui.bak.sql.gz  mysql-bin.000003
root@ba586179fe4b:/opt/backup# gzip -d codehui.bak.sql.gz
root@ba586179fe4b:/opt/backup# mysql -uroot -p123456 -v < codehui.bak.sql

這樣就恢復(fù)了截至當(dāng)日凌晨(1:00)前的備份數(shù)據(jù)都恢復(fù)了,之后的數(shù)據(jù)通過binlog日志mysql-bin.000003進(jìn)行恢復(fù)泻拦。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| codehui            |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

mysql> use codehui;
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_codehui |
+-------------------+
| demo              |
| proxy             |
| test              |
+-------------------+
3 rows in set (0.00 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | code |
|  2 | php  |
+----+------+
2 rows in set (0.00 sec)

8毙芜、從binlog日志恢復(fù)數(shù)據(jù)

恢復(fù)命令的語法格式:

mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數(shù)據(jù)庫名

  • 常用參數(shù)選項(xiàng)解釋:
    • --start-position=875 起始pos點(diǎn)
    • --stop-position=954 結(jié)束pos點(diǎn)
    • --start-datetime="2016-9-25 22:01:08" 起始時(shí)間點(diǎn)
    • --stop-datetime="2019-9-25 22:09:46" 結(jié)束時(shí)間點(diǎn)
    • --database=codehui 指定只恢復(fù)codehui數(shù)據(jù)庫(一臺(tái)主機(jī)上往往有多個(gè)數(shù)據(jù)庫,只限本地log日志)
  • 不常用選項(xiàng):
    • -u --user=name 連接到遠(yuǎn)程主機(jī)的用戶名
    • -p --password[=name] 連接到遠(yuǎn)程主機(jī)的密碼
    • -h --host=name 從遠(yuǎn)程主機(jī)上獲取binlog日志
    • --read-from-remote-server 從某個(gè)MySQL服務(wù)器上讀取binlog日志

小結(jié):實(shí)際是將讀出的binlog日志內(nèi)容聪轿,通過管道符傳遞給mysql命令爷肝。這些命令、文件盡量寫成絕對(duì)路徑陆错;

A、 完全恢復(fù)(需要手動(dòng)編輯mysql-bin.000003金赦,將那條drop語句剔除掉)

溫馨提示:在恢復(fù)全備數(shù)據(jù)之前必須將該binlog文件移出音瓷,否則恢復(fù)過程中,會(huì)繼續(xù)寫入語句到binlog夹抗,最終導(dǎo)致增量恢復(fù)數(shù)據(jù)部分變得比較混亂绳慎!

root@ba586179fe4b:/opt/backup# mysqlbinlog /opt/backup/mysql-bin.000003 > /opt/backup/000003.sql
root@ba586179fe4b:/opt/backup# vi /opt/backup/000003.sql #刪除里面的drop語句
# 刪掉drop語句前后的# at 到 /*!*/之間的內(nèi)容

root@ba586179fe4b:/opt/backup# mysql -uroot -p123456 -v < /opt/backup/000003.sql

查看數(shù)據(jù)漠烧,已經(jīng)恢復(fù)了

mysql> use codehui;
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> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | mysql  |
|  2 | php    |
|  3 | java   |
|  4 | golang |
|  5 | shell  |
+----+--------+
5 rows in set (0.00 sec)

# 然后刪除codehui數(shù)據(jù)庫杏愤,測(cè)試第二種方法
mysql> drop database codehui;
Query OK, 3 rows affected (0.06 sec)

# 重新導(dǎo)入凌晨1點(diǎn)的備份數(shù)據(jù),
root@ba586179fe4b:/opt/backup# mysql -uroot -p123456 -v < codehui.bak.sql

B已脓、 指定pos結(jié)束點(diǎn)恢復(fù)(部分恢復(fù)):

--stop-position=571 pos結(jié)束節(jié)點(diǎn)(按照事務(wù)區(qū)間算珊楼,是571)

  • 注意:
    • 此pos結(jié)束節(jié)點(diǎn)介于"test"表原始數(shù)據(jù)與更新"name='mysql'"之前的數(shù)據(jù),這樣就可以恢復(fù)到 更改"name='mysql'"之前的數(shù)據(jù)了度液。

操作如下

root@ba586179fe4b:/opt/backup# mysqlbinlog --stop-position=571 --database=codehui /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p123456 -v codehui

mysql> use codehui;
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> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | code   |
|  2 | php    |
|  3 | java   |
|  4 | golang |
|  5 | shell  |
+----+--------+
5 rows in set (0.00 sec)

C厕宗、 指定pos點(diǎn)區(qū)間恢復(fù)(部分恢復(fù)):

更新 "name='mysql'" 這條數(shù)據(jù),日志區(qū)間是Pos[882] --> End_log_pos[995]堕担,按事務(wù)區(qū)間是:Pos[811] --> End_log_pos[1022]

單獨(dú)恢復(fù) "name='mysql'" 這步操作已慢,可這樣:
按照binlog日志區(qū)間單獨(dú)恢復(fù):

root@ba586179fe4b:/opt/backup# mysqlbinlog --start-position=882 --stop-position=995 --database=codehui /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p123456 -v codehui

按照事務(wù)區(qū)間單獨(dú)恢復(fù)

root@ba586179fe4b:/opt/backup# mysqlbinlog --start-position=811 --stop-position=1022 --database=codehui /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p123456 -v codehui

如果要恢復(fù)區(qū)間內(nèi)的多條日志,按事務(wù)區(qū)間恢復(fù)就可以霹购。

mysql> use codehui;
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> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | mysql  |
|  2 | php    |
|  3 | java   |
|  4 | golang |
|  5 | shell  |
+----+--------+
5 rows in set (0.00 sec)

查看數(shù)據(jù)庫恢復(fù)了"name='mysql'"佑惠,這樣就恢復(fù)了刪除前的數(shù)據(jù)狀態(tài)了。

D、 也可指定時(shí)間區(qū)間恢復(fù)(部分恢復(fù)):除了用pos點(diǎn)的辦法進(jìn)行恢復(fù)膜楷,也可以通過指定時(shí)間區(qū)間進(jìn)行恢復(fù)旭咽,按時(shí)間恢復(fù)需要用mysqlbinlog命令讀取binlog日志內(nèi)容,找時(shí)間節(jié)點(diǎn)把将。


# 起始時(shí)間點(diǎn)
--start-datetime="YYYY-MM-DD H:I:S"
# 結(jié)束時(shí)間點(diǎn)
--stop-datetime ="YYYY-MM-DD H:I:S"

# 用法舉例
mysqlbinlog --start-position=811 --start-datetime="YYYY-MM-DD H:I:S" --stop-datetime="YYYY-MM-DD H:I:S" --database=codehui /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p123456 -v codehui
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轻专,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子察蹲,更是在濱河造成了極大的恐慌请垛,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽议,死亡現(xiàn)場(chǎng)離奇詭異宗收,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亚兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門混稽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人审胚,你說我怎么就攤上這事匈勋。” “怎么了膳叨?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵洽洁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我菲嘴,道長(zhǎng)饿自,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任龄坪,我火速辦了婚禮昭雌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘健田。我一直安慰自己烛卧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布抄课。 她就那樣靜靜地躺著唱星,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跟磨。 梳的紋絲不亂的頭發(fā)上间聊,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音抵拘,去河邊找鬼哎榴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尚蝌。 我是一名探鬼主播迎变,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼飘言!你這毒婦竟也來了衣形?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤姿鸿,失蹤者是張志新(化名)和其女友劉穎谆吴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苛预,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句狼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了热某。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腻菇。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昔馋,靈堂內(nèi)的尸體忽然破棺而出筹吐,到底是詐尸還是另有隱情,我是刑警寧澤秘遏,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布骏令,位于F島的核電站,受9級(jí)特大地震影響垄提,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜周拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一铡俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妥粟,春花似錦审丘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至播急,卻和暖如春脓钾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桩警。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工可训, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓握截,卻偏偏與公主長(zhǎng)得像飞崖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谨胞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容