###### tags: `1111` `lsa`
[TOC]
# 備份
## 備份是啥?
:::info
**所以怎麼樣才可以稱得上是好備份?**
1. 可以保留這份檔案先前的版本
2. 至少要有一份異地備份
3. 使用多種備份解決方案
4. 可以進行測試還原,確保能正確還原
5. 還原的時候可以有選擇的還原(為了還原一個檔案,不需要去還原整份備份檔)
6. 備份檔要可以打開並查閱
7. 在備份前要想到所有有可能發生的事故,並且都能有有效處理方案
:::
>備份的重點是要能夠回朔
>[name=BlueT]
:::danger
**所有不知道如何還原所有內容的方法都不能稱得上是好備份!**
:::
- 基本的備份策略:
- 3-2-1 備份:
- 3 份資料(備份三份)
- 2 種不同類型的儲存媒體
- 1 分資料離地保存(存在不同的地方)

## 備份的類型
### Full Backup(完整備份)
- 將全部檔案進行一次性的備份。
- 例如:
- 將某個磁碟分割區內的所有檔案進行備份
- 將硬碟內所有磁區內的檔案進行一次性的快照並備份。
### Incremental(增量備份 / 漸進式備份)

- 繼上次任何備份後所更新的檔案,進行備份
- 備份時間短
- 回存資料很複雜,要回存每一次備份時的資料
- 但要恢復最早之前的資料時,要將每一次增量備份的資料都還原
### Differential( 差異備份 )

