Linux上通過binlog檔案恢複mysql資料庫詳細步驟_Mysql

來源:互聯網
上載者:User

 一、binlog 介紹

  伺服器的二進位日誌記錄著該資料庫的所有增刪改的動作記錄(前提是要在自己的伺服器上開啟binlog),還包括了這些操作的執行時間。為了顯示這些二進位內容,我們可以使用mysqlbinlog命令來查看。

  用途1:主從同步

  用途2:恢複資料庫(也是線上出現一次資料庫檔案丟失後,才對這個有所瞭解並學習的)

  mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ...

<!--[if !supportLists]-->1) mysqlbinlog 選項樣本

常見的選項有以下幾個:

--start-datetime

從二進位日誌中讀取指定等於時間戳記或者晚於本機電腦的時間。取值如:="1470733768" 或者="2016-08-09 5:09:28"

樣本:

[root@hcloud ~]# mysqlbinlog --start-datetime="2016-08-09 5:05:27" /var/lib/mysql/mysql-bin.000001 --stop-datetime

從二進位日誌中讀取指定小於時間戳記或者等於本機電腦的時間 取值和上述一樣

--start-position

從二進位日誌中讀取指定position 事件位置作為開始。取值:="2698"

樣本:

[root@hcloud ~]# mysqlbinlog --start-position="2698" /var/lib/mysql/mysql-bin.000001 --stop-position

從二進位日誌中讀取指定position 事件位置作為事件截至。取值:="2698"

二、環境準備以及備份恢複

  1) 安裝好mysql後,檢查開啟binlog

mysql> SHOW BINARY LOGS;

ERROR 1381 (HY000): You are not using binary logging :上面提示說明沒有伺服器開啟binlog

  修改/etc/my.cnf

  在mysqld選項中添加 一行內容如下:

  log-bin=mysql-bin

  預設如果不給值的話,log-bin 的會以mysqld-bin 為索引,建立mysqld-bin.00001等

  重啟mysqld即可。

  2) 檢查下binlog

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

  3) 先建立一些未經處理資料。

mysql> create database Test_DB;Query OK, 1 row affected (0.00 sec)mysql> use Test_DB;Database changedmysql> 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> select * from OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 18 || 2 | user2 | 19 || 3 | user3 | 20 |+----+-------+------+3 rows in set (0.00 sec)

  4) 備份還原 (完整備份以及還原)

  這裡我們類比一下做下每天的完整備份資料庫任務。

[root@hcloud ~]# mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-16:50.sqlEnter password:

  類比下操作失誤,將資料修改錯誤了。

mysql> update OneTb set age = 15;Query OK, 3 rows affected (0.00 sec)Rows matched: 3 Changed: 3 Warnings: 0mysql> select * from OneTb;+----+-------+------+| id | name | age |+----+-------+------+| 1 | user1 | 15 || 2 | user2 | 15 || 3 | user3 | 15 |+----+-------+------+3 rows in set (0.00 sec)

  現在我們使用傳統的方式來進行恢複還原。

[root@hcloud ~]# mysql -uroot -p Test_DB < /data/mysqlbackup/Test_DB_0809-16\:50.sql 

重新查詢一下:

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)

  可以看到資料都已經還原回來。

  5) 利用binlog類比還原

  在原表的基礎上在建立幾條資料。

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: 0mysql> 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)

  如果這個時候我們把資料不小心修改了或者把庫刪除掉了,導致資料全部丟失,這個時候如果再用之前最新的備份檔案 Test_DB_0809-16:50.sql,去恢複資料的話,那麼將會丟掉備份之後新插入的資料。

  注意:如果真的使用最近的一次備份檔案去做的話,一定是在萬不得已的情況(比如binlog 被刪除,整個硬碟掛掉、、、 想想都可怕。。。)。

  類比誤操作,批量更改下使用者的名字。

mysql> update Test_DB.OneTb set name='user10';Query OK, 6 rows affected (0.00 sec)Rows matched: 6 Changed: 6 Warnings: 0

  不行,上一步不夠狠,這裡再狠一點,把表都給刪除

