使用innobackupex进行mysql的差异备份还原和延迟复制

背景:
有同事执行update语句没有添加where条件,导致大量脏数据,需要将这张表恢复到前一天 数据库上有备份,每周一次完整备份,每天一次差异备份
恢复的整个过程就是将每天的差异备份合并到完整备份中,然后一起恢复到数据库中 一、全备相关的命令:
# innobackupex --defaults-file="/etc/my.cnf" --user=root -p'pass' --socket=/tmp/mysql.sock /opt
全备之后,去数据库操作,创建新的对象或插入数据
# 增量备份命令:
innobackupex --user=root --password= --incremental --incremental-basedir=/opt/cmsdb20191202/full_2019--28_01--01_4/ /opt/cmsdb20191202/incr_2019--29_01--01_5/ 二、使用全量备份和几天的增量备份,恢复数据 使用备份脚本备份出来的数据库: [root@/opt]# ll
total
drwxr-xr-x apache users Dec : full_2019--28_01--01_4
drwxr-xr-x apache users Nov : incr_2019--29_01--01_5
drwxr-xr-x apache users Nov : incr_2019--30_01--01_6
drwxr-xr-x apache users Dec : incr_2019--01_01--01_7
drwxr-xr-x apache users Dec : incr_2019--02_01--01_1 准备工作:
移除mysql的数据文件夹 /data/mysql_data,关闭mysql服务(/etc/my.cnf 的配置最好和备份的源库保持一致) 、预处理,进行事物检查
innobackupex --defaults-file="/etc/my.cnf" --user=root -p'' --socket=/tmp/mysql.sock --apply-log --use-memory=4G /opt/cmsdb20191202/full_2019--28_01--01_4/ 、合并第1///4个增量备份到完全备份里面:
innobackupex --user=root --password='' --apply-log-only --redo-only /opt/cmsdb20191202/full_2019--28_01--01_4/ --incremental-dir=/opt/cmsdb20191202/incr_2019--29_01--01_5/ innobackupex --user=root --password='' --apply-log-only --redo-only /opt/cmsdb20191202/full_2019--28_01--01_4/ --incremental-dir=/opt/cmsdb20191202/incr_2019--30_01--01_6/ innobackupex --user=root --password='' --apply-log-only --redo-only /opt/cmsdb20191202/full_2019--28_01--01_4/ --incremental-dir=/opt/cmsdb20191202/incr_2019--01_01--01_7/ innobackupex --user=root --password='' --apply-log-only --redo-only /opt/cmsdb20191202/full_2019--28_01--01_4/ --incremental-dir=/opt/cmsdb20191202/incr_2019--02_01--01_1/
、完全恢复数据库:
innobackupex --defaults-file="/etc/my.cnf" --user=root --socket=/tmp/mysql.sock --copy-back /opt/cmsdb20191202/full_2019--28_01--01_4/ 三、修改恢复的数据文件权限:
chown -R mysql.mysql /data/mysql_data
五、启动mysql服务,登录mysql,检查数据:
service mysql start 官方文档给出的恢复步骤:
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-
innobackupex --apply-log BASE-DIR
innobackupex --copy-back BASE-DIR 三、做主从的延迟复制 # 为避免后续发送类似情况,再次恢复数据,直接把这台数据库作为主库的从库,并做1天的延迟复制,可以恢复一天以内的数据: # 做主从复制
MySQL [(none)]> change master to master_host='192.168.11.53',master_user='rep',master_password='wsdb123',master_log_file='mysql-bin.000306',master_log_pos=;
Query OK, rows affected, warnings (0.03 sec) MySQL [(none)]> start slave; Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). 解决办法: MySQL [(none)]> set global server_id=;
Query OK, rows affected (0.06 sec) MySQL [(none)]> show variables like '%server_uuid%';
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------+
| server_uuid | 5e7197c1-15b9-16ea-b9dc-0050568d373d |
+---------------+--------------------------------------+
row in set (0.00 sec) MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | |
+---------------+-------+
row in set (0.00 sec) # 做延迟复制:
登陆到Slave数据库服务器
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = ; mysql>start slave;
mysql>show slave status \G; 四、数据库备份相关的脚本: 主从数据库服务器均安装xtrabackup工具
wget http://repo.percona.com/tools/yum/release/7/RPMS/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm yum localinstall percona-xtrabackup--2.4.-.el7.x86_64.rpm -y # 备份计划任务
########mysql backup cms_company,每周4进行全备份,每天定时增量备份,保留一周
* * * /usr/local/worksh/xtrabackup_cron/bin/mysql_increment_hot_backup.sh # 备份脚本 [root@newcms:~]# cat /usr/local/worksh/xtrabackup_cron/bin/mysql_increment_hot_backup.sh
#!/usr/bin/env bash # Program: MySQL 增量备份脚本 使用 percona xtrabackup
##进入程序目录
cd /usr/local/worksh/xtrabackup_cron/bin
# 读取配置文件中的所有变量值, 设置为全局变量
# 配置文件
conf_file="../conf/mysql_increment_hot_backup.conf"
# mysql 用户
user=`sed '/^user=/!d;s/.*=//' $conf_file`
# mysql 密码
#password=`sed '/^password=/!d;s/.*=//' $conf_file`
password="pass" # mysql 备份目录
backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`
# percona-xtrabackup 备份软件路径
xtrabackup_dir=`sed '/^xtrabackup_dir=/!d;s/.*=//' $conf_file`
# 全备是在一周的第几天
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
# mysql 全备前缀标识
full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
# mysql 增量备前缀标识
increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
# mysql 配置文件
mysql_conf_file=`sed '/^mysql_conf_file=/!d;s/.*=//' $conf_file`
# 备份错误日志文件
error_log=`sed '/^error_log=/!d;s/.*=//' $conf_file`
# 备份索引文件
index_file=`sed '/^index_file=/!d;s/.*=//' $conf_file` # 备份日期
backup_date=`date +%F`
# 备份日期
backup_time=`date +%H-%M-%S`
# 备份日期
backup_week_day=`date +%u` # 设置备份线程数
backup_thread= # 创建相关目录
log_dir=../log
var_dir=../var
mkdir -p $backup_dir
mkdir -p $log_dir
mkdir -p $var_dir # 全量备份
function full_backup() {
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} mkdir -p $backup_dir/$backup_folder
# 可以添加 --slave-info 这个参数,在备份从库的时候直接恢复成主库,否则就只能当成主库来恢复了
  $xtrabackup_dir/bin/innobackupex   --defaults-file=$mysql_conf_file --user=$user --password=$password --parallel=$backup_thread --no-timestamp  $backup_dir/$backup_folder > $log_dir/${backup_folder}.log >&
return $?
} # 增量备份
function increment_backup() {
backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
incr_base_folder=`sed -n '$p' $index_file | \
awk -F '[, {}]*' '{print $3}' | \
awk -F ':' '{print $2}'` mkdir -p $backup_dir/$backup_folder
$xtrabackup_dir/bin/innobackupex \
--defaults-file=$mysql_conf_file \
--user=$user \
--password=$password \
--no-timestamp \
--incremental \
$backup_dir/$backup_folder \
--incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log >&
return $?
} # 删除之前的备份(一般在全备完成后使用)
function delete_before_backup() {
cat $index_file | awk -F '[, {}]*' '{print $3}' | \
awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \
/bin/bash cat $index_file | awk -F '[, {}]*' '{print $3}' | \
awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \
/bin/bash
} # 备份索引文件
function backup_index_file() {
cp $index_file ${index_file}_$(date -d "1 day ago" +%F)
} # 备份索引文件
function send_index_file_to_remote() {
echo 'send index file ok'
} # 添加索引, 索引记录了当前最新的备份
function append_index_to_file() {
echo "{week_day:$backup_week_day, \
dir:${}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${}, \
date:${backup_date}}" >> $index_file
} # 记录 错误消息到文件
function logging_backup_err() {
echo "{week_day:$backup_week_day, \
dir:${}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${}, \
date:${backup_date}}" >> $error_log
} # 清空索引
function purge_index_from_file() {
> $index_file
} # 清空错误日志信息
function purge_err_log() {
> $error_log
} # 打包备份
function tar_backup_file() {
echo "tar $1 ok"
} # 发送备份到远程
function send_backup_to_remote() {
echo "send $1 remote ok"
} # 判断是应该全备还是增量备份
# :full, :incr
function get_backup_type() {
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
backup_type=
if [ "$full_backup_week_day" -eq `date +%u` ]; then
backup_type=
else
backup_type=
fi
if [ ! -n "`cat $index_file`" ]; then
backup_type=
fi
return $backup_type
} # 测试配置文件正确性
function test_conf_file() {
# 判断每个变量是否在配置文件中有配置,没有则退出程序
if [ ! -n "$user" ]; then echo 'fail: configure file user not set'; exit ; fi
if [ ! -n "$password" ]; then echo 'fail: configure file password not set'; exit ; fi
if [ ! -n "$backup_dir" ]; then echo 'fail: configure file backup_dir not set'; exit ; fi
if [ ! -n "$full_backup_week_day" ]; then echo 'fail: configure file full_backup_week_day not set'; exit ; fi
if [ ! -n "$full_backup_prefix" ]; then echo 'fail: configure file full_backup_prefix not set'; exit ; fi
if [ ! -n "$increment_prefix" ]; then echo 'fail: configure file increment_prefix not set'; exit ; fi
if [ ! -n "$mysql_conf_file" ]; then echo 'fail: configure file mysql_conf_file not set'; exit ; fi
if [ ! -n "$error_log" ]; then echo 'fail: configure file error_log not set'; exit ; fi
if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set'; exit ; fi
} # 执行
function run() {
# 检测配置文件值
test_conf_file # 判断是执行全备还是曾量备份
get_backup_type
backup_type=$?
case $backup_type in
)
# 全量备份
full_backup
backup_ok=$?
if [ -eq "$backup_ok" ]; then
# 全备成功
# # 打包最新备份
# tar_backup_file $full_backup_prefix
# # 将tar备份发送到远程
# send_backup_to_remote $full_backup_prefix
# 备份索引文件
backup_index_file
# # 发送索引文件到远程
# send_index_file_to_remote
# 清除之前的备份
delete_before_backup
# 清除索引文件
purge_index_from_file
# 添加索引, 索引记录了当前最新的备份
append_index_to_file $full_backup_prefix
else
# 全备失败
# 删除备份目录
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err $full_backup_prefix
fi
;;
)
# 增量备份
increment_backup
backup_ok=$?
if [ -eq "$backup_ok" ]; then
# 增量备份成功
# # 打包最新备份
# tar_backup_file $increment_prefix
# # 将tar备份发送到远程
# send_backup_to_remote $increment_prefix
# 添加索引, 索引记录了当前最新的备份
append_index_to_file $increment_prefix
else
# 增量备份失败
# 删除备份目录
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err $increment_prefix
fi
;;
esac
} run
chown -R apache.users /data/MySQL_Data_Backup # 配置文件 [root@newcms:/usr/local/worksh/xtrabackup_cron]# cat conf/mysql_increment_hot_backup.conf
# mysql 用户名
user=backuser # mysql 密码
password="pass" # 备份存放路径
backup_dir=/data/MySQL_Data_Backup # percona-xtrabackup 备份软件路径
xtrabackup_dir=/usr # 全备是在一周的第几天
full_backup_week_day= # 全量备信息名称 前缀
full_backup_prefix=full # 增量备信息名称 前缀
increment_prefix=incr # mysql配置文件
mysql_conf_file=/etc/my.cnf # 错误日志文件(更具此文件知道备份是否成功)
# format:
# {week_day:,dir:full/incr_2015--29_00--00_7,type:full/incr,date:--}
error_log=../var/mysql_increment_hot_backup.err # 索引文件
# format:
# {week_day:,dir:full/incr_2015--29_00--00_7,type:full/incr}
index_file=../var/mysql_increment_hot_backup.index

使用innobackupex进行mysql的差异备份还原和延迟复制的更多相关文章

  1. 日志备份和差异备份还原中的常见问题示例(转自&邹建)

    --创建测试 CREATE DATABASE db GO    --正常备份 BACKUP DATABASE db TO DISK='c:\1.bak' WITH FORMAT BACKUP LOG  ...

  2. Mysql 二进制日志备份还原

    Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...

  3. mysql innobackupex xtrabackup 大数据量 备份 还原

    大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推荐xtrabackup,这个工具比mysqldump要快很多. 一.Xtrabackup介绍 1, ...

  4. mysql innobackupex xtrabackup 大数据量 备份 还原(转)

    原文:http://blog.51yip.com/mysql/1650.html 作者:海底苍鹰 大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推 ...

  5. Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)

    备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...

  6. mysqldump工具实现mysql数据库的备份还原

    简介 冷.温.热备份 冷备:读写操作均不可进行 温备:读操作可执行:但写操作不可执行 热备:读写操作均可执行 MyISAM:温备,不支持热备 InnoDB:都支持 不管是热备还原还是冷备还原,还原时都 ...

  7. SQL Server的差异备份还原

    在SQL Server中还原差异备份,需要先还原在差异备份时间点之前的一个完整备份,在还原完整备份时要加上NORECOVERY参数,示例SQL语句如下: RESTORE DATABASE [数据库名称 ...

  8. Sql server 2008 的完成备份和差异备份还原

    当数据库数据量不大的情况下用 Sqlserver 的完全备份就完全可以了 步骤为: 1.在需要还原的数据库上右键选择如图 2.在“常规”选项中点击“源设备”选取磁盘上备份好的.bak文件后,勾上“还原 ...

  9. mysql数据库数据备份还原

    1.直接在命令行里面执行 备份一个数据库:mysqldump -h server -u username -p password db_name > database-sqlbkp_`date ...

