Innobackupex MySQL 全備、增備及恢複

來源:互聯網
上載者:User

標籤:


簡介:

在這之前都是通過 mysqldump 來備份資料庫的,由於是邏輯備份,所以採用這種備份方式資料是很安全的,跨平台、版本都很容易。

凡事有利必有弊,邏輯備份在你資料庫比較大時,備份、恢複資料所耗費的時間也是蠻長的,所以要不斷改進,使用物理備份。

由於線上資料庫表使用的是混合引擎 MyISAM 跟 Innodb ,所以也不能使用 mysqlhotcopy ,這個工具還是蠻好用的,可惜只能備份 MyISAM。

Percona XtraBackup 是 Percona 公司開發的一個用於 MySQL 資料庫物理熱備的備份工具,且是開源項目。

瞭解到 XtraBackup 工具下有一個 innobackupex 支援 MyISAM 跟 Innodb 的備份,所以來搞一搞。

一、安裝 XtraBackup

shell > yum -y install 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

# 或者

shell > 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.rpmshell > yum -y install epel-releaseshell > yum -y install rsync libev-devel numactl-devel perl-DBD-MySQLshell > rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

# 需要解決依賴關係

二、innobackupex 全備

shell > innobackupex --user=user --password=passwd --no-timestamp ./2016/09-29/`date +%H-%M`.dbname

# --no-timestamp 如果不加的話會在備份目錄下產生一個備份時間的目錄,備份資料存在該目錄下

# 將整個Database Backup到 ./2016/09-29/ 以備份時間加自訂名稱的一個目錄下

# 雖然可以使用 --stream=tar 加 | gzip > 的方式直接打包並壓縮,但是備份速度就下降了,所以我寧願快速備份,之後再去處理打包、壓縮。

# 全備指令碼

shell > vim script/backupdb.sh#!/bin/bash# 0 0 */2 * * sh /root/script/backupdb.sh# author: Wang XiaoQiang 2016/09/29dbname=‘alldatabases‘dbuser=‘user‘dbpassword=‘passwd‘backup_dir=‘/data/backup_db‘backup_log=‘/root/script/logs/backup.log‘ymtime=`date +%Y-%m`dtime=`date +%d`wlog(){  echo -e "`date "+%F %T"` DBname: $1 State: $2\n" >> $backup_log}[ ! -d $backup_dir/$ymtime ] && mkdir -p $backup_dir/$ymtimecd $backup_dir/$ymtime && /usr/bin/innobackupex --user=$dbuser --password=$dbpassword --no-timestamp $dbname > /dev/null 2>&1if [ $? -eq 0 ];then  wlog $dbname ‘Backup success.‘  dbakfile=$dbname.$dtime.tar.gz  tar zcf $dbakfile $dbname --remove-files  [ $? -eq 0 ] && wlog $dbakfile ‘Packaging success.‘ || wlog $dbakfile ‘Packaging failed.‘else  wlog $dbname ‘Backup failed.‘fi# End

三、innobackupex 全備恢複

shell > /etc/init.d/mysql.server stop  # 首先關閉資料庫shell > cd /data/backup_db  # 切換到備份目錄shell > mv /usr/local/mysql-5.5.52/data data.old  # 將原來的資料目錄備份一下shell > tar zxf alldatabase.11.tar.gz  # 然後將原來的備份解壓縮shell > innobackupex --apply-log alldatabase  # 在備份上應用日誌,一般沒有看到報錯且最後顯示 OK 就沒有問題 ( --use-memory 使用該參數加快速度 )161011 12:07:33 completed OK!shell > innobackupex --copy-back alldatabase  # 將備份還原到 my.cnf 指定的 datadir 中,不指定 --defaults-file,預設 /etc/my.cnfError: datadir must be specified.  # 報錯資訊顯示,在預設設定檔 /etc/my.cnf 中,沒有找到 datadir 配置項shell > vim /etc/my.cnf  # 加入 datadir 配置項datadir         = /usr/local/mysql-5.5.52/datashell > innobackupex --copy-back alldatabase  # 再次執行 copy 動作,沒有報錯且顯示 OK 161011 12:17:52 completed OK!shell > ll -d /usr/local/mysql-5.5.52/datadrwxr-x--- 6 root root 4096 10月 11 12:17 /usr/local/mysql-5.5.52/datashell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data  # 修改資料目錄許可權shell > /etc/init.d/mysql.server start

# 備份已經恢複!
# 回顧整個恢複過程,發現一個問題:之前資料庫裡的東西全部沒有了...
# 也就是說,innobackupex 只適用於該 MySQL 中除系統庫外,只有一個庫的備份。
# 雖然有選項 --databases 可以指定備份哪個資料庫,但是備出來的結果卻是 all databases,且恢複的時候也是全部覆蓋。
# 1、採用 innobackupex 備份整庫,然後恢複到一台新庫上,再通過 mysqldump 將需要還原的單庫備份一次,之後匯入需要恢複的資料庫中 ( 要考慮恢復 )。
# 2、採用 innobackupex 備份只有一個業務庫的 MySQL Server,恢複到只有該業務庫的 MySQL Server 中。
# 3、如果一個 MySQL Server 中有多個資料庫,又只想備份某個庫,且該庫體積比較小的情況下,建議使用 mysqldump 備份。

三、innobackupex 增備

shell > mysql -uuser -ppassword -A # 建立測試庫、表,插入測試資料mysql> create database test_incre character set utf8;mysql> create table test_incre.incre(id int(10) not null,name varchar(20));mysql> insert into test_incre.incre values(1,‘Wang XiaoQiang‘);mysql> quitshell > innobackupex --user=user --password=password --database=test_incres --no-timestamp /data/backup_db/test_incre # 第一次全備

# 再次證明:--databases 就是來賣萌的,你可以去來源資料庫目錄 du -sh 跟 目標備份目錄 du -sh 比對,真的是一毛一樣。

shell > mysql -uuser -ppassword -A # 添加測試資料mysql> insert into test_incre.incre values(2,‘Xiao GuaiShou‘);mysql> quitshell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre --incremental /data/backup_db/test_incre01

# --incremental-basedir=/data/backup_db/test_incre 第一次增備指定全備路徑
# --incremental 參數說明這是一次增備,並指定增備路徑

# 全備目錄 du -sh 跟 增備目錄 du -sh 比較發現,增備目錄只比全備目錄少了 1G,這說明對於 MyISAM 表來講,還是全備!!!

shell > mysql -uuser -ppassword -A # 再次添加測試資料mysql> insert into test_incre.incre values(3,‘King‘);mysql> quitshell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre01 --incremental /data/backup_db/test_incre02

# 第二次增備是在第一次增備的基礎上,所以 --incremental-basedir 指定的是第一次增備目錄,最後指定的第二次增備目錄

shell > cat test_incre/xtrabackup_checkpoints    # backup_type 提示:這是一次全備,from_lsn 從 0 開始至 1601917 結束backup_type = full-backupedfrom_lsn = 0to_lsn = 1601917last_lsn = 1601917compact = 0recover_binlog_info = 0shell > cat test_incre01/xtrabackup_checkpoints  # backup_type 提示:這是一次增備,from_lsn 從上次結束 lsn 1601917 開始至 1602789 結束backup_type = incrementalfrom_lsn = 1601917to_lsn = 1602789last_lsn = 1602789compact = 0recover_binlog_info = 0shell > cat test_incre02/xtrabackup_checkpoints  # backup_type 提示;這是一次增備,from_lsn 從上次結束 lsn 1602789 開始至 1603652 結束backup_type = incrementalfrom_lsn = 1602789to_lsn = 1603652last_lsn = 1603652compact = 0recover_binlog_info = 0

# 好了,這就是增量備份了,可以發現:對於 MyISAM 來說全部是全量備份,並且根本沒有什麼 --databases 一說。

# 增備指令碼

四、innobackupex 增備恢複

shell > /etc/init.d/mysql.server stop  # 關閉資料庫shell > cd /data/backup_dbshell > mv /usr/local/mysql-5.5.52/data data.old02  # 備份原有資料庫shell > innobackupex --apply-log --redo-only test_incre  # 指定全備目錄,--redo-only 對已提交的事務進行前滾,僅最後一次增備恢複不需要添加該參數shell > innobackupex --apply-log --redo-only test_incre --incremental-dir=/data/backup_db/test_incre01  # --incremental-dir 指定第一次增備目錄 ( 絕對路徑 )shell > innobackupex --apply-log test_incre --incremental-dir=/data/backup_db/test_incre02  # 指定第二次增備目錄,最後一次增備還原不需要添加 --redo-only 參數shell > innobackupex --copy-back test_incre  # 最後一步,複製整合後的全備檔案,位置為 my.cnf 中 datadir 指定路徑shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/datashell > /etc/init.d/mysql.server start  # 啟動資料庫,查看資料是否恢複shell > mysql -uuser -ppassword -Amysql> select * from test_incre.incre;+----+----------------+| id | name           |+----+----------------+|  1 | Wang XiaoQiang ||  2 | Xiao GuaiShou  ||  3 | King           |+----+----------------+

# OK,木有問題!

Innobackupex MySQL 全備、增備及恢複

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.