mysqlビッグデータ量とマルチストレージエンジンシーンでの完全+インクリメンタル自動オフサイトバックアップの信頼性


仮想シーン:データベースMysql 5.1.X、すでに“マスター-従”をして、その中の1台はライブラリからバックアップして、マスターライブラリはバックアップを実行しないで、ライブラリから停止しないで、マスターはデータの異なる時間の差からできるだけ短くて、バックアップの中でslave情報(マスターライブラリのバイナリのログ名と位置)があって、マスターライブラリを停止しない情況の下で、新しいマスター-従、あるいはいつでもある時点まで回復することができます.MyISAMとInnoDBは存在し、バックアップはデータの一貫性を保証します.
以上のシナリオに基づいて、innobackupex+bash shellを採用し、自動完全+増分バックアップを実現し、自動メール通知とFTPアップロードを実現し、ローカルとオフサイトのバックアップスクロールを実現した.
スクリプトには、参照用に注釈されたバックアップ方法もあります.
ダウンロードパッケージ、ここで私は2制パッケージをダウンロードしました
wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/binary/Linux/x86_64/percona-xtrabackup-2.0.4-484.tar.gz
コマンドを/usr/binにコピーすればいい
スクリプトの大まかな考え方:日単位で、最初の実行は完全なバックアップであり、次回はインクリメンタルバックアップを行い、最近のデータにリカバリするにはすべてのインクリメンタルバックアップをリカバリする必要があります.フル・バックアップに失敗した場合は、当日のバックアップ・ディレクトリを削除してから開始します.スクリプトはlsnを判断するので.txtファイルが存在するかどうかは、今回のフルバックアップかインクリメンタルバックアップかを決定します.
 
スクリプトを紹介する前に、まずInnodbストレージエンジンのホットスペアについてお話しします.
Innodbストレージエンジンは、トランザクションストレージエンジンであるため、redoログと関連するundo情報があり、データの整合性と完全性に対する要求もMyISAMよりも厳格であるため、Innodbのオンライン(ホット)物理バックアップはMyISAMよりも複雑である.例えば、バックアップのデータ整合性、バックアップMYSQLへの影響、キャッシュの汚染、CPU、ディスクI/Oとネットワークの圧力、リカバリの難しさ、時間とリカバリの仕方など、一般的には簡単にいくつかの手動コマンドで完了することは難しく、ほとんどは専門のInnodbオンライン物理バックアップソフトウェアで完了します.
 
今は良いソフトウェアがあります.
1つはオープンソースです.
http://www.percona.com/software/percona-xtrabackup
innobackupexとxtrabackup
innobackupexはperlスクリプトの集合であり、すべてのストレージエンジンをバックアップし、xtrabackupを呼び出すデータの一貫性を保証します.
xtrabackupはC言語で作成されたプログラムで、innodbとxtrdbストレージエンジンのテーブルしかバックアップできません.
 
一つはMySQL公式に有料企業版に統合された
http://www.innodb.com/products/hot-backup/
公式ドキュメント:http://dev.mysql.com/doc/mysql-enterprise-backup/3.5/en/index.html
mysqlbackupとibbackup
mysqlbackupはC言語で作成されたプログラムで、すべてのストレージエンジンをバックアップし、データの一貫性を保証し、ibbackupを呼び出すコマンドです.
ibbackupはinnodbとストレージエンジンのテーブルのみをバックアップできます
またinnobackupは、以前www.innodb.comが作ったperlコマンドの集合です.
少なくともmysqlbackup 3.5パッケージでは、innobackupコマンドとibbackupコマンドがmysqlbackupコマンドにソフトリンクされ、innobackupコマンドとibbackupコマンドが将来代替される可能性が高い.
 
innobackupexインストール構成と使用
公式サイトで相応のバージョンのパケットをダウンロードして、バイナリパケット、RPMパケット、ソースパケットはすべてできます.テストの結果、インストールプロセスに多くの問題が発生しやすいため、ソースパッケージのインストールが非常に面倒であることが分かった.直接バイナリパッケージをダウンロードして使用することをお勧めします.PATHを設定するか、/usr/binにコピーして使用できます.
権限構成の説明:
RELOAD and LOCK TABLES (unless the --no-lock option is specified) in order to FLUSH TABLES WITH
READ LOCK prior to start copying the files and
REPLICATION CLIENT in order to obtain the binary log position,
CREATE TABLESPACE in order to import tables (see Importing and Exporting Individual Tables) and
SUPER in order to start/stop the slave threads in a replication environment.
 
