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