這幾天一直在研究mysql備份這一塊,前幾天由于手誤對線上生產(chǎn)數(shù)據(jù)庫造成誤操作,雖然沒有太大影響,但是為了把風(fēng)險度降到最低,因此最近一直在倒騰mysql的在線熱備份,在線熱備份有免費開源的,也收費的產(chǎn)品,在這里我們值討論免費的產(chǎn)品,支持熱備的的軟件mysqlLVM以及接下來的這款Xtrabackup;Xtrabackup是由percona開發(fā)的一個開源軟件,它是innodb熱備工具ibbackup(收費的商業(yè)軟件)的一個開源替代品。Xtrabackup由個部分組成:xtrabackup和innobackupex,其中xtrabackup工具用于備份innodb和 xtraDB引擎的表;而innobackupex工具用于備份myisam和innodb引擎的表,本文將介紹如何用innobackupex工具做全量和增量備份。 一、安裝解壓 1.安裝數(shù)據(jù)庫 官網(wǎng):http://www.percona.com 下載地址:http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz yum -y install mysql mysql-libs mysql-server MySQL-python 2.創(chuàng)建數(shù)據(jù)庫 create database dotatest; mysql -uroot -p dotatest > zhan_data.sql python mysql_update.py --host localhost --user root --passwd "" --db dotatest use dotatest; show tables; desc item; insert into item (player, item, count) values (1, 1, 1 ); 插入一條數(shù)據(jù) insert into item (player, item, count) values (2, 2, 2 ); select * from item; 3.安裝依賴包(如果安裝新版本需要安裝) yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt libgcrypt-devel perl-Time-HiRes [root@localhost home]# tar xf percona-xtrabackup-2.0.8-587.tar.gz [root@localhost home]# mysql --version mysql Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1 [root@localhost percona-xtrabackup-2.0.8]# pwd /home/percona-xtrabackup-2.0.8 [root@localhost percona-xtrabackup-2.0.8]# cp bin/ innobackupex xbstream xtrabackup_51 xtrabackup_56 innobackupex-1.5.1 xtrabackup xtrabackup_55 [root@localhost percona-xtrabackup-2.0.8]# cp bin/innobackupex /usr/bin/ [root@localhost percona-xtrabackup-2.0.8]# cp bin/xtrabackup* /usr/bin/ 二、常規(guī)備份文件以及對單個數(shù)據(jù)庫備份 備份全部數(shù)據(jù)庫 [root@localhost /]# mkdir /home/data/backup/ [root@localhost /]# innobackupex --defaults-file=/etc/my.cnf --user=root /home/data/backup/ --defaults-file 指定mysql的配置文件 --user 指定用戶 /home/data/backup/ 備份文件的路徑 需要注意的是 如果不指定--defaults-file 默認(rèn)會讀取/etc/my.cnf。如果你的配置文件是自定義的,那么一定要指定目錄,然后會在目錄下創(chuàng)建一個時間戳的目錄(我們本次創(chuàng)建的/home/data/backup/2014-03-11_11-08-23) 查看備份是否成功 [root@localhost /]# cd /home/data/backup/2014-03-11_11-08-23/ [root@localhost 2014-03-11_11-08-23]# pwd /home/data/backup/2014-03-11_11-08-23 [root@localhost 2014-03-11_11-08-23]# ls backup-my.cnf ibdata1 test xtrabackup_binlog_info xtrabackup_logfile dotatest mysql xtrabackup_binary xtrabackup_checkpoints zabbix [root@localhost 2014-03-11_11-08-23]# 只針對一個數(shù)據(jù)庫備份 --database 是指定需要備份的數(shù)據(jù)庫 [root@localhost ~]# innobackupex --user=root --defaults-file=/etc/my.cnf --database=dotatest /home/data/backup/ 三、常規(guī)恢復(fù)數(shù)據(jù)庫 恢復(fù)之前先停止數(shù)據(jù)庫,并且要刪除數(shù)據(jù)和日志文件 01.首先停止數(shù)據(jù)庫 [root@localhost 2014-03-11_16-52-44]# /etc/rc.d/init.d/mysqld stop Stopping mysqld: [ OK ] [root@localhost 2014-03-11_16-52-44]# 02.備份刪除mysql文件 [root@localhost lib]# cp -a mysql/ mysql.bak [root@localhost lib]# ls alternatives dav dhclient games misc mysql nfs plymouth postfix random-seed rpm stateles authconfig dbus fprint logrotate.status mlocate mysql.bak ntp polkit-1 prelink readahead rsyslog udev [root@localhost lib]# cd mysql [root@localhost mysql]# ls dotatest ibdata1 ib_logfile0 ib_logfile1 mysql test zabbix [root@localhost mysql]# rm -rf * 03.來恢復(fù)文件 恢復(fù)文件分兩步, 第1步是apply-log,為了加快速度,一般建議設(shè)置--use-memory,這個步驟完成之后,目錄/backup/mysql/data/2013-10-29_09-05-25下的備份文件已經(jīng)準(zhǔn)備就緒。 因為我們的文件比較少,因此我們不需要設(shè)置--user-memory產(chǎn)數(shù)文件 第2步是copy-back,即把備份文件拷貝至原數(shù)據(jù)目錄下。 [root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /home/data/backup/2014-03-11_16-52-44/ [root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/data/backup/2014-03-11_16-52-44/ 04.修改權(quán)限 啟動服務(wù) [root@localhost lib]# chown mysql:mysql /var/lib/mysql/ -R [root@localhost lib]# /etc/rc.d/init.d/mysqld start Starting mysqld: [ OK ] [root@localhost lib]# 四、配置增量備份 增量備份及其恢復(fù) 注意:innobackupex 增量備份僅針對InnoDB這類支持事務(wù)的引擎,對于MyISAM等引擎,則仍然是全備。 01.首先在數(shù)據(jù)庫插入一條數(shù)據(jù) mysql> use dotatest; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from item; +----+--------+------+-------+ | id | player | item | count | +----+--------+------+-------+ | 1 | 1 | 1 | 1 | | 2 | 2 | 2 | 2 | +----+--------+------+-------+ 2 rows in set (0.00 sec) mysql> insert into item (player, item, count) values (3, 3, 3 ); Query OK, 1 row affected (0.00 sec) mysql> select * from item; +----+--------+------+-------+ | id | player | item | count | +----+--------+------+-------+ | 1 | 1 | 1 | 1 | | 2 | 2 | 2 | 2 | | 3 | 3 | 3 | 3 | +----+--------+------+-------+ 3 rows in set (0.00 sec) mysql> 02.增量備份是基于一個數(shù)據(jù)庫的全部備份文件的,在剛才我們備份了一個全備份,我們現(xiàn)在的增量備份就基于剛才的全部備份來做(2014-03-11_16-52-44) 需要注意如下兩個參數(shù): --incremental-basedir指向全備目錄; --incremental指向增量備份的目錄; [root@localhost backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/2014-03-11_16-52-44/ --incremental /home/data/backup/ ……略…… innobackupex: Backup created in directory '/home/data/backup/2014-03-11_17-33-57' innobackupex: MySQL binlog position: filename '', position 140311 17:34:16 innobackupex: completed OK! 03.查看是否有備份文件,最新的配置文件就是我們剛才的增量備份文件 [root@localhost backup]# pwd /home/data/backup [root@localhost backup]# ls 2014-03-11_16-52-44 2014-03-11_17-33-57 [root@localhost backup]# 在如下的文件中我們可以發(fā)現(xiàn)增量備份的文件from_lsn剛好等于全部備份的to_lsn [root@localhost 2014-03-11_17-33-57]# cat xtrabackup_checkpoints 增量備份文件 backup_type = incremental from_lsn = 657645 to_lsn = 659090 last_lsn = 659090 [root@localhost 2014-03-11_17-33-57]# cat ../2014-03-11_16-52-44/xtrabackup_checkpoints 全局備份 backup_type = full-prepared from_lsn = 0 to_lsn = 657645 last_lsn = 657645 [root@localhost 2014-03-11_17-33-57]# 五、在增量備份的基礎(chǔ)上再做增量備份 在備份之前我們在item表中再插入數(shù)據(jù) mysql> insert into item (player, item, count) values (4, 4, 4 ); Query OK, 1 row affected (0.03 sec) mysql> select * from item; +----+--------+------+-------+ | id | player | item | count | +----+--------+------+-------+ | 1 | 1 | 1 | 1 | | 2 | 2 | 2 | 2 | | 3 | 3 | 3 | 3 | | 4 | 4 | 4 | 4 | +----+--------+------+-------+ 4 rows in set (0.00 sec) mysql> 在增量備份的基礎(chǔ)上再做增量備份,我們需要添加如下參數(shù) --incremental-basedir 如下備份: [root@localhost 2014-03-11_17-33-57]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/2014-03-11_17-33-57/ --incremental /home/data/backup/ ………中間部分略……… innobackupex: Backup created in directory '/home/data/backup/2014-03-11_18-03-54' innobackupex: MySQL binlog position: filename '', position 140311 18:04:13 innobackupex: completed OK! innobackupex: Backup created in directory '/home/data/backup/2014-03-11_18-10-13' innobackupex: MySQL binlog position: filename '', position 140311 18:10:31 innobackupex: completed OK! 然后來查看lsn號來: [root@localhost 2014-03-11_18-10-13]# cat xtrabackup_checkpoints backup_type = incremental from_lsn = 659090 to_lsn = 659214 last_lsn = 659090 [root@localhost 2014-03-11_18-10-13]# cat ../2014-03-11_17-33-57/ backup-my.cnf ibdata1.meta xtrabackup_binary xtrabackup_logfile dotatest/ mysql/ xtrabackup_binlog_info zabbix/ ibdata1.delta test/ xtrabackup_checkpoints [root@localhost 2014-03-11_18-10-13]# cat ../2014-03-11_17-33-57/xtrabackup_checkpoints backup_type = incremental from_lsn = 657645 to_lsn = 659090 last_lsn = 659090 [root@localhost 2014-03-11_18-10-13]# 六、恢復(fù)增量數(shù)據(jù)庫 停止數(shù)據(jù)庫 [root@localhost backup]# /etc/rc.d/init.d/mysqld stop Stopping mysqld: [ OK ] [root@localhost backup]# 備份數(shù)據(jù)庫 [root@localhost lib]# mv mysql mysql.bak.2 [root@localhost lib]# pwd /var/lib [root@localhost lib]# 這個恢復(fù)比恢復(fù)全部備份稍微復(fù)雜點,接下來我們來恢復(fù),如果有多個增量備份,需要疊加就可以 innobackupex --apply-log --redo-only BASE-DIR BASE-DIR指完整的全部備份目錄 innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 INCREMENTAL-DIR-1指第一次增量備份的目錄 innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 BASE-DIR指完整的全部備份目錄 INCREMENTAL-DIR-2第二次增量備份的目錄 01.在我們的環(huán)境中我們來執(zhí)行如下操作,因為我們只有兩次的增量備份如下即可: innobackupex --apply-log --redo-only /home/data/backup/2014-03-11_16-52-44/ innobackupex --apply-log --redo-only /home/data/backup/2014-03-11_16-52-44 --incremental-dir=/home/data/backup/2014-03-11_17-33-57/ innobackupex --apply-log /home/data/backup/2014-03-11_16-52-44/ --incremental-dir=/home/data/backup/2014-03-11_18-10-13/ 02.回滾未完成的日志(需要注意的是恢復(fù)的時候,我們只恢復(fù)全備份文件就可以了) innobackupex --apply-log /home/data/backup/2014-03-11_16-52-44/ innobackupex --copy-back /home/data/backup/2014-03-11_16-52-44/ 03.授權(quán)啟動 [root@localhost lib]# chown mysql:mysql /var/lib/mysql -R [root@localhost lib]# /etc/rc.d/init.d/mysqld start Starting mysqld: [ OK ] [root@localhost lib]# 04.檢查備份是否回來 mysql> use dotatest; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from item; +----+--------+------+-------+ | id | player | item | count | +----+--------+------+-------+ | 1 | 1 | 1 | 1 | | 2 | 2 | 2 | 2 | | 3 | 3 | 3 | 3 | | 4 | 4 | 4 | 4 | +----+--------+------+-------+ 4 rows in set (0.00 sec) mysql> |
|