mysql>
CREATE USER 'bakuser'@'localhost' IDENTIFIED BY 'pass';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bakuser'@'localhost';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,SUPER ON *.* TO 'bakuser'@'pass';
FLUSH PRIVILEGES;
または、
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,SUPER ON *.* TO 'bakuser'@'localhost' IDENTIFIED BY 'pass';
FLUSH PRIVILEGES;
注意、socketでmysqlを接続するのは実際にはroot@localhost授権すれば十分です.
 
例:
コマンドを個別に実行して成功した例を次に示します.
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=2 --slave-info --safe-slave-backup --use-memory=200MB/opt/data_bak/mysql_bak
フル・バックアップ後の最初のインクリメンタル・バックアップ:
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=2 --slave-info --safe-slave-backup --use-memory=200MB --incremental --incremental-basedir=BASEDIR/opt/data_bak/mysql_bak
最近のフル・バックアップ後、2回目、3回目のインクリメンタル・バックアップ:
またはディレクトリベース
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=2 --slave-info --safe-slave-backup --use-memory=200MB --incremental --incremental-basedir=BASEDIR/opt/data_bak/mysql_bak
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=2 --slave-info --safe-slave-backup --use-memory=200MB --incremental --incremental-basedir=incrementaldir1/opt/data_bak/mysql_bak
またはログベースLSN
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=2 --slave-info --safe-slave-backup --use-memory=200MB --incremental --incremental-lsn=0:173917517/opt/data_bak/mysql_bak
innobackupex --socket=/opt/mysql/var/mysql.sock --user=bakuser --password=pass --defaults-file=/opt/mysql/my.cnf --throttle=10 --slave-info --safe-slave-backup --use-memory=200MB --incremental --incremental-lsn=0:173918957/opt/data_bak/mysql_bak
 
リカバリ:
フル・バックアップへのインクリメンタルのマージ
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex--apply-log BASE-DIR--incremental-dir=INCREMENTAL-DIR-2これが最後の、つまり最新の増分です
innobackupex --apply-log BASE-DIR
データ・ディレクトリへのリカバリ
詳細:http://www.percona.com/software/percona-xtrabackup
スクリプトの内容:
スクリプトを自分の実際のシーンに合うように修正するには、ほとんど変数設定部分を修正するだけで、変数設定が正しくなく、スクリプトの実行がエラーを報告し、スクリプトのログとinnobackupexを通過する.ロゴは、MYSQLのプロファイルパス(my.cnfではdatadirやinnodbなどの設定が必要であることを覚えておく)、権限、ローカルバックアップディレクトリ、FTPディレクトリなど、理由を再三チェックすることができます.
#!/bin/bash 
#History 
###################################################### 
#update       author 
#2012/10/15   zhaoyn   create 
#2012/10/22   zhaoyn   add ftp 
#2012/11/28   zhaoyn   add mysqlhotcopy 
#2012/12/05   zhaoyn   Improve function 
#2012/12/12   zhaoyn   Backup of stored procedures and events 
#2012/12/24   zhaoyn   Increase the log output 
#2013/01/09-11   zhaoyn   Various physical storage engine hot backup, InnoDB incremental backup command 
#Note: use hot backup script, may also need some other pre-configured. 
# wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/binary/Linux/x86_64/percona-xtrabackup-2.0.4-484.tar.gz 
# http://dev.mysql.com/doc/mysql-enterprise-backup/3.5/en/index.html 
# 30 */2 * * * root /root/sh/backup_mysql.sh >> backup_mysql.log 2>&1 
###################################################### 
 
########## variable ####################################### 
### base config ### 
backupdir=/data_bak/mysql_bak/innobackupex 
#mysqlhost="127.0.0.1" 
#mysqlport="3306" 
mysqlsocket="/opt/mysql/var/mysql.sock" 
mysqldbname="dbname" 
mysqluser="root" 
mysqlpw="pass" 
 
### hotcopy ### 
hc_mysqluser="bakuser" 
hc_mysqlpw="pass" 
mysqlconfig="/opt/mysql/my.cnf" 
iops=8000    # This option specifies a number of I/O operations (pairs of read+write) per second. 
incr="yes"   # yes or no, to turn on or off the daily incremental backups 
 
### ftp ### 
ftpip='1.2.3.4' 
ftpport='21' 
ftpuser='backup' 
ftppw='pass' 
ftpbackupdir="innobackupex" 
ftpsw="yes"  # To turn on or off the FTP upload 
ftpdeldate=$(date -d "15 days ago" +%Y%m%d) 
 
### mail ### 
servername="dbserver" 
mailfromadd='dbserver' 
mailtoadd='user1' 
#mailccadd='user2' 
 
