數據庫備份和恢復

1.運維人員在備份恢復方面的職責

1.1 設計備份策略

1)備份內容 :數據,二進制日志
2)數據容量:大小
3)備份周期:

1.每天全備
2.周期全備+增量備份
3.周期全備+日志備份

4)備份時間:晚上,
5)備份目標位置:

1.2日常備份檢查

日志檢查、備份的內容、備份大小

1.3定期恢復演練

每半年做一次

1.4故障時的恢復

快速準確恢復數據

1.5平臺數據遷移

同構平臺
異構平臺

2.備份工具介紹

2.1介紹

mysqldump (MDP) 邏輯備份工具
Percona Xtrabackup (xbk, pbk, pxb)物理備份

2.2區(qū)別

MDP:邏輯備份,SQL文件,文本形式,可讀性高,便于處理,壓縮比高、備份相對較慢,適用于100G以內的備份。
100G數據,備份30-40分鐘
xbk: 物理備份,數據文件、可讀性低,壓縮比低、備份相對較快,適用于100G以內的備份。
100G 10分鐘

3.mysqldump

3.1 備份邏輯

將磁盤數據,加載到臨時表,轉換為SQL語句(建庫、建表、插入語句)

3.2 核心參數

1)連接參數

本地:-u - p -S
遠程:-u -p -H -P

2)備份參數
1.全備參數

-A全備
-B 指定多個庫名
[root@db01 ~]# mysqldump -uroot -p123 -A >/data/backup/full.sql

2.單表或多庫備份

[root@db01 ~]# mysqldump -uroot -p123 -B bgx oldboy test world mysql > /data/backup/db.sql

3.單標或多表備份

[root@db01 ~]# mysqldump -uroot -p123 world city country >/data/backup/tab.sql

4.只導出建表語句

[root@db01 ~]# mysqldump -uroot -p123 world city country --no-data >/data/backup/tab1.sql


5.--master-data=2

(1) 自動記錄備份時的binlog filename 及pos
(2) 自動加鎖和解鎖
(3) 加了--single-transaction , 會有不一樣的效果( global read lock is only taken a short time )
mysqldump -uroot -p123 -A --master-data=2 >/data/backup/full.sql

6. --single-transaction

開啟獨立事務,備份InnoDB表的一致性快照.實現InnoDB表的熱備功能.
補充:
對于非InnoDB表(FTWRL Flush tables with read lock 全局鎖表) ,對于mysq1庫下的系統(tǒng)表備份的時候,會加global read lock
Flush tables with read lock 全局鎖表
unlock tables關閉鎖表

7. 特殊的數據庫對象

-R 存儲過程和函數
--triggers 觸發(fā)器
-E 事件
mysqldump -uroot -p -A --master-data=2 --single-transaction -R --triggers -E >/data/backup/full.sql

8. --max_allowed_packet=128M

1153 - Got a packet bigger than 'max_allowed_packet' bytes
出現場景: 在數據庫有超大比表時,需要加此的參數.

9. 終極備份語句

mysqldump -uroot -p -A --master-data=2 --single-transaction -R --triggers -E --max_allowed_packet=128M |gzip >/data/backup/full_date +%F.sql.gz

3.3 模擬故障和恢復(mysqldump 全備+ binlog)

(1) 模擬原始數據

create database mdp charset utf8mb4;
use mdp
create table t1 (id int);
create table t2 (id int);
create table t3 (id int);
insert into t1 values(1);
commit;
insert into t2 values(1);
commit;
insert into t3 values(1);
commit;

(2) 模擬全備

mysqldump -uroot -p -A --master-data=2 --single-transaction -R --triggers -E --max_allowed_packet=128M |gzip >/data/backup/full_date +%F.sql.gz

(3) 模擬新的數據

use mdp
insert into t1 values(2);
commit;
insert into t2 values(2);
commit;
insert into t3 values(2);
commit;

(4) 搞破壞

drop database mdp;

(5) 恢復思路

-- 1. 掛維護頁
-- 2. 找測試庫
-- 3. 準備備份
full
截取binlog部分
-- 4. 恢復全備+binlog到測試庫 , 業(yè)務測試.
-- 5. 導出故障庫數據,恢復到生產 .
-- 6. 撤維護頁.

恢復過程:

1. 準備備份

vim /data/backup/full_2019-12-26.sql
第30行:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2570;

2. 截取二進制日志

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2570;
起點 : 2570

mysql> show binlog events in 'mysql-bin.000003';
| mysql-bin.000003 | 3388 | Query | 6 | 3477 | drop database mdp
終點 : 3388

mysqlbinlog --skip-gtids --start-position=2570 --stop-position=3388 /data/mysql/binlog_3306/mysql-bin.000003 >/data/backup/bin.sql

3. 恢復備份

set sql_log_bin=0;
source /data/backup/full_2019-12-26.sql
source /data/backup/bin.sql
set sql_log_bin=1;

4. 檢查數據

mysql> show tables;
mysql> select * from t1;
mysql> select * from t2;
mysql> select * from t3;

5. 擴展: 從全備中提取 單庫 單表的數據進行恢復

1、獲得表結構

sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE city/!d;q' full.sql>createtable.sql

2、獲得INSERT INTO 語句,用于數據的恢復

grep -i 'INSERT INTO city' full.sqll >data.sql &

3.獲取單庫的備份

sed -n '/^-- Current Database: world/,/^-- Current Database: `/p' all.sql >world.sql

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容