最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫詳細(xì)步驟

 更新時(shí)間:2016年08月10日 16:51:17   作者:飛走不可  
binglog文件是服務(wù)器的二進(jìn)制日志記錄著該數(shù)據(jù)庫的所有增刪改的操作日志,接下來通過本文給大家介紹linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫詳細(xì)步驟,非常不錯(cuò),需要的朋友參考下

 一、binlog 介紹

  服務(wù)器的二進(jìn)制日志記錄著該數(shù)據(jù)庫的所有增刪改的操作日志(前提是要在自己的服務(wù)器上開啟binlog),還包括了這些操作的執(zhí)行時(shí)間。為了顯示這些二進(jìn)制內(nèi)容,我們可以使用mysqlbinlog命令來查看。

  用途1:主從同步

  用途2:恢復(fù)數(shù)據(jù)庫(也是線上出現(xiàn)一次數(shù)據(jù)庫文件丟失后,才對這個(gè)有所了解并學(xué)習(xí)的)

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

<!--[if !supportLists]-->1) mysqlbinlog 選項(xiàng)示例

常見的選項(xiàng)有以下幾個(gè):

--start-datetime

從二進(jìn)制日志中讀取指定等于時(shí)間戳或者晚于本地計(jì)算機(jī)的時(shí)間。取值如:="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

從二進(jìn)制日志中讀取指定小于時(shí)間戳或者等于本地計(jì)算機(jī)的時(shí)間 取值和上述一樣

--start-position

從二進(jìn)制日志中讀取指定position 事件位置作為開始。取值:="2698"

示例:

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

從二進(jìn)制日志中讀取指定position 事件位置作為事件截至。取值:="2698"

二、環(huán)境準(zhǔn)備以及備份恢復(fù)

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

mysql> SHOW BINARY LOGS;

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

  修改/etc/my.cnf

  在mysqld選項(xiàng)中添加 一行內(nèi)容如下:

  log-bin=mysql-bin

  默認(rèn)如果不給值的話,log-bin 的會以mysqld-bin 為索引,創(chuàng)建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) 先創(chuàng)建一些原始數(shù)據(jù)。

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);

  檢查下數(shù)據(jù):

mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)

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

  這里我們模擬一下做下每天的完整備份數(shù)據(jù)庫任務(wù)。

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

  模擬下操作失誤,將數(shù)據(jù)修改錯(cuò)誤了。

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)

  現(xiàn)在我們使用傳統(tǒng)的方式來進(jìn)行恢復(fù)還原。

[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)

  可以看到數(shù)據(jù)都已經(jīng)還原回來。

  5) 利用binlog模擬還原

  在原表的基礎(chǔ)上在創(chuàng)建幾條數(shù)據(jù)。

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)

  如果這個(gè)時(shí)候我們把數(shù)據(jù)不小心修改了或者把庫刪除掉了,導(dǎo)致數(shù)據(jù)全部丟失,這個(gè)時(shí)候如果再用之前最新的備份文件 Test_DB_0809-16:50.sql,去恢復(fù)數(shù)據(jù)的話,那么將會丟掉備份之后新插入的數(shù)據(jù)。

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

  模擬誤操作,批量更改下用戶的名字。

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

  不行,上一步不夠狠,這里再狠一點(diǎn),把表都給刪除

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)

  由于之前我們一開始開啟了binlog 日志選項(xiàng),用binlog恢復(fù)數(shù)據(jù)庫。下面從binlog入手,先檢查一下binlog 文件,目前我的mysql 服務(wù)自開啟binlog 后重啟了兩次,所以有2個(gè)binlog文件(每重啟一次,便會重新生成一個(gè)binlog文件,還有一種情況就是運(yùn)行了FLUSH LOGS命令也會重建一個(gè));

  mysql-bin.index 文件中記錄的是:自log-bin選項(xiàng)開啟后,記錄的所有的二進(jìn)制日志清單列表。

  注意:在實(shí)際生產(chǎn)環(huán)境中,如果遇到需要恢復(fù)數(shù)據(jù)庫的情況,不要讓用戶能訪問到數(shù)據(jù)庫,以避免新的數(shù)據(jù)插入進(jìn)來,以及在主從的環(huán)境下,關(guān)閉主從。

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

  從最后可以看出有刪除的操作。但是我們不能完全的恢復(fù),因?yàn)樽詈筮€有刪除的操作。

  現(xiàn)在我的思路就是,先將第一個(gè)binlog 和第二個(gè)binlog 文件導(dǎo)出來à利用指定的position位置的方式(過濾掉刪除表操作和update Test_DB.OneTb set name='user10';這條語句 ),導(dǎo)出2個(gè)sql 語句,最后我們將2個(gè)sql 合成一個(gè)sql,導(dǎo)入到數(shù)據(jù)庫中即可。

  我們先用mysqlbinlog命令找到update 那條語句的位置,然后指定position 將mysql-bin.00001 導(dǎo)出來。

