MySQL Enterprise Backup的特点
MySQL Enterprise Backup是一款专门用于备份MySQL数据库发工具。它是一个跨平台的高性能备份工具,它具有丰富的功能,包括:热备份,增量备份,选择备份,直接备份到云,加密,压缩备份等。
此工具是针对Innodb引擎进行优化的,但它同时可以备份和恢复所有MySQL能支持的引擎。它以block级别进行并行备份,性能大大优于逻辑备份工具如mysqldump。
它是一款商业收费软件。
下载和安装
到Oracle的edelivery网站上下载:
选择平台
安装
root@scutech:/home/scutech# dpkg -i meb-4.1.3-ubuntu18.04-x86-64bit.deb Selecting previously unselected package meb. (Reading database ... 166554 files and directories currently installed.) Preparing to unpack meb-4.1.3-ubuntu18.04-x86-64bit.deb ... Unpacking meb (4.1.3) ... Setting up meb (4.1.3) ... root@scutech:/home/scutech# which mysqlbackup /usr/bin/mysqlbackup root@scutech:/home/scutech# mysqlbackup --version MySQL Enterprise Backup version 4.1.3 Linux-4.15.0-39-generic-x86_64 [2019/02/11 21:24:08] Copyright (c) 2003, 2019, Oracle and/or its affiliates. All Rights Reserved. [Build ID : 14320005.49c44c9da9b35aaeff39804d8708eb5d2b857392] 200114 19:28:38 MAIN INFO: A thread created with Id '140031108136192' Run mysqlbackup --help for help information. root@scutech:/home/scutech#
最佳实践
参数文件
在参数文件中加一节[mysqlbackup],把每次都要用到且不变化的参数写入到这个文件中
单个目录或带时间戳的子目录
–with-timestamp会在指定的目录下创建一个带时间戳到子目录。
如果为了更方便的进行备份周期的管理,可以选择这个参数。
但进行增量备份时在–incremental-base参数需要指定前一次备份的目录,如果需要前一次备份的目录可以被预测,请不要使用–with-timestamp
全量备份或增量备份
如果数据小,或数据变化量大,可以考虑进行全量备份,否则考虑增量备份
压缩或不压缩
LZ4的压缩效率高,速度快,通常是推荐选项。但最后进行测试。
全量备份恢复
全量备份到单个文件
$ mysqlbackup --backup-image=./my210.mbi --backup-dir=/home/scutech/back backup-to-image ...... 200210 10:06:30 MAIN INFO: Full Image Backup operation completed successfully. 200210 10:06:30 MAIN INFO: Backup image created successfully. 200210 10:06:30 MAIN INFO: Image Path = /home/scutech/back/my210.mbi 200210 10:06:30 MAIN INFO: MySQL binlog position: filename master-binlog.000004, position 194 200210 10:06:30 MAIN INFO: GTID_EXECUTED is 3ea8f636-36bd-11ea-b292-fa163e0ec694:1-180351 ------------------------------------------------------------- Parameters Summary ------------------------------------------------------------- Start LSN : 99457536 End LSN : 99457762 ------------------------------------------------------------- mysqlbackup completed OK!
流备份
单个备份文件备份到远端主机
mysqlbackup --defaults-file=~/my_backup.cnf --backup-image=- --backup-dir=/tmp backup-to-image |
ssh @ ‘cat > ~/backups/my_backup.img’
备份到云
备份到Oracle云
mysqlbackup
–cloud-service=openstack --cloud-container=
–cloud-user-id=-: --cloud-password=’’
–cloud-tempauth-url=https://.storage.oraclecloud.com
–cloud-trace=1 --cloud-object=image_900.mbi
–backup-dir=/home/user/dba/orbackuptmpdir
–backup-image=-
backup-to-image
在openstack对象存储上创建一个云备份
mysqlbackup
–include-tables=testdb.t1 --use-tts=with-full-locking
–cloud-service=openstack --cloud-container=
–cloud-user-id= --cloud-password=
–cloud-region= --cloud-tenant=
–cloud-identity-url=
–cloud-trace=1 --cloud-object=image_800.mbi
–backup-dir=/home/user/dba/opbackuptmpdir
–backup-image=-
backup-to-image
在Amazon S3上创建一个云备份
mysqlbackup
–cloud-service=s3 --cloud-aws-region=
–cloud-access-key-id= --cloud-secret-access-key=< aws secret access key>
–cloud-bucket= --cloud-object-key=
–backup-dir=/home/user/dba/s3backuptmpdir
–backup-image=-
backup-to-image
将Amazon S3上的一个云备份解到备份目录
mysqlbackup
–cloud-service=s3 --cloud-aws-region=
–cloud-access-key-id= --cloud-secret-access-key=< aws secret access key>
–cloud-bucket= --cloud-object-key=
–backup-dir=/home/user/dba/s3backupdir
–backup-image=-
image-to-backup-dir
增量备份
Differential 和 Incremental Backup
Differential Backup是在上次全量备份的增量备份
Incremental Backup是在上次备份的增量备份
–incremental 和 --incremental-with-redo-log-only
–incremental 从datafile中读取变化的块
–incremental-with-redo-log-only 从redo logfile中读取变化的块
从redo中读取变化的块通常比从datafile中读取要快,但不绝对
从redo中读取块的增量备份的备份频率设置要考虑redo logfile的大小和redo log的产生量。
–incremental-base和–start-lsn
–incremental-base=history:last_backup从mysql.backup_history表中查找最后的lsn号,作为增量备份的起始点。
–incremental-base=dir:directory_path,从备份文件中查找最后的lsn号,作为增量备份的起始点。
–start-lsn从输入中接收lsn号,作为增量备份的起始点。
增量备份案例
从最后一次备份进行增量备份
mysqlbackup --incremental=optimistic --incremental-base=history:last_backup --backup-dir=/home/scutech/back/incr1 --backup-image=incremental_image1.bi backup-to-image
以指定的目录做基准目录进行备份
mysqlbackup --incremental=optimistic --incremental-base=dir:/home/scutech/back/full1 --backup-dir=/home/scutech/back/incr1 --backup-image=incremental_image1.bi backup-to-image
用在backup-dir目录下的meta/backup_variables.txt中end_lsn加一作为增量start_lsn。
在上次增量备份的基础上再次进行增量备份
mysqlbackup --incremental=optimistic --incremental-base=dir:/home/scutech/back/incr1 --backup-dir=/home/scutech/back/incr2 --backup-image=incremental_image2.bi backup-to-image
优化备份(Optimistic Backup)
优化备份的两个阶段
优化阶段,备份不活跃的表。
常规阶段,备份活跃的表,和redo,undo和系统表空间
判断活跃表的标准
optimistic-time=YYMMDDHHMMSS在这个时间后变更过的表是活跃表;
optimistic-time=now 所有的表都是活跃表
optimistic-busy-tables 指定的表为活跃表,例如:–optimistic-busy-tables="^mydatabase.mytables-.*"表示mydatabase数据库中mytables-开头的表为活跃表;
以上两个参数同时指定,optimistic-busy-tables优先。
恢复
全量恢复
mysqlbackup --defaults-file=<my.cnf> -uroot --backup-image=<image_name>
–backup-dir= --datadir= copy-back-and-apply-log
把备份恢复到一个新建的目录:
mysqlbackup --backup-image=full1.mbi --backup-dir=/home/scutech/back/full1 --datadir=/home/scutech/back/rest1 copy-back-and-apply-log
在恢复过程中注意:
恢复的目标目录应为空
注意恢复后的文件属主和权限
mysqlbackup在备份过程中会自动把old_alter_table设置成“1”,结束时设置成“0”,这个过程在log中可以看到,如果程序异常退出需要手工设置
参数
copy-back 将备份文件拷贝到目标目录
apply-log 对–backup-dir中文件应用日志,前滚到一致的状态
copy-back-and-apply-log 前面两项工作都做
backup-and-apply-log 备份并应用日志
增量恢复
方法一:
使用copy-back-and-apply-log恢复全量
使用copy-back-and-apply-log恢复增量
方法二:
前滚全量
mysqlbackup --backup-dir=/full-backup/ apply-log
前滚增量
mysqlbackup --incremental-backup-dir=/incr-backup
–backup-dir=/full-backup apply-incremental-backup
继续前滚所以增量,随时可以用copy-back恢复
创建从服务器
在主库上进行全量备份并恢复到从库
全量备份到从服务器
mysqlbackup --backup-image=- --backup-dir=/home/scutech/back/full4 backup-to-image |
ssh scutech@192.168.17.149 ‘cat > /home/scutech/back/full4/my_backup.img’
传输临时目录
scp -r /home/scutech/back/full4/* scutech@192.168.17.149:back/full4
恢复
mysqlbackup --backup-image=/home/scutech/back/full4/my_backup.img --backup-dir=/home/scutech/back/full4 --datadir=/var/lib/mysql copy-back-and-apply-log --force
修改权限
chown -R mysql. /var/lib/mysql
启动mysql服务
修改配置文件,增加两个参数skip-slave-start 和 event_scheduler=off,然后启动mysql服务
记录binlog位置
启动时,在error log中可以查看到binlog的位置,但不一定准确,因为Innodb引擎记录的binlog的位置不包括DDL语句和非Innodb表的变更,要在备份记录中查询binlog的位置
cat /home/scutech/back/full4/meta/backup_variables.txt | grep binlog_position
binlog_position=master-binlog.000002:194
配置主库信息
例如:
CHANGE MASTER TO master_host='192.168.17.40',master_port=3306,master_user='root',master_password='dingjia',MASTER_LOG_FILE='master-binlog.000002', MASTER_LOG_POS=194,master_auto_position=0;
启动复制
先在从库上disable所有事件的状态:
UPDATE mysql.event SET status = ‘SLAVESIDE_DISABLED’;
修改配置文件,删除前面增加人两个参数skip-slave-start 和 event_scheduler=off,然后启动复制。
start slave;
show slave status \G;