1. 程式人生 > >MySQL備份還原

MySQL備份還原

lib -s 拷貝文件 同時 sin 公司 zip 不足 lin

mysql備份還原

1.1 備份恢復-說明

運維工作的核心簡單概括就兩件事:

第一個:是保護公司的數據.
第二個:是讓網站能7*24小時提供服務(用戶體驗)。

1.1.1 備份簡介

邏輯備份(文本表示:SQL 語句)
物理備份(數據文件的二進制副本)
基於快照的備份
基於復制的備份
增量備份(刷新二進制日誌)

1.2 mysqldump備份工具詳解

mysql原生自帶很好用的邏輯備份工具

1.2.1 mysqldump常用參數

備份出來的xxx.sql文件,裏面是創建與更新的SQL語句。

-A ; --all-databases 全庫備份參數
-B  :建議加上此參數,可接一個或多個庫(表)
註意:
? A與B最好不要同時使用。 ?
-B會在備份.sql中自動增加create和use語句,若不-B需要進入mysql創建庫和use庫。 -d 僅表結構 -t 僅數據 --compact 減少無用數據輸出(調試) -R, --routines備份存儲過程和函數數據 --triggers備份觸發器數據 冗余的兩個參數 -l 單表備份時使用 -x 在做全庫備份時使用 --master-data={1|2} 告訴你備份後時刻的binlog位置。 2 註釋 1 非註釋,要執行(主從復制) --single-transaction 只支持innodb引擎,支持熱備。 會單獨開啟一個事務進行備份,利用事務的快照技術實現的。

1.2.2 邏輯備份-SQL

#導出單個數據庫 (建議加B)
[root@db02 data]# mysqldump -uroot -p123456 -B world >/tmp/world.sql
#導出多個數據庫 (必須加B)
[root@db02 data]# mysqldump -uroot -p123456 -B world mysql >111.sql
#導出單個數據庫表 (不能加B)
[root@db02 data]# mysqldump -uroot -p123456 world city >111.sql
#導出所有數據庫 (-A或--all-databases)
[root@db02 data]# mysqldump -u root -p123456 -A >all.sql # 備份-常規參數 (binlog位置、熱備-快照) [root@db02 data]# mysqldump -A -R --triggers --master-data=2 --single-transaction |gzip >/opt/alL_$(date +%F).sql.gz

1.2.3 增量備份-binlog

增量數據就是指上一次全量備份數據之後到下一次全備之前數據庫所更新的數據

對於mysqldump, binlog就是增量數據.

增量備份實現

# 準備工作
開啟二進制日誌
vi /etc/my.cnf
log-bin=/data/mysql/mysql-bin  #在全局打開binlog
set sql_log_bin=0   #在會話級別修改為臨時關閉
# 全備份
mysqldump -B --master-data=2 --single-transaction oldboy|gzip>/data/backup/oldboy_$(date +%F).sql.gz
# 增量備份 (將之後的binlog->.sql文件)
zcat oldboy_2017-06-22.sql.gz >oldboy_2017-06-22.sql
sed -n 22p oldboy_2017-06-22.sql    #查看號
# binlog->.sql文件
mysqlbinlog -d oldboy --start-position=339 oldboy-bin.000008 -r bin.sql 

1.2.4 還原(恢復)

法一:source  (推薦)
# 加+B選項
mysql> source /tmp/world.sql
# 不加+B選項
[root@db02 ~]# mysql -uroot -p66666
mysql> create database xzy;
mysql> use xzy
mysql> source /tmp/world.sql

法二:命令行 <
mysql> create database xzy;
[root@db02 ~]# mysql -uroot -p666666 xzy < /tmp/world.sql

1.3 Xtrabackup 備份工具詳解

1.3.1 xtrabackup簡介

xtrabackup是Percona公司CTO Vadim參與開發的一款基於InnoDB具有開源免費,支持在線熱備,備份恢復速度快,占用磁盤空間小等特點

xtrabackup熱備原理(保證數據一致性)-innodb引擎

在數據還有修改操作的時刻,直接將數據文件中的數據頁備份,並將備份過程中的redo和undo一並備走(回滾或前滾)。恢復時,只要保證備份出來的數據頁LSN能和redo LSN匹配,達到數據的一致。

對於myisam表,實現自動鎖表拷貝文件。

1.3.2 mysqldump與xtrabackup特點對比

mysqldump不足:

mysqldump備份方式是采用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果數據庫大於50G,mysqldump備份就不太適合。

Xtrabackup優點

1)備份速度快,物理備份可靠

2)備份過程不會打斷正在執行的事務(無需鎖表)

3)能夠基於壓縮等功能節約磁盤空間和流量

4)自動備份校驗

5)還原速度快

6)可以流傳將備份傳輸到另外一臺機器上

1.3.3 安裝

# 安裝依賴包
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
# 下載安裝包
wget 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 localinstall percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

1.3.4 xtrabackup 備份恢復

1、備份
#  首次-全量備份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp /server/backup/base_full
# 第一次增量備份-(基於第一次全量)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/base_full --incremental /server/backup/one_inc
# 第二次增量備份,(基於第一次增量)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --parallel=3 --incremental-basedir=/server/backup/one_inc/ --incremental /server/backup/two_inc


2、準備增量恢復:
# 應用全備日誌(--apply-log,暫時不需要做回滾操作--redo-only)
innobackupex --apply-log --use-memory=32M --redo-only /server/backup/base_full/
# 合並第一次增量到全備中
innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/server/backup/one_inc /server/backup/base_full/
#合並第二次增量到全備中 (不加--redo-only)
innobackupex --apply-log --use-memory=32M --incremental-dir=/server/backup/two_inc /server/backup/base_full/
#
innobackupex --apply-log /backup/full

# 確認binlog起點
cat /backup/xbackup/inc2/xtrabackup_binlog_info 
 mysql-bin.000001    1121
# 截取到drop操作之前的binlog
mysqlbinlog  --start-position=1121 /tmp/mysql-bin.000003 
找到drop之前的event和postion號做日誌截取,假如 1437
mysqlbinlog  --start-position=1121 --stop-position=1437    /tmp/mysql-bin.000003 >/tmp/incbinlog.sql


關閉數據庫
/etc/init.d/mysqld stop

刪除/移動MySQL所有數據
cd /application/mysql/data/
rm -rf *

恢復數據
恢復xtrabackup數據
innobackupex --copy-back /backup/xbackup/full/
chown -R mysql.mysql /application/mysql/data/
/etc/init.d/mysqld start
恢復binlog
set sql_log_bin=0
source /tmp/incbinlog.sql

MySQL備份還原