Linux運維:mysql數據庫的備份與恢復

運維工程師的平常工做須要對各類數據進行備份,其中數據庫數據的備份當屬重點之一,爲了方便管理,選擇哪一種備份方案是很重要的。

數據備份種類

全量備份

全量備份就是指對某一個時間點上的全部數據或應用進行的一個徹底拷貝。實際應用中就是用一盤磁帶對整個系統進行全量備份,包括其中的系統和全部數據。html

特色mysql

  • 備份的數據全面並且最爲完整
  • 數據量大的時候備份時間長
  • 備份數據會存在大量重複信息

增量備份

增量備份是指在一次全備份或上一次增量備份後,之後每次的備份只需備份與前一次相比增長或者被修改的文件。這就意味着,第一次增量備份的對象是進行全備後所產生的增長和修改的文件;第二次增量備份的對象是進行第一次增量備份後所產生的增長和修改的文件,如此類推。linux

特色sql

  • 與全量備份相比,沒有重複的備份數據
  • 備份數據量不大,備份恢復的時間短
  • 數據恢復麻煩,必須具備上一次全備份和全部增量備份磁帶,而且須要按照全量備份到增量備份的順序反推動行恢復

差別備份

差別備份是指在一次全備份後到進行差別備份的這段時間內,對那些增長或者修改文件的備份。shell

特色數據庫

  • 備份時間短,節省磁盤空間
  • 恢復所需的磁帶少,恢復時間短

比較
數據備份的數據量(大>>小):
全量備份>差別備份>增量備份安全

數據的恢復時間(快>>慢):
全量備份->差別備份->增量備份bash

mysql數據庫備份工具

mysqldump工具

mysqldump是一款mysql邏輯備份的工具,它將數據庫裏面的對象(表)導出做爲SQL腳本文件。它是mysql備份經常使用的備份方法,適合於不一樣版本mysql之間的升級、遷移等,不過在數據庫比較大的時候,效率不高。服務器

下面是mysqldump命令的常見用法:app

# 備份單個的數據庫,如備份db1這個數據庫
mysqldump -uroot -p123456 db1 > /backup/db1_`date +%F`.sql

# 備份全部數據庫,-A參數
mysqldump -uroot -p123456 -A > /backup/all_db.sql

# 備份遠程主機的數據庫,-h指定IP地址,-P(大寫P)指定端口
mysqldump -uroot -p123456 -h192.168.30.4 -P3306 db1 > /backup/db1.sql

# 只備份表結構,不備份數據,使用-d參數
mysqldump -uroot -p123456 -d db1 > /backup/db1.sql

# 只備份數據,不備份表結構,使用-t參數
mysqldump -uroot -p123456 -t db1 > /backup/db1.sql 

# 備份指定的多個庫,-B參數
mysqldump -uroot -p123456 -B db1 db2 db3 > /backup/db123.sql

# 備份指定的表,如備份db1庫裏面的stu表
mysqldump -uroot -p123456 db1 stu > /backup/db1_stu.sql

# 備份多個表
mysqldump -uroot -p123456 庫1 表1 表2 表3... > db_tables.sql

# 恢復數據
mysqldump -uroot -p123456 dbname < xxx.sql
#或者
mysqldump -uroot -p123456 < xxx.sql

其餘參數:

參數 說明
-R, --routines 備份存儲過程和函數數據
--triggers 備份觸發器數據
--master-data={1或者2} 告訴你備份後時刻的binlog位置,若是等於1,則將其打印爲CHANGE MASTER命令; 若是等於2,那麼該命令將以註釋符號爲前綴。
--single-transaction 對innodb引擎進行熱備

一條完整的備份語句(適用innodb引擎):

mysqldump -A -R --triggers --master-data=2 --single-transaction | gzip >/backup/all_$(date +%F).sql.gz

適用多引擎混合的一條完整備份語句:

mysqldump -A -R --triggers --master-data=2 |gzip  >/backup/all_$(date +%F).sql.gz

備份腳本
平常能夠根據需求進行備份工做,常見是使用shell腳本結合任務計劃,下面是一個mysql數據庫備份腳本示例,mysql_backup.sh腳本內容以下:

