目录
一、备份策略结构树形图
1 (备份存储机器,需部署)xx.xx.5.16:/home/backup_mysql_wufei/ 2 ├── backup 3 │ ├── mysql_xxxx_bim_3220 4 │ │ ├── full_2018-06-12_21-34-31_2 5 │ │ └── full_2018-06-13_13-10-45_3 6 │ └── mysql_xxxx_im_3215 7 │ └── full_2018-06-13_11-49-48_3 8 ├── bin 9 │ ├── xxxx_xtrabackup_wf.sh 10 │ └── mysql_template_backup.sh 11 ├── binlogs 12 │ ├── mysql_xxxx_bim_3220 13 │ └── mysql_xxxx_im_3215 14 ├── conf 15 │ ├── xxxx_mysql_backup_wf.conf 16 │ └── higo_mysql_template_wf.conf 17 ├── log 18 │ ├── db_backup_3215_180613_114948.log 19 │ ├── db_backup_3220_180612_213431.log 20 │ ├── db_backup_3220_180613_131045.log 21 │ ├── full_2018-06-12_21-34-31_2_higo_bim_3220.log 22 │ ├── full_2018-06-13_11-49-48_3_higo_im_3215.log 23 │ └── full_2018-06-13_13-10-45_3_higo_bim_3220.log 24 └── var 25 ├── mysql_xxxx_bim_3220.err 26 ├── mysql_xxxx_bim_3220.index 27 ├── mysql_xxxx_im_3215.err 28 ├── mysql_xxxx_im_3215.index 29 ├── mysql_xxxx_backup.err 30 └── mysql_xxxx_backup.index
1 (备份调度机器,需部署)xx.xx.1.49:/home/wufei/ 2 ├── backup_controll 3 │ ├── backup_controll_wf.sh 4 │ └── log 5 │ ├── xxxx_bim_3220.log 6 │ └── xxxx_im_3215.log 7 └── percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz 1 (备份执行机器,均为自动化生成)xx.xx.0.70:/data/percona-xtrabackup/ 2 ├── backup_mysql_wufei 3 │ ├── backup 4 │ │ └── mysql_xxxx_bim_3220 5 │ │ └── full_2018-06-13_13-10-45_3 6 │ ├── bin 7 │ │ └── mysql_template_backup.sh 8 │ ├── conf 9 │ │ └── higo_mysql_template_wf.conf 10 │ ├── log 11 │ │ └── full_2018-06-13_13-10-45_3_3220.log 12 │ └── var 13 │ ├── mysql_xxxx_bim_3220.err 14 │ ├── mysql_xxxx_bim_3220.index 15 │ ├── mysql_xxxx_bim_3220.index_2018-06-11 16 │ └── mysql_xxxx_bim_3220.index_2018-06-12 17 └── xtrabackup 18 ├── bin 19 │ ├── innobackupex -> xtrabackup 20 │ ├── xbcloud 21 │ ├── xbcloud_osenv 22 │ ├── xbcrypt 23 │ ├── xbstream 24 │ └── xtrabackup 25 ├── man 26 └── percona-xtrabackup-2.4-test |
二、当前备份系统支持备份方式
2.1 全量备份
2.2 增量备份
2.3 克隆从库
2.4 其它(可定制,扩展性强)
三、备份脚本
3.1 调度脚本
path:xx.xx.1.49 /home/wufei/backup_controll/backup_controll_wf.sh
逻辑:通过计划任务定时执行对应库的备份任务(没有必要采用supervise做守护进程每秒扫描一次db,因为supervise是监控进程状态,异常退出时能自动重启,像我们现在使用的DBProxy就需要,但是数据库备份每个库每天只需备份一次,即便备份时异常终止也不是supervise能够解决的)执行计划如下:
# crontab -l # WUFEI的xxxx_bim备份定时任务 |
调度日志:xx.xx.1.49:/home/wufei/backup_controll/log/[db_name]_[port].log
如:xx.xx.1.49:/home/wufei/backup_controll/log/higo_bim_3220.log 日志格式;{backup_db:xxxx_bim;port:3220;type:full;start_datetime:2018-06-13 13:10:43;end_datetime:2018-06-13 13:11:10;info:backup end} |
注意:由于脚本中需要远程ssh,目前公司门神没有在服务器上登记密钥,所以需要把中心机和各个存储的key分发到每台机器上(双向免key:存储和数据库机器),还有记得测试rsync命令,远程俩服务器间第一次使用rsync时需要输入yes.
流程:1)初始化环境;检测是否安装xtrabackup,是否存在备份相关目录等
2)创建生成备份私有配置文件;防止参数冲突
3)发起备份;备份数据
4)发送备份到远程
5)清理过老的备份和日志等
3.2 默认配置文件
path:xx.xx.5.16:/home/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf
逻辑:存放所以备份所需的公共参数,一般为默认值(通用值),[xx.xx.1.49 3303 wf_dbbackup db_backup_policy]存放了每个需要备份的MySQL实例的私有参数,备份脚本读取配置文件中的所有变量,设置为全局变量
3.3 备份脚本函数
path:xx.xx.5.16:/home/backup_mysql_wufei/bin/xxxx_xtrabackup_wf.sh
逻辑:1)检查innobackupex工具是否安装,建立相关目录、生成相关文件等
2)获取公共参数(xxxx_mysql_backup_wf.conf文件中)和私有参数(db_backup_policy表中)生成该MySQL实例备份私有配置文件xxxx_mysql_template_wf.conf,通过rsync同步到备份实例机器的备份配置目录conf下(每次都会覆盖)
3)通过rsync远程同名备份脚本模板并执行备份,然后在同步各种备份文件及信息并定期清理
3.4 备份脚本模板
path:xx.xx.5.16:/home/backup_mysql_wufei/bin/mysql_template_backup.sh
(同步到MySQL机器后)/data/percona-xtrabackup/backup_mysql_wufei/bin/mysql_template_backup.sh
逻辑:1)远程执行备份函数,读取私有配置文件higo_mysql_template_wf.conf中所以变量设置为全局变量完成备份
2)支持仅全量备份、增量备份和克隆从库3中方式
3)支持打包、发送备份到远程、清理备份及日志等功能
四、目录介绍
4.1 backup_mysql_wufei/bin:存放备份脚本
4.2 backup_mysql_wufei/backup:存放数据库备份
4.3 backup_mysql_wufei/conf:存放配置文件
4.4 backup_mysql_wufei/log:存放日志文件
4.4.1 db_backup_[port]_[port]_[datetime].log为脚本执行过程信息日志
4.4.2 full_[datetime]_[db_name]_[port].log为innobackupex工具备份过程信息日志
4.5 backup_mysql_wufei/var:存放备份是否成功的索引信息
4.5.1 mysql_[db_name]_[port].index为备份成功后索引文件(format:{week_day:1,dir:full/incr_2018-06-12_14-58-56_7,type:full/incr})
4.5.2 mysql_[db_name]_[port].err为错误日志文件,根据此文件知道备份是否成功(format:{week_day:1,dir:full/incr_2017-06-12_14-58-56_7,type:full/incr,date:2017-06-14})
4.6 backup_mysql_wufei/binlogs:存放binlog日志备份
五、备份状态监控提醒
六、数据库备份脚本
七、涉及备份信息数据库
xx.xx.1.49 3303 wf_dbbackup
相关表01:db_backup_policy
CREATE TABLE `db_backup_policy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ' 自增ID ',
`port` mediumint(5) unsigned NOT NULL COMMENT '端口',
`ip` int(10) unsigned NOT NULL COMMENT 'IP',
`db` varchar(20) NOT NULL DEFAULT 'all' COMMENT '备份DB',
`mode` enum('full','incr','clone') DEFAULT 'full',
`data_socket` varchar(150) NOT NULL DEFAULT '/data/mysql-5.7.16/etc/mysql.sock' COMMENT '数据库socket文件',
`dest_ip` int(10) unsigned NOT NULL COMMENT '保存地址IP ',
`dest_dir` varchar(150) NOT NULL DEFAULT '/home/backup_mysql_wufei/backup' COMMENT '保存目录',
`weekday` set('1','2','3','4','5','6','7') NOT NULL COMMENT '一周备份日期',
`remain_days` tinyint(4) unsigned NOT NULL DEFAULT '30' COMMENT '保存天数',
`full_backup_week_day` tinyint(2) unsigned NOT NULL DEFAULT '2' COMMENT '若是增量备份,全备在一周的第几天',
`begintime` time NOT NULL COMMENT '备份开始时间',
`inter` mediumint(9) NOT NULL DEFAULT '1' COMMENT '备份间隔',
`inter_unit` enum('day','hour','minute') NOT NULL DEFAULT 'day' COMMENT '备份间隔单位',
`zip_type` enum('untar','tar','zip') NOT NULL DEFAULT 'untar' COMMENT '备份文件是否压缩',
`parallel` int(10) NOT NULL DEFAULT '1' COMMENT '该选项接收一个整数,xtarbackup子进程将用于同时备份文件的并发数',
`throttle` int(10) NOT NULL DEFAULT '800' COMMENT '指定I/O操作的数量/秒。该参数只适用于备份阶段',
`trans_speed` int(10) NOT NULL DEFAULT '0',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '策略修改日期',
`memo` varchar(512) DEFAULT '' COMMENT '备注',
`is_backup` int(1) NOT NULL DEFAULT '0' COMMENT '是否需要备份',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='备份策略表';
*************************** 1. row ***************************
id: 1
port: 3220
ip: 169082950
db: xxxx_bim
mode: full
data_socket: /data/mysql5.7.16data/mysql3220/mysql.sock
dest_ip: 169084176
dest_dir: /home/backup_mysql_wufei/backup/mysql_xxxx_bim_3220
weekday: 1,2,3,4,5,6,7
remain_days: 6
full_backup_week_day: 1
begintime: 01:10:00
inter: 1
inter_unit: day
zip_type: untar
parallel: 16
throttle: 800
trans_speed: 0
update_time: 2018-06-08 12:46:46
memo:
is_backup: 0
相关表02:db_backup_info
CREATE TABLE `db_backup_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ' 自增ID ',
`policy_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'db_backup_policy表主键ID',
`backup_date` date NOT NULL DEFAULT '1000-01-01' COMMENT ' 备份日期 ',
`port` mediumint(9) NOT NULL COMMENT ' 端口 ',
`ip` int(10) unsigned NOT NULL COMMENT 'IP',
`db` varchar(100) NOT NULL DEFAULT 'all' COMMENT ' 备份DB ',
`mode` enum('full','incr','clone') DEFAULT 'full',
`dest_ip` int(10) unsigned NOT NULL COMMENT '保存地址IP ',
`dest_dir` varchar(150) NOT NULL DEFAULT '/home/backup_mysql_wufei/backup' COMMENT '保存目录',
`begintime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT ' 备份开始时间 ',
`endtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '备份结束时间 ',
`backup_status` varchar(10) NOT NULL DEFAULT '' COMMENT '备份状态:failed/success',
`memo` varchar(512) DEFAULT '' COMMENT ' 备注 ',
PRIMARY KEY (`id`),
KEY `idx_backupdate` (`backup_date`),
KEY `idx_policy_id` (`policy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='备份信息表';
*************************** 1. row ***************************
id: 13
policy_id: 1
backup_date: 2018-09-12
port: 3220
ip: 169082950
db: xxxx_bim
mode: full
dest_ip: 169084176
dest_dir: /home/backup_mysql_wufei/backup/mysql_xxxx_bim_3220/full_2018-09-12_01-10-01_3
begintime: 2018-09-12 01:10:00
endtime: 2018-09-12 01:14:05
backup_status: success
memo:
八、innobackupex的介绍
Xtrabackup是由percona开发的一个开源软件,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。
直接下载二进制包解压就可以了,不编译,不需要定制。
Xtrabackup中包含两个工具:
1)xtrabackup :只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表。
2)innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。
Xtrabackup可以做什么
1)在线(热)备份整个库的InnoDB, XtraDB表
2)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
3)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:
1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
innobackupex备份mysql数据的流程
innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。
innobackupex恢复mysql数据的流程
innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。
下面详细说下innobackupex备份和恢复的工作原理:
(1)备份的工作原理
如果在程序启动阶段未指定模式,innobackupex将会默认以备份模式启动。
默认情况下,此脚本以--suspend-at-end选项启动xtrabackup,然后xtrabackup程序开始拷贝InnoDB数据文件。当xtrabackup程序执行结束,innobackupex将会发现xtrabackup创建了xtrabackup_suspended_2文件,然后执行FLUSH TABLES WITH READ LOCK,此语句对所有的数据库表加读锁。然后开始拷贝其他类型的文件。
如果--ibbackup未指定,innobackupex将会自行尝试确定使用的xtrabackup的binary。其确定binary的逻辑如下:首先判断备份目录中xtrabackup_binary文件是否存在,如果存在,此脚本将会依据此文件确定使用的xtrabackup binary。否则,脚本将会尝试连接database server,通过server版本确定binary。如果连接无法建立,xtrabackup将会失败,需要自行指定binary文件。
在binary被确定后,将会检查到数据库server的连接是否可以建立。其执行逻辑是:建立连接、执行query、关闭连接。若一切正常,xtrabackup将以子进程的方式启动。
FLUSH TABLES WITH READ LOCK是为了备份MyISAM和其他非InnoDB类型的表,此语句在xtrabackup已经备份InnoDB数据和日志文件后执行。在这之后,将会备份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 类型的文件。
当所有上述文件备份完成后,innobackupex脚本将会恢复xtrabackup的执行,等待其备份上述逻辑执行过程中生成的事务日志文件。接下来,表被解锁,slave被启动,到server的连接被关闭。接下来,脚本会删掉xtrabackup_suspended_2文件,允许xtrabackup进程退出。
(2)恢复的工作原理
为了恢复一个备份,innobackupex需要以--copy-back选项启动。
innobackupex将会首先通过my.cnf文件读取如下变量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并确定这些目录存在。
接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下来拷贝InnoDB表数据文件,最后拷贝日志文件。拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。