mysql備份與恢復

mysql備份與恢復

1.mysql備份類型

冷備份:關閉數據、中止業務
溫備份:加鎖備份
熱備份:在先備份,不會影響到也正常運行

2.mysql備份方式

邏輯備份:基於SQL語句的備份
(1)mysqldump建庫、建表、數據插入
(2)基於二進制日誌:數據庫的全部變化類的操做
(3)基於複製的備份:將二進制日誌實時傳送到另外一臺機器而且恢復
物理備份
(1)xtrabackup進行物理備份
(2)拷貝數據文件(冷備)

3.mysql的備份工具

(1)mysqldump
    mysql原生自帶很好用的邏輯備份工具
(2)mysqlbinlog
    實現binlog備份的原生態命令
(3)xtrabackup
    precona公司開發的性能很高的物理備份工具

4.mysqldump備份工具的使用

優勢:邏輯備份工具,都是SQL語句,都是文本格式,便於查看和編輯,更便於壓縮
缺點:備份效率較慢前端

4.1 mysqldump備份工具經常使用參數

-A, --all-databases:全庫備份
-B:增長建庫(create)及「use庫」的語句,能夠直接接多個庫名,同時    備份多個庫***** -B 庫1 庫2
-R, --routines:備份存儲過程和函數數據
--triggers:    備份觸發器數據
-F, --flush-logs :刷新binlog日誌,爲了方便未來二進制日誌截取時的起點
--master-data={1|2}:告訴你備份時刻的binlog位置,通常咱們選擇使用2,以註釋的方式記錄二進制日誌位置
--single-transaction:對innodb引擎進行熱備

4.2 mysqldump備分工具示例

全庫備份
[root@db02 backup]# mysqldump -uroot -poldboy -A  >  /backup/mysql.sql
單庫備份
[root@db02 backup]# mysqldump -B oldboy > /backup/oldboy.sql
[root@db02 backup]# mysqldump  oldboy > /backup/oldboy.sql
-B,增長建庫(create)及「use庫」的語句,在未來恢復時,不須要手工進行建庫和use
不加-B,須要恢復時,先建立庫,use庫下再進行恢復
另外,-B選項還能夠實現,同時備份多個庫,備份到同一個文件中
[root@db02 backup]#mysqldump -uroot -p123 -B lufei oldboy>/backup/lufei_oldboy.sql
如下例子,若是不加-B,去備份,他的功能是備份路飛數據庫下的oldboy表
mysqldump -uroot -p123  lufei oldboy>/backup/lufei_oldboy.sql
mysqldump 庫1 表1 表2 表3 >庫1.sql
完整備份語句
[root@db02 backup]# mysqldump -uroot -poldboy -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
壓縮備份語句
mysqldump -uroot -p123 -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
使用source命令進行恢復:
mysql>set sql_log_bin=0; #臨時關閉寫入binlog寫文件
mysql> source /backup/all.sql; 進行恢復

4.3 Mysqldump+Mysqlbinlog企業級增量備份恢復實戰

背景環境:
    正在運行的網站系統,mysql數據庫,數據量25G,日業務增量10-15M。
備份方式:
    天天23:00點,計劃任務調用mysqldump執行全備腳本
故障時間點:
    上午10點,誤刪除了一個表
如何恢復?
-------
思路:
    一、斷開業務,防止對數據庫二次傷害,掛出維護頁面
    二、搭建備用庫,恢復全備
    三、截取昨天晚上23:00以後到上午10點誤刪除操做以前的二進制日誌
    四、恢復到備用庫,驗證數據可用性和完整性
    五、兩種方案恢復前端應用
        5.1 備用庫導出誤刪除的表,導入到生產庫,開啓業務
        5.2 直接將應用切割到備用庫,替代生產庫,開啓業務

解決過程:mysql

模擬故障並恢復:
一、原始數據:
mysql> create database oldboy;
mysql> use oldboy
mysql> create table t1 (id int,name varchar(20));
mysql> insert into t1 values (1,'zhang3');
mysql> insert into t1 values (2,'li4');
mysql> insert into t1 values (3,'wang5');
二、模擬前一天晚上23:00全備
mysqldump  -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
三、模擬白天(23:00-10:00)業務對數據的修改
mysql> insert into t1 values (4,'zhang33');
mysql> insert into t1 values (5,'li44');
mysql> insert into t1 values (6,'wang54');
四、模擬故障
drop table t1;
五、恢復
(1)準備全備,並獲取到備份文件中的binlog的截取起點
    [root@db02 mysql]# gunzip all_2019-04-26.sql.gz 
     -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=660;
(2)截取二進制日誌
    show binlog events in 'my-bin.000001';  ----》drop以前的position爲885
    [root@db02 mysql]# mysqlbinlog --start-position=660 --stop-position=885 mysql-bin.000001 > /tmp/mysql.sql
 (3)恢復全備+binlog
    mysql> set sql_log_bin=0;
    mysql> source /backup/all_2019-04-26.sql;
    mysql> source /tmp/mysql.sql

5. xtrabackup備份工具

percona公司的備份工具,性能比較高。物理備份工具。
特色:
物理備份工具,在同級數據量基礎上,都要比邏輯備份性能要好的多。
特別是在數據量比較大的時候,體現的更加明顯。
備份方式:
    一、拷貝數據文件
    二、拷貝數據頁
備份原理(innodb):
    一、對於innodb表,能夠實現熱備
        (1)在數據還有修改操做的時刻,直接將數據文件中的數據頁備份
        此時,備份走的數據對於當前mysql來說是不一致。
        (2) 將備份過程當中的redo和undo一併備走。
        (3)爲了恢復的時候,只要保證備份出來的數據頁LSN能和redo LSN匹配,
            未來恢復的就是一致的數據。redo應用和undo的應用。
    二、對與myisam表,實現自動鎖表拷貝文件。

5.1 xtrabackup安裝

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

5.2 xtrabackup備份實戰

全量備份
innobackupex --user=root --password=oldboy --socket=/application/mysql/tmp/mysql.sock --no-timestamp  /server/bakcup/full
--user:數據庫帳號
--password:數據庫密碼
--socket:mysql的mysql.sock文件位置
--no-timestamp:以本身指定的文件位置進行備份
全量恢復案例:
一、恢復數據前的準備(合併xtabackup_log_file和備份的物理文件)
innobackupex --apply-log --use-memory=32M /server/backup/full/
二、模擬故障
pkill mysqld # 關閉數據庫
ps -ef|grep mysql
刪除數據庫
cd /application/mysql/data
rm -rf *
三、恢復數據庫
cp -a /server/backup/full/*  /application/mysql/data
或者
innobackupex --copy-back  /server/backup/full/
報錯:這是由於在my.cnf配置文件裏沒有添加datadir數據文件路徑,添加便可
[root@db02 data]# innobackupex --copy-back /server/bakcup/full/
xtrabackup: recognized server arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 
xtrabackup: recognized client arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 
190426 10:57:47 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

innobackupex version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c)
Error: datadir must be specified.
解決:
vim /etc/my.cnf
datadir=/application/mysql/data
四、啓動數據庫
/etc/init.d/mysqld start
mysql -e "show database;"

5.3 xtrabackup 實現增量備份及故障恢復

背景:
-某大型網站,mysql數據庫,數據量500G,每日更新量100M-200M
備份策略:
-xtrabackup,每週六0:00進行全備,週一到週五及週日00:00進行增量備份。
故障場景:
–週三下午2點出現數據庫意外刪除表操做。
如何恢復?sql

全備
innobackupex --user=root --password=123 --no-timestamp /backup/full/
週一數據變化進行增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
週二數據變化進行增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
模擬數據破壞
修改數據以後,不當心把表刪除了
進行數據恢復,將全部增量備份合併到一個備份中
innobackupex --apply-log  --redo-only /backup/full 
innobackupex --apply-log  --redo-only --incremental-dir=/backup/inc1 /backup/full
innobackupex --apply-log  --incremental-dir=/backup/inc2 /backup/full
innobackupex --apply-log  /backup/full
關閉數據庫,刪除data中的數據
pkill mysqld
cd /application/mysql/data
rm -rf *
截取binlog文件
mysqlbinlog --start-position=244 --stop-position=930 mysql-bin.000005 > /tmp/mysql.sql

使用innobackup恢復
innobackup --copy-back /backup/full
/etc/init.d/mysqld start
mysql> source /tmp/msyql.sql

5.3 xtrabackup單表恢復

爲解決爲了恢復1G表,須要將整個全備恢復數據庫

drop table t1;
須要建立表結構與原來表結構如出一轍的表
create table t1 (id int,name varchar(20));
刪除原來t1表中的ibd文件
alter table t1 discard tablespace;
複製備份中的ibd文件
cd /application/mysql/data/oldboy
cp /backup/full/oldboy/t1.ibd  ./
修改所屬組
chown  -R mysql.mysql *
導入ibd文件到數據庫中
alter table t1 import tablespace;
相關文章
相關標籤/搜索