前言 對於我們運維來說,在mysql資料庫領域,別的不說,最起碼要會兩大技能! 第一大技能:備份與還原 第二大技能:主從非同步 關於這兩大技能我們先來說說第一個 備份與還原 備份:我們按時定點來備份數據,當下數據最值錢,所以我們要確保數據的安全。 平常我們都是7天一大備,三天兩頭一小備,也就是說,一周 ...
前言
對於我們運維來說,在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資料庫有以下幾個表
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
備註:記住這個文件以及數字,一會還原的時候要用
3、修改students表(新數據和日誌)
1)沒修改前
2)加記錄
insert students (name,age)values('gaoda1hao',20);
3)查看現在的二進位變化
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、看表存在不
2、看表數據正不正確
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用戶可以讀寫其他用戶是不能修改數據的
。。。
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
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)從合併的二進位日誌文件中找到誤操作的指令刪除或註釋
3)scp傳送到57目標主機還原
mysql <binlogs.sql
。。。
驗證
1、刪除的表看看有了沒
2、在表刪除後其他的表改的記錄還在不
OK
還原成功
歡迎補充--