《Mysql入門Linux上通過binlog文件恢復mysql數據庫詳細步驟》要點:
本文介紹了Mysql入門Linux上通過binlog文件恢復mysql數據庫詳細步驟,希望對您有用。如果有疑問,可以聯系我們。
MYSQL必讀?一、binlog 介紹
MYSQL必讀 服務器的二進制日志記錄著該數據庫的所有增刪改的操作日志(前提是要在自己的服務器上開啟binlog),還包括了這些操作的執行時間.為了顯示這些二進制內容,我們可以使用mysqlbinlog命令來查看.
MYSQL必讀 用途1:主從同步
MYSQL必讀 用途2:恢復數據庫(也是線上出現一次數據庫文件丟失后,才對這個有所了解并學習的)
MYSQL必讀 mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ...
MYSQL必讀<!--[if !supportLists]-->1) mysqlbinlog 選項示例
MYSQL必讀常見的選項有以下幾個:
MYSQL必讀--start-datetime
MYSQL必讀從二進制日志中讀取指定等于時間戳或者晚于本地計算機的時間.取值如:="1470733768" 或者="2016-08-09 5:09:28"
MYSQL必讀示例:
MYSQL必讀
[root@hcloud ~]# mysqlbinlog --start-datetime="2016-08-09 5:05:27" /var/lib/mysql/mysql-bin.000001
--stop-datetime
MYSQL必讀從二進制日志中讀取指定小于時間戳或者等于本地計算機的時間 取值和上述一樣
MYSQL必讀--start-position
MYSQL必讀從二進制日志中讀取指定position 事件位置作為開始.取值:="2698"
MYSQL必讀示例:
MYSQL必讀
[root@hcloud ~]# mysqlbinlog --start-position="2698" /var/lib/mysql/mysql-bin.000001
--stop-position
MYSQL必讀從二進制日志中讀取指定position 事件位置作為事件截至.取值:="2698"
MYSQL必讀二、環境準備以及備份恢復
MYSQL必讀 1) 安裝好mysql后,檢查開啟binlog
MYSQL必讀mysql> SHOW BINARY LOGS;
MYSQL必讀ERROR 1381 (HY000): You are not using binary logging :上面提示說明沒有服務器開啟binlog
MYSQL必讀 修改/etc/my.cnf
MYSQL必讀 在mysqld選項中添加 一行內容如下:
MYSQL必讀 log-bin=mysql-bin
MYSQL必讀 默認如果不給值的話,log-bin 的會以mysqld-bin 為索引,創建mysqld-bin.00001等
MYSQL必讀 重啟mysqld即可.
MYSQL必讀 2) 檢查下binlog
MYSQL必讀
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)
MYSQL必讀
MYSQL必讀 3) 先創建一些原始數據.
MYSQL必讀
mysql> create database Test_DB;
Query OK, 1 row affected (0.00 sec)
mysql> use Test_DB;
Database changed
mysql> CREATE TABLE OneTb(id INT(10) NOT NULL,name varchar(20),age INT(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into OneTb values (1,'user1',18);
mysql> insert into OneTb values (2,'user2',19);
insert into OneTb values (3,'user3',20);
MYSQL必讀 檢查下數據:
MYSQL必讀
mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)
MYSQL必讀 4) 備份還原 (完整備份以及還原)
MYSQL必讀 這里我們模擬一下做下每天的完整備份數據庫任務.
MYSQL必讀
[root@hcloud ~]# mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-16:50.sql
Enter password:
MYSQL必讀 模擬下操作失誤,將數據修改錯誤了.
MYSQL必讀
mysql> update OneTb set age = 15;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 15 |
| 2 | user2 | 15 |
| 3 | user3 | 15 |
+----+-------+------+
3 rows in set (0.00 sec)
MYSQL必讀 現在我們使用傳統的方式來進行恢復還原.
MYSQL必讀
[root@hcloud ~]# mysql -uroot -p Test_DB < /data/mysqlbackup/Test_DB_0809-16\:50.sql
MYSQL必讀再次查詢一下:
MYSQL必讀
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)
MYSQL必讀 可以看到數據都已經還原回來.
MYSQL必讀 5) 利用binlog模擬還原
MYSQL必讀 在原表的基礎上在創建幾條數據.
MYSQL必讀
mysql> insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)
MYSQL必讀 如果這個時候我們把數據不小心修改了或者把庫刪除掉了,導致數據全部丟失,這個時候如果再用之前最新的備份文件 Test_DB_0809-16:50.sql,去恢復數據的話,那么將會丟掉備份之后新插入的數據.
MYSQL必讀 注意:如果真的使用最近的一次備份文件去做的話,一定是在萬不得已的情況(比如binlog 被刪除,整個硬盤掛掉、、、 想想都可怕...).
MYSQL必讀 模擬誤操作,批量更改下用戶的名字.
MYSQL必讀
mysql> update Test_DB.OneTb set name='user10';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0
MYSQL必讀 不行,上一步不夠狠,這里再狠一點,把表都給刪除
MYSQL必讀
mysql> drop table Test_DB.OneTb;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Query OK, 0 rows affected (0.00 sec)
MYSQL必讀 由于之前我們一開始開啟了binlog 日志選項,用binlog恢復數據庫.下面從binlog入手,先檢查一下binlog 文件,目前我的mysql 服務自開啟binlog 后重啟了兩次,所以有2個binlog文件(每重啟一次,便會重新生成一個binlog文件,還有一種情況就是運行了FLUSH LOGS命令也會重建一個);
MYSQL必讀 mysql-bin.index 文件中記錄的是:自log-bin選項開啟后,記錄的所有的二進制日志清單列表.
MYSQL必讀
MYSQL必讀 注意:在實際生產環境中,如果遇到需要恢復數據庫的情況,不要讓用戶能拜訪到數據庫,以避免新的數據插入進來,以及在主從的環境下,關閉主從.
MYSQL必讀 使用mysqlbinlog 命令可以查看binlog文件.我們看下最新的文件mysql-bin.00002
MYSQL必讀
MYSQL必讀 從最后可以看出有刪除的操作.但是我們不能完全的恢復,因為最后還有刪除的操作.
MYSQL必讀 現在我的思路就是,先將第一個binlog 和第二個binlog 文件導出來à利用指定的position位置的方式(過濾掉刪除表操作和update Test_DB.OneTb set name='user10';這條語句 ),導出2個sql 語句,最后我們將2個sql 合成一個sql,導入到數據庫中即可.
MYSQL必讀 我們先用mysqlbinlog命令找到update 那條語句的位置,然后指定position 將mysql-bin.00001 導出來.
MYSQL必讀
[root@hcloud ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001
….
#160809 5:09:28 server id 1 end_log_pos 2698 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470733768/*!*/;
SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=0/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23)
/*!*/;
# at 2698
#160809 5:19:49 server id 1 end_log_pos 2795 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470734389/*!*/;
update Test_DB.OneTb set name='user10'
/*!*/;
# at 2795
#160809 5:30:38 server id 1 end_log_pos 2814 Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
MYSQL必讀 從上面可以看到我們在做插入正常數據后的position 是2698,那么使用下面的命令導出sql
MYSQL必讀
[root@hcloud ~]# mysqlbinlog --stop-position="2698" /var/lib/mysql/mysql-bin.000001 > Backup_1.sql
MYSQL必讀 然后導出mysql-bin.00002的sql 語句(注:由于演示操作,該文件只有一個drop 表操作,所以不做處理,但是在實際環境中,由于中途可能會有重啟數據庫操作,那時就需要檢測最新的binlog有沒有業務需要的語句.)
MYSQL必讀 sql 語句已經導出來了.我們可以利用該語句直接恢復所有正常的數據.
MYSQL必讀 注:本次恢復沒有利用到之前的完整備份,因為我是開啟binlog后,然后才做的所有建庫建表操作,第一個binlog文件里已經記錄了所有的數據庫操作,所以不需要使用之前的完整備份(另外:實際的生產環境,還是需要利用到完整備份的,因為線上環境可能會有N多個binlog文件,所以需要利用到完整備份和最新的binlog文件來結合恢復)
MYSQL必讀 開始恢復前,我們將原有的Test_DB數據庫也給干掉吧.畢竟我們的binlog中有創建操作
MYSQL必讀
mysql> DROP DATABASE Test_DB;
Query OK, 0 rows affected (0.03 sec)
MYSQL必讀 恢復數據庫時還可以利用在登陸mysql 后,用source 命令導入sql語句,這里暫不介紹
MYSQL必讀
[root@hcloud ~]# mysql -uroot -p < Backup_1.sql
MYSQL必讀Enter password:
MYSQL必讀 恢復完成后,我們檢查下表的數據是否完整
MYSQL必讀
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Test_DB |
| mysql |
+--------------------+
3 rows in set (0.00 sec)
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)
MYSQL必讀 Ok完整的都恢復過來了.
MYSQL必讀三、總結
MYSQL必讀 1) 恢復方式
MYSQL必讀 a) 利用最新一次的完整備份加binlog 指定事件起始時間和終止時間或者position恢復數據庫
MYSQL必讀 b) 利用所有binlog指定事件起始位置和終止時間來合并sql文件恢復數據庫(此辦法要確保binlog文件的完整)
MYSQL必讀 c) 利用mysqldump 使用完整恢復.(在確保最新一次的完整備份后的數據不重要,允許丟掉的情況下,直接恢復.該辦法最簡單、效率最高)
MYSQL必讀 2) 附:官方建議的備份原則(為了能睡個好覺….嗯,是的)
MYSQL必讀 a) 在mysql安裝好并運行時,就始終開啟 log-bin選項,該日志文件位于datadir目錄下,也要確保該目錄所在存儲介質是平安的.
MYSQL必讀 b) 定期做完整的mysql 備份.
MYSQL必讀 c) 定期使用 FlUSH LOGS 或者 mysqladmin flush-logs ,該操作會關閉當前的二進制日志文件,并新建一個binlog日志文件.(和重啟mysql后新建的binlog操作一樣).以備份binlog日志,利用binlog日志也可以做增量備份.
MYSQL必讀以上所述是小編給大家介紹的Linux上通過binlog文件恢復mysql數據庫詳細步驟,希望對大家有所贊助,如果大家有任何疑問請給我留言,小編會及時回復大家的.在此也非常感謝大家對維易PHP網站的支持!
《Mysql入門Linux上通過binlog文件恢復mysql數據庫詳細步驟》是否對您有啟發,歡迎查看更多與《Mysql入門Linux上通過binlog文件恢復mysql數據庫詳細步驟》相關教程,學精學透。維易PHP學院為您提供精彩教程。