随机推荐

  1. 前端模板引擎artTemplate.js

    . 关于artTemplate模板引擎的详细原理请移步高性能JavaScript模板引擎原理解析,本文只探讨如何使用.初学前端的人一般对于绑定数据都是使用原生js或者jquery来拼接字符串,此为ha ...

  2. loj10017. 「一本通 1.2 练习 4」传送带(三分套三分)

    题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  3. 如何开发一个异常检测系统:使用什么特征变量(features)来构建异常检测算法

    如何构建与选择异常检测算法中的features 如果我的feature像图1所示的那样的正态分布图的话,我们可以很高兴地将它送入异常检测系统中去构建算法. 如果我的feature像图2那样不是正态分布 ...

  4. File upload - MIME type

    Your goal is to hack this photo galery by uploading PHP code.Retrieve the validation password in the ...

  5. Daily consumption

    Bill record, standard of living, record every consumption, income, expenditure, manage your own life

  6. 【测试题】sequence

    题目 给定一个长度为n(n<=5000)的由['0'..'9']组成的字符串s,v[i,j]表示由字符串s第i到第j位组成的十进制数字. 将它的某一个上升序列定义为:将这个字符串切割成m段不含前 ...

  7. eslint Cannot read property 'range' of null错误

    eslint Cannot read property 'range' of null错误   手动添加的配置,2个项目OK,还个项目 运行报错 Cannot read property 'range ...

  8. ES6基础-变量的解构赋值

    作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...

  9. KVM系统镜像制作

    使用virt-install创建虚拟机并安装GuestOS virt-install是一个命令行工具,它能够为KVM.Xen或其它支持libvirt API的hypervisor创建虚拟机并完成Gue ...

  10. mac切图

    1.按住command键位, 两只手指点击需要切的图 2.再在右边栅格化图层 3.选中需要剪切的图层.command+c 和command+n和 command+v OK 切整张图.先 option ...