### lang path time ### 
export LANG=C 
export LC_ALL=C 
export PATH=/opt/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
datetime=$(date +%Y%m%d-%H%M) 
todaydate=$(date +%Y%m%d) 
deldate=$(date -d "7 days ago" +%Y%m%d) 
 
 
####### function ####################################### 
function mailto() { 
# mail 
/usr/sbin/sendmail -t < "$mysqldbname"_mysqldump_${datetime}.sql 
 
#echo "`date` Begin to compress." 
#tar czpf "$mysqldbname"_mysqldump_${datetime}.tar.gz "$mysqldbname"_mysqldump_${datetime}.sql 
#sync;sleep 2;sync;sleep 2 
#rm -f "$mysqldbname"_mysqldump_${datetime}.sql 
 
 
####### physical cold backup #################################### 
#/etc/rc.d/init.d/mysqld stop 
#sleep 2s ;sync;sync 
#echo "`date` Begin to compress." 
#tar -czvpf mysql_${datetime}.tar.gz /etc/my.cnf /opt/mysql/var 
#/etc/rc.d/init.d/mysqld start 
 
 
####### physical hot backup #################################### 
 
### 1. unix/linux, only myisam, mysqlhotcopy ### 
#mysqlhotcopy -S "$mysqlsocket" -u "$mysqluser" -p "$mysqlpw" "$mysqldbname" --flushlog ./ 
#sync;sleep 2;sync;sleep 2 
#mv "$mysqldbname" "$mysqldbname"_mysqlhotcopy_${datetime} 
 
#mysqldump -S"$mysqlsocket" -u$mysqluser -p$mysqlpw --opt --routines --default-character-set=utf8 \ 
#--quote-names --force --no-data "$mysqldbname" > "$mysqldbname"_mysqldump_structure-func_${datetime}.sql 
 
#echo "`date` Begin to compress." 
#tar czpf "$mysqldbname"_mysqlhotcopy_${datetime}.tar.gz \ 
#"$mysqldbname"_mysqlhotcopy_${datetime} "$mysqldbname"_mysqldump_structure-func_${datetime}.sql 
#sync;sleep 2;sync;sleep 2 
#rm -rf "$mysqldbname"_mysqlhotcopy_${datetime} "$mysqldbname"_mysqldump_structure-func_${datetime}.sql 
 
 
### 2. unix/linux, any storage engine, innobackupex, all databases ### 
test -e "$todaydate" || mkdir "$todaydate" 
cd "$todaydate" 
i=0 
if [ ! -f lsn.txt ]; then 
    echo "`date` Start full backup." 
    # fullbackup 
    innobackupex --socket="$mysqlsocket" --user="$mysqluser" --password="$mysqlpw" --defaults-file="$mysqlconfig" \ 
    --throttle="$iops" --slave-info --safe-slave-backup --use-memory=200MB --no-timestamp "$datetime"_fullbackup >> \ 
    innobackupex.log 2>&1 
 
    grep "last_lsn" "$datetime"_fullbackup/xtrabackup_checkpoints | awk -F[" "] '{print $3}' >> lsn.txt 
 
    mysqldump -S"$mysqlsocket" -u$mysqluser -p$mysqlpw --opt --routines --default-character-set=utf8 --quote-names \ 
    --force --no-data "$mysqldbname" > "$datetime"_fullbackup/"$mysqldbname"_mysqldump_structure-func_${datetime}.sql 
    sync;sleep 2;sync;sleep 2 
    tar czpf "$datetime"_"$mysqldbname"_fullbackup.tar.gz "$datetime"_fullbackup 
    rm -rf "$datetime"_fullbackup 
    i=1 
fi 
 
last_lsn=`tail -1 lsn.txt` 
teststring=`tail -1 innobackupex.log | awk -F': ' '{print $(NF-0)}'` 
 
if [ "$last_lsn" == "" ] && [ "$i" -eq 0 ] && [ "$incr" == "yes" ]; then 
    echo "`date` Did not get to last_lsn, cancel incremental backup, exit." 
    mailto3 
    exit 1 
elif [ "$teststring" != 'completed OK!' ] && [ "$i" -eq 0 ] && [ "$incr" == "yes" ]; then 
    echo "`date` Last backup was not successful, cancel incremental backup, exit." 
    mailto3 
    exit 1 
elif [ "$teststring" == 'completed OK!' ] && [ "$i" -eq 0 ] && [ "$incr" == "yes" ]; then 
    # incremental backup 
    innobackupex --socket="$mysqlsocket" --user="$mysqluser" --password="$mysqlpw" --defaults-file="$mysqlconfig" \ 
    --throttle="$iops" --slave-info --safe-slave-backup --use-memory=200MB --no-timestamp \ 
    --incremental --incremental-lsn="$last_lsn" "$datetime"_incremental >> innobackupex.log 2>&1 
 
    grep "last_lsn" "$datetime"_incremental/xtrabackup_checkpoints | awk -F[" "] '{print $3}' >> lsn.txt 
 
    mysqldump -S"$mysqlsocket" -u$mysqluser -p$mysqlpw --opt --routines --default-character-set=utf8 --quote-names \ 
    --force --no-data "$mysqldbname" > "$datetime"_incremental/"$mysqldbname"_mysqldump_structure-func_${datetime}.sql 
    sync;sleep 2;sync;sleep 2 
    tar czpf "$datetime"_"$mysqldbname"_incremental.tar.gz "$datetime"_incremental 
    rm -rf "$datetime"_incremental 
fi 
 
teststring=`tail -1 innobackupex.log | awk -F': ' '{print $(NF-0)}'` 
if [ "$teststring" != 'completed OK!' ]; then 
    echo "`date` The backup failed, exit." 
    mailto3 
    exit 1 
elif [ "$teststring" == 'completed OK!' ] && [ "$i" -eq 1 ]; then 
    echo "`date` The full backup was successful." 
    mailto2 
fi 
 
### 3. cross-platform, any storage engine, mysqlbackup, all databases ### 
#mysqlbackup --socket="$mysqlsocket" --user=$mysqluser --password="$mysqlpw" --default-character-set=utf8 \ 
#--compress-level=1 --sleep=30 --with-timestamp backup --backup-dir=./ 
 
 
####### FTP backup #################################### 
if [ "$ftpsw" == 'yes' ] && [ "$ftpdeldate" -gt 20120901 ]; then 
echo "`date` Start uploading to offsite." 
ftp -v -n -i < 
  



innobackupex , ,MYSQL , , 。

mysqldump :

#!/bin/bash 
#History 
###################################################### 
#update       author 
#2012/10/15   zhaoyn   create 
#2012/10/22   zhaoyn   add ftp 
#2012/11/28   zhaoyn   add mysqlhotcopy 
#2012/12/05   zhaoyn   Improve function 
#2012/12/12   zhaoyn   Backup of stored procedures and events 
#2012/12/24   zhaoyn   Increase the log output 
 
# 30 4 * * * root /root/sh/backup_mysqldump.sh >> backup_mysqldump.log 2>&1 
###################################################### 
 
########## variable ####################################### 
### base config ### 
backupdir=/opt/data_bak/mysql_bak/mysqldump 
#mysqlhost="127.0.0.1" 
#mysqlport="3307" 
mysqlsocket="/opt/mysql/var/mysql.sock" 
mysqlbinpath="/opt/mysql/bin" 
mysqldbname="dbname" 
mysqluser="root" 
mysqlpw="pass" 
 
### ftp ### 
ftpip='1.2.3.4' 
ftpport='10021' 
ftpuser='backup' 
ftppw='pass' 
ftpbackupdir="backup_db/mysqldump" 
ftpsw="yes"  # To turn on or off the FTP upload 
 
### mail ### 
servername="dbname" 
mailfromadd='dbname' 
mailtoadd='user1' 
#mailccadd='user2' 
 
### lang path time ### 
export LANG=C 
export LC_ALL=C 
export PATH="$mysqlbinpath":/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
datetime=$(date +%Y%m%d-%H%M) 
todaydate=$(date +%Y%m%d) 
ftpdeldate=$(date -d "35 days ago" +%Y%m%d) 
deldate=$(date -d "15 days ago" +%Y%m%d) 
deldays=15 
 
 
####### function ####################################### 
function mailto() { 
# mail 
/usr/sbin/sendmail -t < "$mysqldbname"_mysqldump_${datetime}.sql.gz 
sync;sleep 2;sync;sleep 2 
 
mysqldump -S"$mysqlsocket" -u$mysqluser -p$mysqlpw --opt --routines --triggers \ 
--default-character-set=utf8 --quote-names --force --no-data \ 
"$mysqldbname" | gzip > "$mysqldbname"_mysqldump_structure_${datetime}.sql.gz 
sync;sleep 2;sync;sleep 2 
 
if [ -s "$mysqldbname"_mysqldump_${datetime}.sql.gz ] && [ -s "$mysqldbname"_mysqldump_structure_${datetime}.sql.gz ]; then 
    echo "`date` mysqldump completed." 
    mailto2 
else 
    echo "`date` The backup file does not exist, or the size is zero, exit" 
    mailto3 
    exit 1 
fi 
 
####### FTP backup #################################### 
if [ "$ftpsw" == 'yes' ] && [ "$ftpdeldate" -gt 20120901 ]; then 
echo "`date` Start uploading to offsite." 
ftp -v -n -i < 
  


http://www.zhaoyanan.cn/mysql-innobackupex.html

http://www.zhaoyanan.cn/mysql-mysqldump-auto.html