MySQL備份還原

mysql備份還原

1.1 備份恢復-說明

運維工做的核心簡單歸納就兩件事:mysql

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

1.1.1 備份簡介

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

1.2 mysqldump備份工具詳解

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

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

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

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

增量備份實現socket

# 準備工做
開啓二進制日誌
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匹配,達到數據的一致。post

對於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