1. 程式人生 > 實用技巧 >6.Mysql備份恢復

6.Mysql備份恢復

  • 基礎備份引數
# -A備份所有資料庫
[root@db01 backup]# mysqldump -uroot -p123 -A >/backup/full.sql

# -B指定資料庫備份
[root@db01 backup]# mysqldump -uroot -p123 -B world oldguo wordpress >/backup/db.sql

# 指定資料庫下的表備份,world資料庫下的city和country表
[root@db01 backup]# mysqldump -uroot -p123 world city country > /backup/tab.sql

# --opt只匯出表結構 不匯出資料
[root@db01 backup]# mysqldump --opt -d 資料庫名 -u root -p 123 > xxx.sql 

# 匯出資料不匯出結構 
[root@db01 backup]# mysqldump -t 資料庫名 -uroot -p > xxx.sql  

# 匯出指定表的結構
[root@db01 backup]# mysqldump -uroot -p123 -B 資料庫名 --table表名 > xxx.sql   

# --ignore-table備份時排除某張表或多張表
[root@db01 backup]# mysqldump  -uroot -p123 資料庫名稱 --ignore-table=
資料庫名.表名1 --ignore-table=資料庫名.表名2 > 自定義名字.sql
  • 常用備份
# 常用不鎖表,壓縮備份
[root@db01 backup]# mysqldump --databases 資料庫名稱 -uroot -p'tst-cloud@088~' --single-transaction --master-data=2 | gzip > /data/mysql_backup/資料庫名稱.sql.gz

# 常用壓縮恢復
[root@db01 backup]# gunzip < backupfile.sql.gz | mysql -uroot -p123 資料庫名
  • 特殊備份引數
-R:備份儲存過程和函式
-E:備份事件
--triggers:備份 觸發器

--master-data=2 *****
(1) 記錄備份時刻的binlog資訊
(2) 自動鎖表
不加--single-transaction ,溫備份
加了--single-transaction,對於InnoDB表不鎖表備份(快照備份)

--single-transaction *****
對於InnoDB的表,進行一致性快照備份,不鎖表.
  • 恢復案例
4. 恢復案例

4.1 背景環境:
正在執行的網站系統,mysql-5.7.20 資料庫,資料量50G,日業務增量1-5M。
4.2 備份策略:
每天23:00點,計劃任務呼叫mysqldump執行全備指令碼
4.3 故障時間點:
年底故障演練:模擬週三上午10點誤刪除資料庫.
4.4 思路:
1、停業務,掛維護頁,避免資料的二次傷害
2、找一個臨時庫,恢復週二23:00全備
3、擷取週二23:00  --- 週三10點誤刪除之間的binlog,恢復到臨時庫
4、測試可用性和完整性
5、 
    5.1 方法一:直接使用臨時庫頂替原生產庫,前端應用割接到新庫
    5.2 方法二:將誤刪除的表匯出,匯入到原生產庫
6、開啟業務
處理結果:經過20分鐘的處理,最終業務恢復正常

4.5 故障模擬演練
4.5.1 準備資料
create database backup;
use backup
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
rm -rf /backup/*

4.5.2 週二 23:00全備

mysqldump -uroot -p123 -A  -R  --triggers --set-gtid-purged=OFF --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F).sql.gz


4.5.3 模擬週二 23:00到週三 10點之間資料變化
use backup
insert into t1 values(11),(22),(33);
commit;
create table t2 (id int);
insert into t2 values(11),(22),(33);
commit;

4.5.4 模擬故障,刪除表(只是模擬,不代表生產操作)
drop database backup;

4.6 恢復過程
4.6.1 準備臨時資料庫(多例項3307)
systemctl start mysqld3307
4.6.2 準備備份
(1)準備全備:
cd /backup
gunzip full_2018-10-14.sql.gz 
(2)擷取二進位制日誌
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=753;
753
1519 
mysqlbinlog --skip-gtids   --start-position=753 --stop-position=1519  /data/binlog/mysql-bin.000002 >/backup/bin.sql


4.6.3 恢復備份到臨時庫
mysql -S /data/3307/mysql.sock
set sql_log_bin=0;
source /backup/full_2019-07-15.sql
source /backup/bin.sql

4.6.4 將故障表匯出並恢復到生產
mysqldump   -S /data/3307/mysql.sock -B  backup  >/backup/bak.sql
mysql -uroot -p123 
set sql_log_bin=0
source /backup/bak.sql;

5. 練習:
1、建立一個數據庫 oldboy
2、在oldboy下建立一張表t1
3、插入5行任意資料
4、全備
5、插入兩行資料,任意修改3行資料,刪除1行資料
6、刪除所有資料
7、再t1中又插入5行新資料,修改3行資料

需求,跳過第六步恢復表資料


6. 擴充套件引數  ***
在構建主從時,使用AUTO/ON
--set-gtid-purged=AUTO/ON

僅是做普通的本機備份恢復時,可以新增
--set-gtid-purged=OFF  

SET @@GLOBAL.GTID_PURGED='aa648280-a6a6-11e9-949f-000c294a1b3b:1-11';

--max_allowed_packet=128M  控制的是備份時傳輸資料包的大小.

mysqldump -uroot -p123 -A  -R  --max_allowed_packet=128M --triggers --set-gtid-purged=OFF --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F).sql.gz


7. 物理備份-XBK

7.1 安裝依賴包:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
7.2 下載軟體並安裝
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

7.3 innobackupex 使用 
7.3.1 備份核心理念
1. 針對非InnoDB,進行鎖表備份,copy所有的非innoDB表文件
2. 針對InnoDB表,立即觸發CKPT,copy所有InnoDB表相關的檔案(ibdata1,ibd,frm).
並且將備份過程中產生,新的資料變化的部分redo一起備份走
3. 在恢復時,xbk會呼叫InnoDB引擎的CSR過程,將資料和redo的LSN追平,然後進行一致性恢復.

7.3.2 備份過程
(1) 全備
[root@db01 backup]# innobackupex  --user=root --password=123 --no-timestamp /backup/full
(2) 利用全備進行恢復
1. 
[root@db01 ~]# pkill mysqld
2. 
[root@db01 ~]# \rm -rf /data/mysql/data/*
3. *****
[root@db01 ~]# innobackupex --apply-log /backup/full/
4. 
[root@db01 full]# cp -a /backup/full/* /data/mysql/data/
5. 
[root@db01 full]# chown -R mysql.mysql /data/mysql/data/*
6. 
[root@db01 full]# /etc/init.d/mysqld start