- 僅保存從上次完整備份之後更改的檔案數據
- 還原整個系統?
- 先從最近的完整備份
- 加上最近的差異備份
- 優點
- 節省每次進行完整備份需要消耗的大量儲存空間
- 缺點
- 資料或檔案發生毀損時,要復原最後一份差異備份時,要依序將每一份定期的備份逐一檢查
| | 全部備份 | 增量備份 |差異備份|
| -------- | -------- | -------- |-|
| 備份時間 | 長 | 短 | 中 |
|復原檔案|最近一次全部備份|上一次全部備份+之後每一次的增量備份|上一次全部備份+最近一次差異備份|
:::info
### Near-CDP
- Continuous Data Protection ( CDP )
- 可以保存對資料所做的更改的副本( copy ),以此便能將數據恢復到任意時間點
- 將每次做的寫入都存進 log 中
- 多數產品能備份到兩個位置
- 本地: 能隨時且快速地回復資料
- DR site: 以便發生災害時( 本地的資料毀損 )時,從遠方恢復資料
- Near-CDP
- 和 CDP 類似
- 以定期時間進行增量備份
- 無法恢復任何時間點
- 比 CDP 更加實用,不受運行方式限制
<br>
| | CDP | Near CDP |
| -------- | -------- | -------- |
| 價格 | 高 | 低 |
|需要時間|少(數秒)|多(數分)|
|一般應用|線上交易、拍賣網站|資料庫、電子郵件伺服器|
|備份頻率|每次寫入|一段時間一次(一般是半小時或15分鐘)|
|特點|需要用虛擬機或是其他等效的軟體運行,適合企業|有熱備份能力,但只需要冷備份價格、節省磁碟空間|
[來源](https://en.wikipedia.org/wiki/Continuous_Data_Protection)
#### 冷備份、熱備份
- 冷備份:系統處於停機或維護狀態下的備份。這種情況下,備份的資料與系統中此時段的資料完全一致。
- 熱備份:系統處於正常運轉狀態下的備份。這種情況下,由於系統中的資料可能隨時在更新,備份的資料相對於系統的真實資料可有一定滯後。
| 種類 | 熱備份 | 冷備份 |
| -------- | -------- | -------- |
|資料恢復|任意時間點|備份時間點 |
|效能|少許降低|少許提高|
- [資料來源](https://iter01.com/300344.html)
:::
:::info
### DRsite
針對災難發生時,所做的一些對策。
災難包含以下事情
- 地震或火災
- 技術故障
- 系統不相容
- 簡單的人為錯誤
- 第三方蓄意未經授權存取
#### MTD,RTO,RPO
- 最大可容忍的停機時間(Maximum tolerable downtime, MTD)
災難發生後,系統最晚要在此時間復原,在此時間後還沒復原,公司可能遭受巨大損失
- 恢復時間目標(Recovery Time Objective, RTO)
是災難發生後必須是回復系統的最早時間
通常 RTO 值小於 MTD 值,因為 MTD 值表示無法恢復將對公司聲譽或底線造成嚴重甚至可能無法彌補的損失的時間。
- 恢復點目標(Recovery Point Objective,RPO)
是按時間衡量的可接受的資料遺失。
此值表示必須恢復資料的最早時間點。
RPO是指可以從同一事件中丟失的,按時間衡量的可接受的資料量。
:::
## 常用備份指令
### mysqldump
:::info
MariaDB 與 MySQL 的愛恨情仇
當初 MySQL 開始出現時,因為它是打著非商業使用免費的,所以很多人在一開始開發時就選擇 MySQL 當資料庫,可是後來 MySQL 被開發 JAVA 的昇陽(SUN)合併,因為 JAVA 本身也是開源,也是免費的,所以對開者來說並沒有什麼問題,接下來是昇陽被甲骨文(Oracle)合併了,所以 MySQL 最後也被併到 ,這個就有很大問題了。
結果 Oracle 還是對外發表,宣稱 MySQL 維持原樣,並會持續維護,所以請大家不用擔心。不過,因為 Oracle 本來就不需要 MySQL,所以不可能全力在 MySQL 之上,這個問題,引起當初 MySQL 開發團隊的不開心,所以最後 MySQL 開發團隊重新集結,重新開發了一套免費(非商業使用時)的資料庫,叫做 MariaDB ,也因為這個原因,所以 MariaDB 對 MySQL 的支援度很高,幾乎可說是無痛轉移。在 Oracle 收購後, MySQL 被發展成一個封閉源碼的項目,只有 Oracle 和少數 Oracle 選出的公司才能參與。
- MySQL 新的企業延伸套件採取封閉源碼
- 資料庫的臭蟲不再公開
- 不再積極更新 MySQL 的公開代碼庫
- 未能快速傳達或修復安全問題,這一點讓 Linux 散佈套件對 Oracle 很不滿
- Oracle 選擇移除功能,而非修正臭蟲
- MySQL 5.5 的新程式碼不再有測試案例
:::
:::info
如果你在安裝的時候(例如 apt 或是 yum install)找不到以 MariaDB 開頭的函式庫或是輔助程式的時候,可以嘗試用 MySQL 為開頭去找,因為很多程式其實是共用的。
:::
- 全備份
```shell=
mysqldump -u root -p --all-databases > all_db_backup.sql
mysqldump -u root -p -B file > file.sql
```
讀檔:
```shell=
mysql -u username -p < all_db_backup.sql
mysql -u username -p database_name < file.sql
```
:::info
| 參數 | 用處 |
| -------- | -------- |
| -h --host | 指定連接的服務器名稱或者 IP (預設 localhost) |
|-A --all-databases|導出所有資料庫。不過預設情況下是不會導出 information_schema 庫。|
|-B --databases|導出指定的某個/或者某幾個數據庫,參數後面所有名字參量都被看作數據庫名。|
|-d --no-data| 只導出表結構,不導出表數據。|
|-t --no-create-info| 只導出數據,而不添加 CREATE TABLE 語句。|
|-f --force|即使遇到 SQL 錯誤,也繼續執行,功能類似 Oracle exp 命令中的 ignore 參數。|
| - -ignore-table| 指定的表對像不做導出,參數值的格式為[db_nametblname],注意每次只能指定一個值,如果有多個表對像都不進行導出操作的話,那就需要指定多個 --ignore-table 參數,並為每個參數指定不同的參數值。|
> information_schema 是紀錄所有其他資料庫的信息。如資料庫名,資料庫的表,表欄的數據類型與訪問權 限等。
:::
- binlogs(Binary Log)
- 以 binary 方式儲存的 log
- 此方法會把所有會變動到資料的指令儲存到 binlog ,其中包含 CREATE , ALTER TABLE , INSERT , UPDATE , DELETE … (不包含 SELECT 和 SHOW 這一類不影響資料的) .
- 首先要還原最近一次的 Full Backup,然後接著依序恢復該時間之後的 binlogs
- 無法常規查看,要用 MariaDB 的 mysqlbinlog 才能查看
- 於 `/etc/mysql/mariadb.conf.d/50-server.cnf` 開啟
- log_bin = 存放位置

> A MariaDB server with the binary log enabled will run slightly more slowly.[name=MariaDB]
| 比較 | 只用全備份 | 全備份 + binlogs |
| -------- | -------- | -------- |
| 版本 | 只能以每次備份做控制 | 任何會改變資料庫的動作都會被記錄,可自由調整 |
| 對資料庫速度影響 |備份的瞬間會有大影響|一直都有小影響|
讀取:
```
PURGE BINARY LOGS TO 'mysql-bin.00002';
```
```
PURGE BINARY LOGS BEFORE '2099-01-01 09:55:22';
```

### rsync
- scp : 可以異地複製貼上
- rsync : 可以異地複製「比較」貼上
| 比較 | scp | rsync |
| -------- | -------- | -------- |
| 複製方法 | 全備份 | 差異備份 |
| 斷線 |重頭開始|繼續比較,不用重頭|
| 預設 port | 22(ssh) | 873 |
|速度|第一次速度一樣,之後較慢|第一次速度一樣,之後較快|
#### 用法
```shell=
rsync -av 來源目錄 目標目錄
```
:::info
常用參數
|Column 2 | Column 3 |
|-------- | -------- |
|-a, --archive| 權限保存模式,相當於 -rlptgoD 參數,很快速的保存幾乎所有的權限設定|
|-r, --recursive | 對子目錄以遞迴模式處理|
|-l, --links| 保留符號連結|
|-p, --perms| 保留檔案權限|
|-t, --times| 保留檔案時間資訊|
|-g, --group| 保留檔案所屬群組資訊|
|-o, --owner| 保留檔案擁有者資訊(root only)|
|-D, --devices| 保留設備檔案資訊(root only)|
|-b, --backup |產生備份,也就是對於目的已經存在有同樣的檔案名時,將老的檔案重新命名為 ~filename。|
|-u, --update |僅僅進行更新,也就是略過所有已經存在於目的端,且文件時間比要備份的檔案為新。|
|-S, --sparse| 對稀疏檔案進行特殊處理以節省目的端的空間|
|-n, --dry-run|不實際執行傳送,只顯示將會有的傳輸動作|
|-W, --whole-file| 複製檔案,不進行增量檢測|
| - -existing |只比對更新目的端已經存在的檔案,而不備份那些新產生的檔案|
|- -ignore-existing |忽略目的端已經存在的檔案(也就是不更新)|
|- -delete| 刪除傳送端已經不存在,而目的端存在的檔案|
:::
> FIXME: -a 包含的參數先接著講,再補充其餘的