使用innobackupex进行mysql的差异备份还原和延迟复制
使用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的差异备份还原和延迟复制的更多相关文章
- 日志备份和差异备份还原中的常见问题示例(转自&邹建)
--创建测试 CREATE DATABASE db GO --正常备份 BACKUP DATABASE db TO DISK='c:\1.bak' WITH FORMAT BACKUP LOG ...
- Mysql 二进制日志备份还原
Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...
- mysql innobackupex xtrabackup 大数据量 备份 还原
大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推荐xtrabackup,这个工具比mysqldump要快很多. 一.Xtrabackup介绍 1, ...
- mysql innobackupex xtrabackup 大数据量 备份 还原(转)
原文:http://blog.51yip.com/mysql/1650.html 作者:海底苍鹰 大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推 ...
- Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)
备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...
- mysqldump工具实现mysql数据库的备份还原
简介 冷.温.热备份 冷备:读写操作均不可进行 温备:读操作可执行:但写操作不可执行 热备:读写操作均可执行 MyISAM:温备,不支持热备 InnoDB:都支持 不管是热备还原还是冷备还原,还原时都 ...
- SQL Server的差异备份还原
在SQL Server中还原差异备份,需要先还原在差异备份时间点之前的一个完整备份,在还原完整备份时要加上NORECOVERY参数,示例SQL语句如下: RESTORE DATABASE [数据库名称 ...
- Sql server 2008 的完成备份和差异备份还原
当数据库数据量不大的情况下用 Sqlserver 的完全备份就完全可以了 步骤为: 1.在需要还原的数据库上右键选择如图 2.在“常规”选项中点击“源设备”选取磁盘上备份好的.bak文件后,勾上“还原 ...
- mysql数据库数据备份还原
1.直接在命令行里面执行 备份一个数据库:mysqldump -h server -u username -p password db_name > database-sqlbkp_`date ...
随机推荐
- Ueditor 自动设置上传图片的宽度或高度
Uedior在上传图片的生活,需要自动设置上传图片的宽度或高度属性.该方法只能用于多图上传组件,单图上传无法使用. 该方法基于 ueditor 1.4.3 版本制作: 1.添加属性字段,在config ...
- Invalid mime type "application nd.ms-excel; charset=utf-8;charset=utf-8": does not contain '/'
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...
- Dockerfile 常见指令的意义/常见的使用方式/使用示例/
一.什么是 Dockerfile ? Dockerfile 就是生成docker镜像的指令集, 通过使用docker工具执行这些指令集可以方便快捷地生成镜像, 并且能不断复用 Dockerfile 指 ...
- Mysql的安装与环境的配置
Mysql的安装与环境的配置 这里以Mysql5.5为例: (1)双击安装包,点击next (2)选择自定义,点击Next (3)修改路径,点击Next (4)选择精确配置,点击Next (5)选择开 ...
- springBoot 日志中关于profiles设置的源码解读
在启动SpringBoot应用是看到到如下日志,于是出于好奇查看了下源代码: 首先,StartpInfoLogger类,采用jcl-over-slf4j[即Apache Common Log]中的Lo ...
- Ruby for
#!/usr/bin/ruby -w# -*- coding: UTF-8 -*-for i in 1..5 print i," "endprint "\n"f ...
- 数组的filter方法处理数组内对象元素时,会改变原值
arr = [{n:11},{n:22},{n:33}] arr.filter(v=>v.n=8) console.log(arr) // [{n:8},{n:8},{n:8}]
- Spring搬迁
Spring简介 加载bean流程 Bean的生命周期 双亲委派 自定义类加载器 Spring事务 异步Async Spring设计模式 Spring单例 SpringMVC流程 备注:app ...
- PHP的简单了解
PHP 标识符/关键字/数据类型 标识符:其实标识符就是变量的名称,函数与类的名称也是标识符.PHP中标识符的规则: 1.标识符可以是任意长度的字母.数字.下划线,且不得以数字开头. 2.PHP中标识 ...
- PostgreSQL 慢查询SQL跟踪
PostgreSQL 开启慢SQL捕获在排查问题时是个很有效的手段.根据慢SQL让我在工作中真正解决了实际问题,很有帮助. PostgreSQL 日志支持的输出格式有 stderr(默认).csvlo ...