网上关于这方面的知识还是比较多的,不过比较零散。其中比较好的文章链接查看,

http://www.linuxidc.com/Linux/2012-10/71919p2.htm

用XtraBackup实现MySQL的主从复制快速部署【主不锁表】

http://www.360doc.com/content/12/0321/14/834950_196286503.shtml

mysql热备工具xtrabackup


xtrabackup有两个主要的工具:xtrabackup、innobackupex
 (1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表   (2)innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的,innobackupex是一个perl脚本封装,封装了xtrabackup,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项,如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。


1,安装xtrabackup


[root@bs-db2 data]# wget 'http://www.percona.com/redir/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm'

[root@bs-db2 data]# rpm -ivh percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm
Preparing...                ########################################### [100%]
  1:percona-xtrabackup     ########################################### [100%]


innobackupex是一个perl脚本封装,如果安装提示缺少perl库可以搜索安装

[root@bs-db2 data]# yum install perl-DBD-MySQL
[root@bs-db2 data]# yum install perl-Time-HiRes


其他的搜索安装即可。

在linux shell中查看是否有

[root@bs-db2 data]# xtrabackup
xtrabackup     xtrabackup_55  xtrabackup_56

[root@bs-db2 data]# innobackupex
innobackupex        innobackupex-1.5.1


如果没有 可以尝试重新登录。其他情况欢迎留言。


2,备份

首先注意一点:确保在my.cnf中存在[mysqld]并且在[mysqld]后面存在 datadir = ....

这里的参数datadir为mysql源码编译安装存放数据的目录。如我的mysql编译安装在/opt/mysql

这里的datadir=/opt/mysql/data

备份指令
[root@bs-db2 data]# innobackupex --defaults-file=/etc/my.cnf   --user=root --password=Abcd1234 --stream=tar ./ |gzip >mysql_back.tar.gz

其中参数--stream=tar

备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。  
在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

注意备份完成后 innobackupex 提示解压时要加上i参数


3,还原

[root@bs-db2 data]# scp mysql_back.tar.gz [email protected]:/opt/mysql/inno

复制备份文件到slave上

[root@bs-db2 inno]# pwd
/opt/mysql/inno

[root@bs-db2 inno]# ll
total 1481752
-rw-r--r-- 1 root root 1517306755 Dec 12 10:40 mysql_back.tar.gz


[root@bs-db2 inno]# tar zxvfi mysql_back.tar.gz
./backup-my.cnf
ibdata1

.

.

.

mysql/ndb_binlog_index.frm
mysql/proc.MYI
mysql/help_relation.MYD
mysql/user.MYD
mysql/servers.MYI
mysql/ndb_binlog_index.MYI
xtrabackup_logfile
xtrabackup_checkpoints
./xtrabackup_binary


[root@bs-db2 inno]innobackupex --defaults-file=/etc/my.cnf   --user=root --password=Abcd1234 --apply-log /opt/mysql/inno/

--apply-log  

对xtrabackup的--prepare参数的封装

(--prepare  
实施对备份文件进行恢复前的准备(生成InnoDB log file)xtrabackup指令)
--copy-back  
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;



InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

Get the latest version of Percona XtraBackup, documentation, and help resources:
http://www.percona.com/xb/p

IMPORTANT: Please check that the apply-log run completes successfully.
          At the end of a successful apply-log run innobackupex
          prints "completed OK!".



131212 12:20:01  innobackupex: Starting ibbackup with command: xtrabackup_55  --defaults-file="/etc/my.cnf"  --defaults-group="mysqld" --prepare --target-dir=/opt/mysql/inno --tmpdir=/tmp


.

.

.

[notice (again)]
 If you use binary log and don't use any hack of group commit,
 the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 32661, file name ./mysql-bin.000026

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
131212 12:20:07  InnoDB: Starting shutdown...
131212 12:20:12  InnoDB: Shutdown completed; log sequence number 11667029516
131212 12:20:12  innobackupex: completed OK!


注意此文件

[root@bs-db2 inno]# more xtrabackup_binlog_info
mysql-bin.000026        32661

记录了master的备份时状态,一会儿slave同步的时候设置为master_log_file 和master_log_pos


[root@bs-db2 inno]# innobackupex --defaults-file=/etc/my.cnf   --user=root --password=Abcd1234 --copy-back /opt/mysql/inno/

其中/opt/mysql/inno/为备份出来的文件位置。


[root@bs-db2 data]# chown  mysql.mysql * -R 修改数据文件的权限


[root@bs-db2 data]# /etc/init.d/mysql restart


3,同步

配置主从

#master

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 1


#slave

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 2

更多配置参考度娘。


登入mysql shell中

mysql> change master to master_host='192.168.11.43',
   -> master_port=3333,
   -> master_user='slave1',
   -> master_password='Abcd1234',
   -> master_log_file='mysql-bin.000026',
   -> master_log_pos=32661;
Query OK, 0 rows affected (0.05 sec)

这里的log_file和log_pos通过mysql数据目录下的xtrabackup_binlog_pos_innodb文件获得


mysql> start slave;
Query OK, 0 rows affected (0.00 sec)



mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: 192.168.11.43
                 Master_User: slave1
                 Master_Port: 3333
               Connect_Retry: 60
             Master_Log_File: mysql-bin.000026
         Read_Master_Log_Pos: 32852
              Relay_Log_File: bs-db2-relay-bin.000002
               Relay_Log_Pos: 444
       Relay_Master_Log_File: mysql-bin.000026
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes

同步ok


如遇其他问题欢迎留言,共同探讨。