[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*/;

  從上面可以看到我們在做插入正常數(shù)據(jù)后的position 是2698,那么使用下面的命令導(dǎo)出sql

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

  然后導(dǎo)出mysql-bin.00002的sql 語句(注:由于演示操作,該文件只有一個(gè)drop 表操作,所以不做處理,但是在實(shí)際環(huán)境中,由于中途可能會有重啟數(shù)據(jù)庫操作,那時(shí)就需要檢測最新的binlog有沒有業(yè)務(wù)需要的語句。)

  sql 語句已經(jīng)導(dǎo)出來了。我們可以利用該語句直接恢復(fù)所有正常的數(shù)據(jù)。

  注:本次恢復(fù)沒有利用到之前的完整備份,因?yàn)槲沂情_啟binlog后,然后才做的所有建庫建表操作,第一個(gè)binlog文件里已經(jīng)記錄了所有的數(shù)據(jù)庫操作,所以不需要使用之前的完整備份(另外:實(shí)際的生產(chǎn)環(huán)境,還是需要利用到完整備份的,因?yàn)榫€上環(huán)境可能會有N多個(gè)binlog文件,所以需要利用到完整備份和最新的binlog文件來結(jié)合恢復(fù))

  開始恢復(fù)前,我們將原有的Test_DB數(shù)據(jù)庫也給干掉吧。畢竟我們的binlog中有創(chuàng)建操作

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

  恢復(fù)數(shù)據(jù)庫時(shí)還可以利用在登陸mysql 后,用source 命令導(dǎo)入sql語句,這里暫不介紹

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

Enter password:

  恢復(fù)完成后,我們檢查下表的數(shù)據(jù)是否完整

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完整的都恢復(fù)過來了。

三、總結(jié)

  1) 恢復(fù)方式

    a) 利用最新一次的完整備份加binlog 指定事件起始時(shí)間和終止時(shí)間或者position恢復(fù)數(shù)據(jù)庫

    b) 利用所有binlog指定事件起始位置和終止時(shí)間來合并sql文件恢復(fù)數(shù)據(jù)庫(此方法要確保binlog文件的完整)

    c) 利用mysqldump 使用完整恢復(fù)。(在確保最新一次的完整備份后的數(shù)據(jù)不重要,允許丟掉的情況下,直接恢復(fù)。該方法最簡單、效率最高)

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

    a) 在mysql安裝好并運(yùn)行時(shí),就始終開啟 log-bin選項(xiàng),該日志文件位于datadir目錄下,也要確保該目錄所在存儲介質(zhì)是安全的。

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

    c) 定期使用 FlUSH LOGS 或者 mysqladmin flush-logs ,該操作會關(guān)閉當(dāng)前的二進(jìn)制日志文件,并新建一個(gè)binlog日志文件。(和重啟mysql后新建的binlog操作一樣)。以備份binlog日志,利用binlog日志也可以做增量備份。

