一、问题:
线上一个主库压力比较大,所以增加一个从库,但是不能重启或者停止主库的正常运行,不能锁库锁表影响业务的正常运行。所以这里想到了XtraBackup
二、XtraBackup介绍:
Xtrabackup的优点:
1、备份完成快速、可靠
2、备份期间不间断的事务处理
3、节省磁盘空间和网络带宽
4、自动备份验证
5、提高正常运行时间由于更快的恢复时间
备份INNODB引擎的数据库不会锁库锁表,但是备份MyISAM的表还是会锁的,还支持增量备份。
三、环境说明
系统版本:CentOS Linux release 7.3.1611 (Core)
内核版本:3.10.0-514.16.1.el7.x86_64
mysql版本:mysql Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper
xtrabackup版本:percona-xtrabackup-24-2.4.4-1.el7.x86_64 :注:较低版本的xtrabackup不支持 centos7.3
四、xtrabackup软件安装:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum install -y percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
注意:
my.cnf修改:
innodb_file_per_table = 1
binlog_format='row'
在线改:
set global innodb_file_per_table=1;
set global binlog_format='row';
错误故障:
rm -f /etc/my.cnf
否则全备时报如下错误:
InnoDB: Number of pools: 1
InnoDB: Error: log file ./ib_logfile0 is ofdifferent size 50331648 bytes
InnoDB: than specified in the .cnf file268435456 bytes!
f pools: 1
五、主库主从配置
1.主库配置/etc/my.cnf
增加server-id 和 bin-log
#vim /etc/my.cnfserver-id = 128
log-bin = mysql-bin
2.主库配置授权账号
mysql>ALTERUSER'root'@'localhost'IDENTIFIEDBY'new_password';
mysql>alter user root@localhost identified by'Admin123!';
mysql>grant replication slave on *.* to'slave'@'10.130.21.53' identified by 'password';
mysql> flush privileges;
3.手动设置主库server-id和log-bin 参数
setglobalserver_id=128
因为这两个参数是动态参数,不用重启主库也可以生效
如果你的主库已经设置这两个参数,请忽略这一步操作
4.从库配置/etc/my.cnf
增加server-id 和 bin-log#vim /etc/my.cnfserver-id = 129
#如果需要在从库上做bin-log备份可以添加如下参数
log-bin = mysql-bin
log-slave-updates = 1
expire-logs-days=10
mysql -uroot -poldboy123 -S /data/3306/mysql.sock
六、备份主库数据
1.主库机器上创建备份目录
#mkdir -p /home/data/backup33061
2.执行全库备份
2.1.备份
innobackupex --defaults-file=/home/data/mysql33061/my.cnf --user=root --password=admin123 --socket=/home/data/mysql33061/mysql.sock /home/data/backup33061
>>> xtrabackup: Transaction log oflsn (549646200) to (549646758) was copied.
170724 15:19:39 completed OK!
PS:备份完成后,会在/home/data/backup33061目录下生成一个时间点的目录,这里是2017-07-24_15-19-04。你也可以加一个--no-timestamp参数不产生这个目录,直备份到/home/data/backup33061目录下
2.2.重放redo log
#下面preparing,undo撤销未提交的事务,重放redo log
innobackupex--defaults-file=/home/data/mysql33061/my.cnf--user=root--password=oldboy123--apply-log--socket=/home/data/mysql33061/mysql.sock/home/data/backup33061/2017-07-24_15-19-04
>>> InnoDB: Shutdown completed;log sequence number 549647400
170724 15:24:19 completed OK!
经过预处理或是redo log后的文件才能替换掉从库的数据目录
ps:1、ls -l/data/backup/full_data/2016-07-14_05-19-52/查看,你发现xtrabackup会把你数据库datadir下的所有数据 文件都复制过来还新增了5个xtrabackup_开头的文件,我们关心的是xtrabackup_binlog_info这个文件,因为这个文件里面记 录了你做从库需要change到主库的binlog的位置和pos点
2、如果只想备份一个库,加“--include=navy”指定库名即可, “--databases=navy”不好使。
七、恢复数据到从库
1.停止从库
#/etc/init.d/mysqld stop
2.把主库备份文件拷贝到从库机器
#scp -rp /data/backup/full_data//2017-07-24_15-19-04 [email protected]:/mysql/data/
3.修改恢复文件权限
#chown -R mysql:mysql /mysql/data
4.启动数据库
#/etc/init.d/mysqld start
5.确认数据是否恢复成功
登录从库,执行show databases;
6.确认同步的位置点
在从库上或者主库上都可以查看该信息,我们是在从库上查看
#cat /mysql/data/xtrabackup_binlog_info mysql33061-bin.000001 476764
九、开始主从同步
1.配置从库 主从配置
#登录从库并执行
mysql > CHANGEMASTER TOMASTER_HOST='10.130.21.52',MASTER_USER='rep',MASTER_PASSWORD='oldboy123',MASTER_LOG_FILE='mysql33061-bin.000001', MASTER_LOG_POS=476764;
2.开始同步
mysql> start slave;
3.查看同步状态
mysql> show slave status\G
Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0
centos6.5 + mysql5.6
备份与主从同步:
注意:
若是mysql编译安装等,提示找不到socket路径,可以用--socket=/var/lib/mysql/mysql.sock参数执行socket路径
1 备份
在主库上运行备份命令,后面跟备份文件放在哪个目录下;
innobackupex --defaults-file="/etc/my.cnf" --user=root --passwor=123456 /opt/
2.scp到从库
经备份后的文件夹整体scp到从库的某个目录,如opt目录下
scp -rp 备份目录 远程用户@远程主机:/远程目录
3.预处理
内存较大的主机,可以适当加大use-memory,提高处理速度。
innobackupex --defaults-file="/etc/my.cnf" \
--user=root \
--apply-log \
--use-memory=4G /opt/2016-05-07_16-50-33/
4.关闭从库
/etc/init.d/mysqld stop
5.copy数据
注意:(拷贝前需要将之前的mysql数据目录清空)
innobackupex --defaults-file="/etc/my.cnf" \
--user=root \
--move-back /opt/2016-05-07_16-50-33/
6.查看master位置
[root@linux-node2 data]# cat xtrabackup_binlog_pos_innodb
mysql-bin.000008 3037723
7.修改权限
将mysql的数据目录授予mysql用户权限
chown -R mysql:mysql /data01/mysql/
8.启动从库
/etc/init.d/mysqld start
9.设置主从
mysql> change master to \
master_host='192.168.56.11', \
master_user='slave', \
master_password='123456', \
master_log_file='mysql-bin.000008', \
master_log_pos=3037723;
相关经验:
生产环境212G的数据:
备份时间约25分
内网scp时间:5分钟(千兆网卡)
预处理时间:5分种
拷贝(恢复)数据:21分钟
延迟复制:
1.误删除恢复。
2.延迟测试。
3.历史查询。
mysql> stop slave;
mysql> change master to master_delay = 600;
mysql> start slave;
半同步复制:
master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> stop slave io_thread;start slave io_thread;
高可用解决方案: MHA
架构扩展方案:
1.基于复制的扩展
2.客户端分库分表
3.mysql cluster
4.Percona XtraDB Cluster
5.MySQL的Proxy中间件(mysql proxy,mycat)
MySQL -> Percona Server -> MariaDB
基于复制的扩展 -> 客户端分库分表 -> MySQL PXC -> mysql 中间件 -> mysql cluster
从库:一定要设置只读
MySQL Proxy部署 PXC部署(技术储备)