不停服、不锁表用Xtrabackup实现新增从库

做主从复制一般都是为了实现读写分离,减轻主库负载或数据分析;为了数据安全,做备份恢复;主从切换做高可用。还可以用不同的slave扮演不同的角色,例如使用不同的索引,或不同的存储引擎,或用一个小内存server做slave只用于备份。

若一主一从运行一段时间了,现需要新加一台从库,比较方便的方法是用xtrabackup来实现,mysqldump导出100G以下的数据尚可,超过100G建议用xtrabackup;mysqldump是逻辑备份,xtrabackup是物理备份。

主从复制的操作思路:主从版本一致—>主库授权复制帐号—>确保开启binlog及主从server_id唯—>xtrabackup恢复到从库—>记录xtrabackup_binlog_info中binlog名称及偏移量—>从库change master to —>slave start—>检查两个yes即OK。

Xtrabackup是percona开源的备份工具:
1,可快速可靠的热备份整个库的InnoDB、 XtraDB表,无需停止在线服务,不锁表
2,可在上一次整库备份基础上做增量备份(innodb only)   
3,以流的形式产生备份,可以直接保存到远程机器上,节约磁盘空间
4,备份时不会增大服务器负载,快速完成备份鉴定,并能迅速恢复备份数据,从而提高在线时间
5,缺点是在增量备份的时候,作为备份基础的全备文件不能压缩,否则备份失效;增量的时候,表结构变更的话,变更部分备份无效。

新增从库的完整步骤
1主、从服务器上都搭好MySQL服务,从服务器上MySQL版本大于等于主服务器,最好完全一致
2在要做主从同步的服务器上分别安装XtraBackup
3如果从服务器上有MySQL实例,停掉服务,备份删除数据库内容,保留数据库目录
4配置主从服务器打开主从同步功能
5主服务器上执行备份
6传输备份文件到从服务器,并同步数据文件(apply-log)
7从服务器上恢复备份
8主服务器上授权同步帐号
9从服务器上设置MASTER并开启同步


Xtrabackup工具的工作原理是:
innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。
备份分为两个过程:
backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。
preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。


全量备份(主库)
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppass';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,PROCESS,SUPER ON *.* TO 'bkpuser'@'localhost';

innobackupex --defaults-file=/etc/my.cnf --host=localhost --port=3306 --user=bkpuser --password=bkppass /data/backup/mysql

默认会以当天日期+时间戳命名备份目录,如 2017-09-12_00-09-02。为便于拷贝到需要恢复(做从库)的目录会对该目录进行压缩成tgz文件。


全量恢复(从库)
从库的配置文件简单一点可以从主库拷贝过来,但要注意
server-id一定不能与主库相同,否则,会出现错误:Slave: received end packet FROM server, apparent master shutdown 

从库一般作为只读库使用,所以为安全起见,设置只读 set global read_only=1;可在my.cnf 里加入read-only参数来实现这一点,唯一需要注意的一点是read-only仅对没有super权限的用户有效。所以最好核对一下连接从服务器的用户,确保其没有super权限。 

准备:确认数据库是关闭的,并且datadir目录下为空
innobackupex --use-memory=8G --apply-log 2017-09-12_00-09-02

完了后会输出类似 InnoDB: Last MySQL binlog file position 0 287289673, file name ./mysql-bin.000158 的信息,后面的设置从库要用到

恢复:使用新的my.cnf文件,将完整的mysql数据文件拷贝到datadir下
innobackupex --defaults-file=/etc/my.cnf --use-memory=8G --copy-back 2017-09-12_00-09-02


一般是root账号做的恢复,需在copy-back之后修改数据目录下文件的属性:
chown -R mysql.mysql /var/lib/mysql

启动mysqld服务

mysql> change master to master_host=MASTER_HOST_IP, master_port=3306, 
       master_user='repuser',master_password='rep_pass',
       master_log_file='mysql-bin.000158', master_log_pos=287289673;
mysql> start slave;
mysql> show slave status\G

验证同步延迟
Master_Log_File: I/O线程当前正在读取的主服务器二进制日志文件的名称。Read_Master_Log_Pos:本机I/O线程读取主服务器二进制日志位置
上面2值与在主库执行show master status;看到的值如果基本接近,说明从库IO线程已经赶上了主库的binlog。

Relay_Master_Log_File: 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Exec_Master_Log_Pos: SQL线程执行来自master的二进制日志最后一个事件位置
与上面的Relay_Master_Log_File一起,同Master_Log_File、Read_Master_Log_Pos比较,能看到SQL线程是否已经赶上从库本地的IO线程。

Slave_IO_Running:I/O线程是否启动并成功连接到主服务器上
一般和下面的Slave_IO_Running和Seconds_Behind_Master一起监控主从健康状态
Slave_SQL_Running:SQL线程是否启动
Seconds_Behind_Master: 从库“落后”多少秒


创建部分备份(Creating Partial Backups)
部分备份共有三种方式,分别是:1. 用正则表达式表示要备份的库名及表名(参数为--include);2. 将要备份的表名或库名都写在一个文本文件中(参数为--tables-file)以及 3. 将要备份表名或库名完整的写在命令行中(参数为:--databases)。(注:不管你备份哪个库或是哪张表,强烈推荐把mysql库也一起备份,恢复的时候要用)

备份pms库和test库
innobackupex --user=root --password=admin@mysql_motone --defaults-file=/etc/my.cnf  --include='test.*|pms.*'  --slave-info /root/test_dir/

1 恢复部分被备份
1. 停止MySQL:service mysql stop  
2. 将/var/lib/mysql下面的所有文件全部删除:rm /var/lib/mysql/* -rf(如果前面没有备份mysql数据库, 那么在删除数据文件后要重建mysql系统表,重建命令是sudo mysql_install_db --user=mysql,但重建会导致原有用户信息全部丢失)  
3. 将第二步准备过的文件拷贝到/var/lib/mysql下:cp /usr/local/backup/2015-11-09_16-33-58/* /var/lib/mysql -rf  
4. 给文件赋权:chown -R mysql:mysql /var/lib/mysql/  
5. 启动MySQL:service mysql start  

2 压缩备份与解压
备份:innobackupex  --user=root --port=3306--defaults-file=/etc/my.cnf --no-lock --socket=/data/mbdata/open/mysql.sock--stream=tar /home/backup/all/alldb |gzip 1>/home/backup/all/alldb.tar.gz(40G 45分钟)
解压缩:tar -izxvf alldb.tar.gz -C backup

3恢复
停止数据库service mysqld stop;
1):innobackupex--apply-log --user=root --defaults-file=/etc/my.cnf --no-lock /root/alldb
2):备份并删除原目录/open/mbdata/open/下所有文件
3):innobackupex--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /root/alldb
 如果磁盘不够,直接mv */data/mbdata/open/
4):chown-Rmysql:mysql/data/mbdata/open
5):service mysqld start;

4增量备份
须要有未压缩的全量备份文件目录,先全量再增量
1):周一全量备份,
 time /usr/bin/innobackupex  --user=root --password=******--host=127.0.0.1 --port=3307 --defaults-file=/etc/my.cnf --slave-info  --socket=/data/mbdata/open/mysql.sock--no-timestamp /home/backup/all/alldb  2>$dirlog
2):剩下的周二到周日做增量备份;

5 增量备份脚本
ime /usr/bin/innobackupex  --user=root --password=****   --socket=/data/mbdata/open/mysql.sock--port=3307  --slave-info--defaults-file=/etc/my.cnf --no-timestamp --safe-slave-backup --incremental --incremental-basedir=/home/backup/all/alldb/home/backup/daily/daily_20120409 2>>/home/backup/daily/dailybackup_$tday.log

5增量恢复1
压缩文件
全量恢复,然后增量恢复
1):首先恢复全备innobackupex--apply-log --user=root --defaults-file=/data/mbdata/my.cnf--no-lock /home/backup/all/alldb 
 PS:/home/backup/all/alldb是全量备份目录
2):再恢复增量备份innobackupex/home/backup/all/alldb--incremental –incremental dir=/home/backup/daily/daily_2012_03_22 --apply-log
 PS:/home/backup/daily/daily_2012_03_22是增量备份目录
3):停止数据库,servicemysqldstop;然后备份并删除原目录/open/mbdata/open/下所有文件
4):还原数据库到默认目录 innobackupex--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /home/backup/all/alldb

5增量恢复2
5):chown-R mysql:mysql/data/mbdata/open
6):service  mysqldstart;
7):登陆mysql,验证数据。
恢复时间:45分钟左右
6远程备份
innobackupex  --user=root --port=3306 --defaults-file=/data/mbdata/open/my.cnf  --slave-info --socket=/data/mbdata/open/mysql.sock --no-timestamp [email protected] --scpopt="-Cp-carcfour"/home/backup/all/alldb_$tday2 >> /home/backup/all/allbackup.log
$tday2为变量

猜你喜欢

转载自my.oschina.net/u/2404183/blog/1536156