MySQL-備份與還原


 

前言

對於我們運維來說,在mysql數據庫領域,別的不說,最起碼要會兩大技能!

第一大技能:備份與還原

第二大技能:主從異步

關於這兩大技能我們先來說說第一個

備份與還原

備份:我們按時定點來備份數據,當下數據最值錢,所以我們要確保數據的安全。

平常我們都是7天一大備,三天兩頭一小備,也就是說,一周來一個完全備份,1、2、天來一個增量或差異備份。

確保那天服務器宕機或誤操作,能恢復過來。

還原:當服務器負重過量會導致宕機,或有時候我們誤操作,刪除了某張重要的數據表等等,這時候就要用到我們之前備份的數據來恢復。

簡單說下備份的類型,

冷備:讀寫操作均不可進行

溫備:讀操作可執行;但寫操作不可執行

熱備:讀寫操作均可執行

MyISAM:溫備,不支持熱備
InnoDB: 都支持

簡單說下常用的備份工具,

LVM的快照:先加鎖,做快照后解鎖,幾乎熱備;借助文件系統工具進行備份

mysqldump:邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份

xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份

備注:以上除了xtrabackup,都是基於完整備份包以及二進制日志來恢復數據庫的,二進制日志記錄了增刪改語句的操作指令,拿過來重放,

建議:建議二進制日志和數據文件分開存放 --

1、關閉網絡鏈接,只監聽本地端口訪問,(在備份還原的時候用)

skip-networking=1

2、禁止主機名解析,ip地址訪問的時候,禁止反向解析(建議加上)

skip_name_resolve = on

3、每個表單獨使用一個表空間存儲表的數據和索引(建議加上)

innodb_file_per_table = on

4、開啟並指定二進制文件存放位置

log_bin=/...

。。。

准備

1、准備兩台主機,我用.17充當mysql主服務器,.57來還原用。

2、17主mysql數據庫有以下幾個表

image

3、目錄

/data/mysq/:下存放數據庫數據

/app/logs/:下存放二進制日志

。。。

實戰

備份階段

1、完全備份

mysqldump -pcentos -A -F --master-data=2 --single-transaction |gzip > /data/all-`date +%F`.sql.gz

備注:

-A:備份全部數據庫

-F:切換二進制日志

--master-data=2:記錄了基於二進制那個位置備份的,這個點之后是新數據,備份結束點,主從改為1

--single-transaction:保證數據的一致性

2、解壓並查看

gzip -d all-2018-08-03.sql.gz
less all-2018-08-03.sql

image

備注:記住這個文件以及數字,一會還原的時候要用

3、修改students表(新數據和日志)

1)沒修改前

image

2)加記錄

insert students (name,age)values('gaoda1hao',20);

image

3)查看現在的二進制變化

image

4)假設現在這台mysql服務器宕機崩潰了,下面開始還原

。。。

還原階段

上面規划的是用57這台主機來還原,首先這台主機必須是干凈的mysql數據庫

1、scp傳送

1)傳送完全備份文件到目標主機

scp all-2018-08-03.sql 192.168.43.57:

2)傳送上面圖中00005文件以及之后的二進制文件到目標主機

scp mysql-bin.000005 192.168.43.57:

2、57主機來還原

注意:還原的時候要禁止除了你之外的所有用戶的訪問。

停止mysql服務,在my.cnf配置文件中可以加上上面說到一項

1)開啟服務前提下並完全備份數據包

mysql < all-2018-08-03.sql

備注:現在只還原到了,備份時的狀態,下面再次還原備份后到宕機這段時候發生的操作

2)導入二進制日志

mysqlbinlog  --start-position=385 /root/mysql-bin.000005 > /app/binlog.sql

備注:把00005中從385開始的指令語句導入到一個文件中

mysql < /app/binlog.sql

備注:導入二進制記錄的指令

。。。

驗證

1、看表存在不

image

2、看表數據正不正確

image

OK 還原成功

 

下面再來演示一個案例-誤刪除表的恢復

比如我們在某天的12點中做了完全備份,在下一次做完全備份中間有一天執行了刪除某張表,刪除后等了幾個小時才發現表刪除了,

在這種場景下,來恢復數據,下面來模擬下。

模擬順序:完全備份--用戶對表的數據修改--刪除某張表--未發現用戶繼續對其他表操作--當訪問被刪除的表時發現--

准備工作和上面一樣,下面進入正題

前幾步和前面一樣

1、完全備份

mysqldump -pcentos -A -F --master-data=2 --single-transaction |gzip > /data/all-`date +%F`.sql.gz

2、模擬誤刪除表前的修改

insert students (name,age)values('gaoda1hao',20);

。。。

備注:這期間加了好多數據,可能二進制文件已經滿了,進行了切換

3、模擬二進制文件的切換

flush logs;
#

接着增加幾條記錄

insert students (name,age)values('gaoda2hao',22);

4、模擬誤刪除數據表

drop table students;

備注:刪除后還么有發現,接着增加其他表的數據

insert teachers (name,age)values('gaoda3',30);

5、發現問題並及時禁止用戶寫權限(只能讀)

flush tables with read lock;

備注:現在只能root用戶可以讀寫其他用戶是不能修改數據的

image

。。。

6、干凈系統還原

1)停止服務

systemctl stop mairadb


2)刪除所有mysql數據庫數據

rm -rf /var/lib/mysql/

3)確保用戶不能訪問服務器 配置文件加上

skip-networking

4)啟動服務

 

7、還原完全備份

1)解壓完全備份包

gzip -d all-2018-08-03.sql.gz

2)查看解壓的文件確定位置

less all-2018-08-03.sql

image

3)把完整備份傳送到57目標主機還原

mysql <all-2018-08-03.sql

8、還原增量備份

1)合並00004以及之后的二進制日志文件

mysqlbinlog  --start-position=385 mysql-bin.000004 > /data/binlogs.sql
mysqlbinlog   mysql-bin.000005 >> /data/binlogs.sql
mysqlbinlog   mysql-bin.000006 >> /data/binlogs.sql

2)從合並的二進制日志文件中找到誤操作的指令刪除或注釋

image

3)scp傳送到57目標主機還原

mysql <binlogs.sql

。。。

驗證

1、刪除的表看看有了沒

image

2、在表刪除后其他的表改的記錄還在不

image

OK

還原成功

歡迎補充--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM