標籤:mysql
MySQL備份還原總結
在對Database Backup的時候如果出現Operating system error number 24 in a file operation.這樣的錯誤說明開啟的檔案太多。
解決方案ulimit -n 1048576
然後在進行對資料庫的備份即可
1、介紹
所用的工具為xtrbackup該工具是由perconan公司提供的開源的而且功能非常強大。這也是世界上惟一一款開源的能夠對innodb和xtradb資料庫進行熱備的工具。特點:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁碟空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
對InnoDB儲存引擎實現熱備而對於MyISAM儲存引擎只能實現溫備份
2、安裝
其最新版的軟體可從 http://www.percona.com/software/percona-xtrabackup/ 獲得。
yum intall --percona-xtrabackup-2.2.5-5027.el7.x86_64.rpm
檢查產生的檔案
rpm -ql percona-xtrabackup
/usr/bin/innobackupex//實現備份還原的命令
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-2.2.5
/usr/share/doc/percona-xtrabackup-2.2.5/COPYING
3、完全備份
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/(備份到哪裡)
如果要使用一個最小許可權的使用者進行備份,則可基於如下命令建立此類使用者:
mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關檔案(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關檔案,同時還會備份觸發器和資料庫配置資訊相關的檔案。這些檔案會被儲存至一個以時間命令的目錄中。
(1)xtrabackup_binlog_info —— mysql伺服器當前正在使用的二進位記錄檔及至備份這一刻為止二進位日誌事件的位置。
(2)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(記錄序號)範圍資訊;
4、準備(prepare)一個完全備份
一般情況下,在備份完成後,資料尚且不能用於恢複操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”的主要作用正是通過復原未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態。
nnobakupex命令的--apply-log選項可用於實現上述功能。如下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
在實現“準備”的過程中,innobackupex通常還可以使用--use-memory選項來指定其可以使用的記憶體的大小,預設通常為100M。如果有足夠的記憶體可用,可以多劃分一些記憶體給prepare的過程,以提高其完成速度。
5、從一個完全備份中恢複資料
innobackupex命令的--copy-back選項用於執行恢複操作,其通過複製所有資料相關的檔案至mysql伺服器DATADIR目錄中來執行恢複過程。innobackupex通過backup-my.cnf來擷取DATADIR目錄的相關資訊。
# innobackupex --copy-back /path/to/BACKUP-DIR
請確保如上資訊的最行一行出現“innobackupex: completed OK!”。
當資料恢複至DATADIR目錄以後,還需要確保所有資料檔案的屬主和屬組均為正確的使用者,如mysql,否則,在啟動mysqld之前還需要事先修改資料檔案的屬主和屬組。如:
# chown -R mysql:mysql /data/mysql/
6、使用innobackupex進行增量備份
每個InnoDB的頁面都會包含一個LSN資訊,每當相關的資料發生改變,相關的頁面的LSN就會自動成長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之後發生改變的頁面來實現。
要實現第一次增量備份,可以使用下面的命令進行:
# innobackupex --incremental /export/increment --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束後,innobackupex命令會在/export/increment目錄中建立一個新的以時間命名的目錄以存放所有的增量備份資料。另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
需要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。
“準備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份資料將合并到完全備份上。
(2)基於所有的備份將未提交的事務進行“復原”。
於是,操作就變成了:
# innobackupex --apply-log --redo-only BASE-DIR
接著執行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而後是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作;
7、恢複資料和完全備份的一樣只要準備做好了就可以了
innobackupex命令的--copy-back選項用於執行恢複操作,其通過複製所有資料相關的檔案至mysql伺服器DATADIR目錄中來執行恢複過程。innobackupex通過backup-my.cnf來擷取DATADIR目錄的相關資訊。
# innobackupex --copy-back /path/to/BACKUP-DIR
請確保如上資訊的最行一行出現“innobackupex: completed OK!”。
當資料恢複至DATADIR目錄以後,還需要確保所有資料檔案的屬主和屬組均為正確的使用者,如mysql,否則,在啟動mysqld之前還需要事先修改資料檔案的屬主和屬組。如:
# chown -R mysql:mysql /data/mysql/
下面是兩個備份的指令碼
完全備份指令碼
fullbackup.sh
#!/bin/bash
#Implement a full backup of the MySQL database
#user:[email protected]
#
#
ulimit -n 1048576
name=`/usr/bin/ls -ln /export/oldbackup/ | /usr/bin/tail -n 1 | /usr/bin/awk {print‘$9‘}`
nameu=`/usr/bin/basename /export/oldbackup/$name`
user=encompass
password=aniu7436
backupdir=/export/backup
num=`/usr/bin/ls -l /export/backup | /usr/bin/wc -l`
/bin/mysql -u$user -p$password -e "flush logs;"
/bin/echo "0" > /tmp/test.yon
/usr/bin/innobackupex --user=$user --password=$password $backupdir && /bin/echo "1" > /tmp/test.yon && /bin/echo "To complete a full backup at `/bin/date`" >> /tmp/my.txt
if [ `cat /tmp/test.yon` -eq 1 ] && [ $num -eq 3 ]; then
headname=`/usr/bin/ls -ln /export/backup/ | /usr/bin/head -n 2 | /bin/grep - | /usr/bin/awk {print‘$9‘}`
/usr/bin/rm -rf /export/backup/$headname
fi
增量備份指令碼
incrementalbackup.sh
#!/bin/bash
#Realize incremental backup for the MySQL database
#[email protected]
ulimit -n 1048576
dirnum=`/usr/bin/ls -l /export/backup | /usr/bin/wc -l`
if [ `cat /tmp/test.yon` -eq 0 ] || [ $dirnum -eq 1 ]; then
exit;
fi
incrementaldir=/export/incremental/
username=encompass
passwd=aniu7436
name=`/usr/bin/ls -ln /export/backup/ | /usr/bin/tail -n 1 | /usr/bin/awk {print‘$9‘}`
nameincremental=`/usr/bin/ls -ln /export/incremental/$name | /usr/bin/tail -n 1 | /usr/bin/awk {print‘$9‘}`
num=`/usr/bin/ls -l /export/incremental/$name | /usr/bin/wc -l`
count=`/usr/bin/ls -l /export/incremental/ | /usr/bin/wc -l`
/bin/mysql -u$username -p$passwd -e "flush logs;"
/bin/echo "0" > /tmp/test.yon
if [ $num -lt 2 ]; then
/bin/echo "111111111111111111111111111"
/usr/bin/mkdir $incrementaldir$name
/usr/bin/innobackupex --user=$username --password=$passwd --incremental $incrementaldir$name --incremental-basedir=/export/backup/$name && /bin/echo "1" > /tmp/test.yon && /bin/echo "To complete a incremental backup at `date`" >> /tmp/my.txt
if [ $? -ne 0 ]; then
names=`/usr/bin/ls -ln /export/incremental/$name | /usr/bin/tail -n 1 | /usr/bin/awk {print‘$9‘}`
/usr/bin/rm -rf /export/incremental/$name/$names && /bin/echo "1" > /tmp/test.yon
fi
else
/bin/echo "222222222222222222222222222"
/usr/bin/innobackupex --user=$username --password=$passwd --incremental $incrementaldir$name --incremental-basedir=$incrementaldir$name/$nameincremental && /bin/echo "1" > /tmp/test.yon && /bin/echo "To complete a incremental backup at `date`" >> /tmp/my.txt
if [ $? -ne 0 ]; then
names=`/usr/bin/ls -ln /export/incremental/$name | /usr/bin/tail -n 1 | /usr/bin/awk {print‘$9‘}`
/usr/bin/rm -rf /export/incremental/$name/$names && /bin/echo "1" > /tmp/test.yon
fi
fi
if [ `cat /tmp/test.yon` -eq 1 ] && [ $count -eq 3 ]; then
headname=`/usr/bin/ls -ln $incrementaldir | /usr/bin/head -n 2 | /bin/grep - | /usr/bin/awk {print‘$9‘}`
/usr/bin/rm -rf $incrementaldir$headname
fi
基於xtrbackup對mysql的備份還原