#!/bin/bash 
bakdir=/data/backup # 定義備份文件存放目錄
d=`date +%F` # 以日期爲命名格式

# 備份三個數據庫bbs,blog,db2
for db in bbs blog db2
do
    mysqldump -uroot -p123456 $db > $bakdir/$db\_$d.sql
done
cd $bakdir
# 對備份文件進行壓縮
gzip *_$d.sql
# 對備份時間超過一個月的文件進行刪除
find ./ -name "*.gz" -mtime +30 |xargs rm

添加任務計劃:

[root@moli_linux1 data]$ chmod +x /usr/local/sbin/mysql_backup.sh
[root@moli_linux1 data]$ crontab  -e
# 添加內容
30 3 * * * /bin/bash /usr/local/sbin/mysql_backup.sh >/tmp/mysql_backup.log 2>/tmp/mysql_backup.log
# 任務計劃內容是:
# 天天凌晨3點30分執行備份腳本,並將正確與錯誤輸出寫進mysql_backup.log文件

xtrabackup備份工具

Xtrabackup是由percona開源的免費數據庫熱備份軟件,它能對InnoDB數據庫和XtraDB存儲引擎的數據庫非阻塞地備份,也支持MyISAM表和服務器的其餘部分。

mysqldump對於導出幾個G的數據庫或幾個表,仍是不錯的,速度並不慢。一旦數據量達到幾十上百G,
不管是對原庫的壓力仍是導出的性能,mysqldump就力不從心了。Percona-Xtrabackup備份工具,
是實現MySQL在線熱備工做的不二選擇,可進行全量、增量、單表備份和還原

xtrabackup的安裝

環境說明:CentOS Linux release 7.5.1804 (Core) IP=192.168.30.3

安裝xtrabackup2.4版本:

# 添加yum源
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
# 下載rpm包
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 -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

Xtrabackup安裝完成後有4個可執行文件,其中2個比較重要的備份工具是innobackupexxtrabackup:

  1. .xtrabackup只能備份InnoDB和XtraDB 兩種數據表(在2.4版本以後支持備份MyISAM)
  2. .innobackupex是一個封裝xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時須要加一個全局的讀鎖

innobackupex的全量備份

innobackupex作全量備份的命令是:

innobackupex --defaults-file=/etc/my.cnf  --host=192.168.30.3  --port=3306 \
--user=root --password=123456  /data/backup/mysql

說明:

  • --defaults-file指定mysql的配置文件,要從配置文件找到datadir的路徑;
  • --host指定IP, --port指定端口;
  • --user指定用戶,--password指定用戶密碼;
  • /data/backup/mysql是備份文件所在的目錄,使用絕對路徑。

備份的數據會存放在指定的目錄裏,而且自動生成一個以當前日期、時間爲名字的目錄,例如2019-06-01_15-05-31

[root@moli_linux1 mysql]$ pwd
/data/backup/mysql
[root@moli_linux1 mysql]$ ll
總用量 0
drwxr-x--- 2 root root   6 6月   1 15:03 2019-06-01_15-03-22
drwxr-x--- 6 root root 188 6月   1 15:05 2019-06-01_15-05-31
[root@moli_linux1 mysql]#

關於備份用戶

使用xtrabackup備份能夠直接使用root用戶,可是生產環境中是不多見的不符合安全規則,所以能夠建立一個備份用戶進行數據備份的工做,這個備份用戶擁有reload, lock tables, replication client, process, super等權限。

mysql  -uroot  -p123456
> grant reload,lock tables,replication client on *.* to 'backupuser'@'localhost'  identified  by  '123456';
> flush  privileges;

建立後,後續的備份工做都使用這個備份用戶,mysqldump也能夠相似地使用非root用戶。

innobackupex全量備份的恢復

innobackupex全量備份的恢復:

# 1.預備恢復:
innobackupex --apply-log /data/backup/mysql/2019-06-01_15-05-31 --user-memroy=2G

# 2.中止MySQL/MariaDB,將datadir目錄裏面的數據清空(或者挪走)
/etc/init.d/mysql stop
mv /data/mysql /data/mysql_bak

# 3.恢復
innobackupex --defaults-file=/etc/my.cnf  --copy-back  /data/backup/mysql/2019-06-01_15-05-31