mysql> drop table Test_DB.OneTb;ERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 3Current database: *** NONE ***Query OK, 0 rows affected (0.00 sec)

  由於之前我們一開始開啟了binlog 日誌選項,用binlog恢複資料庫。下面從binlog入手,先檢查一下binlog 檔案,目前我的mysql 服務自開啟binlog 後重啟了兩次,所以有2個binlog檔案(每重啟一次,便會重建一個binlog檔案,還有一種情況就是運行了FLUSH LOGS命令也會重建一個);

  mysql-bin.index 檔案中記錄的是:自log-bin選項開啟後,記錄的所有的二進位日誌清單列表。

  注意:在實際生產環境中,如果遇到需要恢複資料庫的情況,不要讓使用者能訪問到資料庫,以避免新的資料插入進來,以及在主從的環境下,關閉主從。

  使用mysqlbinlog 命令可以查看binlog檔案.我們看下最新的檔案mysql-bin.00002

  從最後可以看出有刪除的操作。但是我們不能完全的恢複,因為最後還有刪除的操作。

  現在我的思路就是,先將第一個binlog 和第二個binlog 檔案匯出來à利用指定的position位置的方式(過濾掉刪除表操作和update Test_DB.OneTb set name='user10';這條語句 ),匯出2個sql 語句,最後我們將2個sql 合成一個sql,匯入到資料庫中即可。

  我們先用mysqlbinlog命令找到update 那條語句的位置,然後指定position 將mysql-bin.00001 匯出來。

[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=0SET 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=0SET TIMESTAMP=1470734389/*!*/;update Test_DB.OneTb set name='user10'/*!*/;# at 2795#160809 5:30:38 server id 1 end_log_pos 2814 StopDELIMITER ;# End of log fileROLLBACK /* added by mysqlbinlog */;/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

  從上面可以看到我們在做插入正常資料後的position 是2698,那麼使用下面的命令匯出sql

[root@hcloud ~]# mysqlbinlog --stop-position="2698" /var/lib/mysql/mysql-bin.000001 > Backup_1.sql 

  然後匯出mysql-bin.00002的sql 語句(註:由於示範操作,該檔案只有一個drop 表操作,所以不做處理,但是在實際環境中,由於中途可能會有重啟資料庫操作,那時就需要檢測最新的binlog有沒有業務需要的語句。)

  sql 語句已經匯出來了。我們可以利用該語句直接恢複所有正常的資料。

  註:本次恢複沒有利用到之前的完整備份,因為我是開啟binlog後,然後才做的所有建庫建表操作,第一個binlog檔案裡已經記錄了所有的資料庫操作,所以不需要使用之前的完整備份(另外:實際的生產環境,還是需要利用到完整備份的,因為線上環境可能會有N多個binlog檔案,所以需要利用到完整備份和最新的binlog檔案來結合恢複)

  開始恢複前,我們將原有的Test_DB資料庫也給幹掉吧。畢竟我們的binlog中有建立操作

mysql> DROP DATABASE Test_DB;Query OK, 0 rows affected (0.03 sec)

  恢複資料庫時還可以利用在登陸mysql 後,用source 命令匯入sql語句,這裡暫不介紹

[root@hcloud ~]# mysql -uroot -p < Backup_1.sql 

Enter password:

  恢複完成後,我們檢查下表的資料是否完整

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)

  Ok完整的都恢複過來了。

三、總結

  1) 恢複方式

    a) 利用最新一次的完整備份加binlog 指定事件起始時間和終止時間或者position恢複資料庫

    b) 利用所有binlog指定事件起始位置和終止時間來合并sql檔案恢複資料庫(此方法要確保binlog檔案的完整)

    c) 利用mysqldump 使用完整恢複。(在確保最新一次的完整備份後的資料不重要,允許丟掉的情況下,直接恢複。該方法最簡單、效率最高)

  2) 附:官方建議的備份原則(為了能睡個好覺….嗯,是的)

    a) 在mysql安裝好並運行時,就始終開啟 log-bin選項,該記錄檔位於datadir目錄下,也要確保該目錄所在儲存介質是安全的。

    b) 定期做完整的mysql 備份。

    c) 定期使用 FlUSH LOGS 或者 mysqladmin flush-logs ,該操作會關閉當前的二進位記錄檔,並建立一個binlog記錄檔。(和重啟mysql後建立的binlog操作一樣)。以備份binlog日誌,利用binlog日誌也可以做增量備份。

以上所述是小編給大家介紹的Linux上通過binlog檔案恢複mysql資料庫詳細步驟,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.