以上所述是小編給大家介紹的Linux上通過binlog文件恢復(fù)mysql數(shù)據(jù)庫詳細(xì)步驟,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • mysql optimizer_switch查詢優(yōu)化器優(yōu)化策略

    mysql optimizer_switch查詢優(yōu)化器優(yōu)化策略

    查詢優(yōu)化器是一個(gè)至關(guān)重要的組件,它負(fù)責(zé)確定執(zhí)行 SQL 查詢的最有效方法,本文主要介紹了mysql optimizer_switch查詢優(yōu)化器優(yōu)化策略,感興趣的可以了解一下
    2024-06-06
  • MySQL索引優(yōu)化的實(shí)際案例分析

    MySQL索引優(yōu)化的實(shí)際案例分析

    這篇文章主要介紹了MySQL索引優(yōu)化的一些實(shí)際案例,主要是用到Order by desc/asc limit M的方法,需要的朋友可以參考下
    2015-05-05
  • centos7中如何利用crontab進(jìn)行mysql定時(shí)備份

    centos7中如何利用crontab進(jìn)行mysql定時(shí)備份

    crontab是一個(gè)命令,常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令,下面這篇文章主要給大家介紹了關(guān)于centos7中如何利用crontab進(jìn)行mysql定時(shí)備份的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 與MSSQL對比學(xué)習(xí)MYSQL的心得(三)--查看字段的長度

    與MSSQL對比學(xué)習(xí)MYSQL的心得(三)--查看字段的長度

    今天我們來對比下MYSQL和MSSQL關(guān)于查看字段長度之間的區(qū)別
    2014-06-06
  • mysql創(chuàng)建Bitmap_Join_Indexes中的約束與索引

    mysql創(chuàng)建Bitmap_Join_Indexes中的約束與索引

    現(xiàn)象:創(chuàng)建Bitmap Join Indexes時(shí)出現(xiàn)ORA-25954報(bào)錯(cuò): 維的主鍵或唯一約束條件缺失。 53vi.Com 原因:受到約束與索引的影響。
    2008-04-04
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • mysql仿asp的數(shù)據(jù)庫操作類

    mysql仿asp的數(shù)據(jù)庫操作類

    使用說明: 該類完全按照ADO的習(xí)慣書寫的,用過ASP的人都覺得ASP連接數(shù)據(jù)庫比PHP好用(這是我的感覺), 但PHP得一個(gè)一個(gè)API地寫,挺累,該類做了完全的封裝 創(chuàng)建類的實(shí)例時(shí)可以指定一個(gè)數(shù)據(jù)庫表和選擇的數(shù)據(jù)庫,如:new MySQLDB("table","database");
    2008-04-04
  • MYSQL基礎(chǔ)之連接MYSQL、修改密碼、添加用戶

    MYSQL基礎(chǔ)之連接MYSQL、修改密碼、添加用戶

    在這篇文章中我們就從連接MYSQL、修改密碼、增加用戶等方面來學(xué)習(xí)一些MYSQL的常用命令。
    2008-08-08
  • MySQL 排序規(guī)則簡介

    MySQL 排序規(guī)則簡介

    排序規(guī)則是指對指定字符集下不同字符的比較規(guī)則,有明顯的體征體現(xiàn),如兩個(gè)不同的字符集不能有相同的排序規(guī)則兩個(gè)字符集有一個(gè)默認(rèn)的排序規(guī)則有一些常用的命名規(guī)則,接下來通過本文詳細(xì)介紹MySQL 排序規(guī)則,需要的朋友可以參考下
    2023-09-09
  • MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實(shí)例教程

    MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實(shí)例教程

    這篇文章主要介紹了MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實(shí)例教程,表連接操作是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-12-12

最新評論

广德县| 库伦旗| 旺苍县| 西乌珠穆沁旗| 甘孜| 当阳市| 农安县| 德保县| 沙洋县| 西宁市| 青海省| 新民市| 隆德县| 饶阳县| 黄大仙区| 永登县| 定边县| 汕尾市| 南京市| 东乡族自治县| 赣榆县| 如东县| 明溪县| 江永县| 正定县| 凤冈县| 济宁市| 衡水市| 惠安县| 扬州市| 邓州市| 天水市| 确山县| 五指山市| 承德县| 华安县| 托克托县| 邵东县| 松阳县| 开江县| 岳阳县|