# 4.改權限,這個/data/mysql是my.cnf裏datadir的目錄
chown -R mysql:mysql /data/msyql

#5.啓動MySQL/MariaDB
/etc/init.d/mysql start

innobackupex的增量備份

innobackupex --host=192.168.30.3  --port=3306 --user=bakuser --password=your_pass \
 --incremental /data/backup/mysql --incremental-basedir=/data/backup/mysql/last-backup-file

說明:

  • --incremental :表示本次備份是一個增量備份(若針對的上次備份爲一個全量備份,這裏也能夠認爲是個差別備份)
  • --incremental-basedir:指定本次增量備份針對的哪個備份(能夠是上個增量,也能夠是上個全量) 增量備份能夠一環扣一環,好比能夠週一作一個全量備份,而後週二作週一的增量,週三作週二的增量...

innobackupex增量備份的恢復
準備階段:
第一步:中止數據庫服務
第二步:刪除或者備份datadir裏面的數據
第三步:準備全量備份恢復:

innobackupex --apply-log --redo-only  /PATH/TO/全量備份目錄

第四步:準備增量備份恢復1:

innobackupex --apply-log --redo-only  /PATH/TO/全量備份目錄 --incremental-dir=/PATH/TO/第一次增量備份目錄

第五步:準備增量備份恢復2:

innobackupex --apply-log --redo-only /PATH/TO/全量備份目錄  --incremental-dir=/PATH/TO/第二次增量備份目錄

......
第N步:準備最後一個增量備份恢復:

innobackupex --apply-log /PATH/TO/全量備份目錄  --incremental-dir=/PATH/TO/最後一次增量備份目錄

準備階段的最後一步,再次準備全量:

innobackupex --apply-log   /PATH/TO/全量備份目錄   #(此次不用加--redo-only了)

恢復階段:

  1. innobackupex --copy-back /PATH/TO/全量備份目錄
  2. 改權限:chown -R mysql:mysql /PATH/TO/datadir
  3. 啓動MySQL/MariaDB
說明:--redo-only:表示進行準備(應用日誌)工做時,只進行redo操做,只會重作已提交但未應用的事務,不會回滾未提交的事務。緣由是後面還有個增量備份,未提交的可能在後面增量備份時進行提交。須要注意的是,最後一個增量備份不須要加這個選型。

mariadb10.3.x以上版本進行備份恢復

MariaDB10.3.x及以上的版本用Percona XtraBackup工具會有問題。
緣由多是MariaDB10.3以上版本的redo日誌格式和以前不一樣了。
解決方案是,使用mariabackup,它是MariaDB提供的一個開源工具,用於對InnoDB,Aria和MyISAM表進行物理在線備份。
這個工具是基於Percona的XtraBackup(版本2.3.8)的解決方案:

全量備份:
mariabackup --defaults-file=/etc/my.cnf --backup --user=xxx --password=xxx --target-dir /data/backup/2019-06-01

全量恢復:
中止數據庫
清空datadir
mariabackup --prepare --target-dir /data/backup/2019-06-01/ 
mariabackup --copy-back --target-dir /data/backup/2019-06-01/
改屬主、屬組
啓動

增量備份:
mariabackup --defaults-file=/etc/my.cnf --backup --user=xxx --password=xxx --target-dir /data/backup/2019-06-01
第一個增量:mariabackup --backup --user=xxx --password=xxx  --target-dir /data/backup/2019-06-01_inc1 --incremental-basedir /data/backup/2019-06-01
第二個增量:mariabackup --backup --user=xxx --password=xxx  --target-dir /data/backup/2019-06-01_inc2 --incremental-basedir /data/backup/2019-06-01_inc1

增量恢復:
先準備全備
mariabackup --prepare --target-dir /data/backup/2019-06-01 --apply-log-only
準備第一個增量:
cd /data/backup
mariabackup --prepare --target-dir ./2019-06-01 --incremental-dir ./2019-02-21_inc1 --apply-log-only
準備第二個增量:
mariabackup --prepare --target-dir .2019-06-01 --incremental-dir ./2019-02-21_inc2 --apply-log-only
恢復:
mariabackup --copy-back  --target-dir ./2019-06-01

參考資料

相關文章
相關標籤/搜索