结合Git实现Mysql差异备份,可用于生产环境
埋头苦干多年一直没写过文章,今天突发狂想,为LNMP阵营贡献一些力量。就从平时工作过程中的心得和一些技巧分享出来。今天就猿们最熟悉的Mysql开始宅鸟的开篇博客文章。欢迎猿们拍砖、转载。
注意:宅鸟的测试环境和生产环境为ubuntu
Mysql是程序猿和运维猿最关心的开发利器之一,今天就来谈谈Mysql的日常备份之宅鸟见.
常见的Mysql备份方法很多在此不在赘述。直上干货!
本shell脚本运行需要安装
git
ssh
要求读者对mysql,git,ssh,shell有一定了解
本脚本功能:把远程mysqlserver通过脚本配置的白名单和黑名单把指定数据库sql文件利用git版本控制备份到localserver指定目录下,
通过版本控制git查看数据库表数据的变化
预先配置好从localserver->mysqlserver的免密码登录(配置过程)
localserver(192.168.1.110)
db_backup_local.sh
#!/bin/bash
#created by lihuibin
#date 2013-8-30
#desc backup mysqlsql file from mysqlserver to localserver
tar_path="/root/mysql_backup"
ssh root@192.168.1.120 /root/shell/db_backup.sh
[ -d $tar_path ] && cd $tar_path; git pull || git clone root@192.168.1.20:/root/shell/mysql_backup.git
mysqlserver(192.168.1.120)
假设mysqlserver服务器上有testdb1,testdb2,exdb1,exdb2四个数据库
脚本位置:/root/shell/db_backup.sh
#!/bin/bash
#created by lihuibin
#date 2013-8-30
#desc exec mysqldump mysqlsql file from mysqlserver to git
time=`date '+%F %R'`
mysql_user="backup_user"
mysql_password="backup_passwd"
mysql_host="127.0.0.1"
mysql_port="3306"
tar_path=/root/shell/mysql_backup
backup_db_arr=("testdb1" "testdb2") #需要备份的数据库列表
#backup_db_arr=()
exclude_db_arr=("exdb1" "exdb2") #排除备份的数据库列表 当backup_db_arr为空的时候,exclude_db_arr生效,不为空时仅backup_db_arr有效
[ -d $tar_path ]
is_first_backup=$?
in_array() {
local hay needle=$1
shift
for hay; do
[[ $hay == $needle ]] && return 0
done
return 1
}
backup_length=${#backup_db_arr[@]}
#echo $backup_length
exclude_length=${#exclude_db_arr[@]}
#echo $exclude_length;
#in_array "dopool_blog" ${backup_db_arr[@]} && echo hit || echo miss
for dbname in `mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show databases" |sed '1,2d'`
do
if [ $backup_length -gt 0 ]; then
in_array $dbname ${backup_db_arr[@]} || continue
elif [ $backup_length -eq 0 -a $exclude_length -gt 0 ]; then
in_array $dbname ${exclude_db_arr[@]} && continue
fi
for tablename in `mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "show tables from $dbname" |sed '1d'`
do
mkdir -p $tar_path/$dbname/
/usr/bin/mysqldump --lock-tables=TRUE --extended-insert=FALSE --complete-insert=TRUE -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname $tablename > $tar_path/$dbname/$tablename.sql
done
done
init_git(){
tar_path=`dirname $1`
dir_name=`basename $1`
cd $1
git init
git add .
git commit -a -m "init $time"
cd $tar_path
git clone --bare $dir_name/
rm -rf $dir_name
git clone $dir_name.git
}
[ $is_first_backup -eq 1 ] && init_git $tar_path || {
cd $tar_path;
git add .;
git commit -a -m " back up $time";
git push;
}
脚本执行后,就可以结合git的tig、diff命令查看每次备份的中数据库表中版本变化
干活吐槽结束 有不足之处,欢迎拍砖!!!
结合Git实现Mysql差异备份,可用于生产环境的更多相关文章
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- mysql_secure_installation 安全安装(用于生产环境设置)
编译安装完mysql5.6,如果用于生产环境,最好执行mysql_secure_installation来做一些常规化安全设置. 需要提前将~mysql/bin加入环境变量 /apps/mysql// ...
- 基于redis的分布式锁(不适合用于生产环境)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- Linux MySQL差异备份技巧
MSSQL差异备份使用技巧 15 Apr 2013 所谓的差异备份,就是只备份最近一次备份之后到此次备份之前所增加的那一部分数据.打个比方我第N次备份后数据库存放的内容是ABCD,然后我第N+1次 备 ...
- MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战
本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...
- 8 个用于生产环境的 SQL 查询优化调整
在没有数据仓库或单独的分析数据库的组织中,报告的唯一来源和最新的数据可能是在现场生产数据库中. 在查询生产数据库时,优化是关键.一个低效的查询可能会对生产数据库产生大量的资源消耗,如果查询有错误会引发 ...
- Ocelot中文文档-Raft(实验功能不能用于生产环境)
Ocelot最近整合了Rafty,这是我在去年一直研究的Raft的一个实现. 这个项目实验性非常强,所以在我认为它没问题之前,请不要在生产环境中使用Ocelot的这个功能. Raft是一种分布式一致性 ...
- mysql定时备份任务
简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份.而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份.首先我们来简单了解crontab指令,如果你会了请 ...
- MySQL的备份和恢复-mysqldump
MySQL的备份和恢复-mysqldump 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么需要备份 1>.做灾难恢复 天有不测风云嘛,如果你的服务器被黑客攻击了(比 ...
随机推荐
- Mac 上SVN上传.a文件
SVN默认是忽略.a文件,所以修改配置文件去掉忽略配置行的 *.a 通过终端打开配置文件: open ~/.subversion/config 把下面两行(也可能是一行)中的注释和*.a去掉, #gl ...
- $.ajax获取不到数据问题解决
$("#updateflow").click(function () { $.ajaxSetup({ contentType: "application/json;cha ...
- php 循环向<select>添加选项
在控制器内:$this->assign('data',$data);
- C++学习17派生类的构造函数
基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...
- ios开发下的点透处理
界面上有一个浮动的div,这个div下面有一个文本框,当给这个div绑定touchstar后,做了冒泡的处理代码,还是会出现点透现象,触发下面的的文本框事件.立马弹出一个输入法出来. 1.网上有一种方 ...
- struts2中action中的通配符
struts中一个正常的最普通不过的action是这样子的 <package name="default1" namespace="/gys" exten ...
- ppm与毫克/立方米怎么换算
ppm是溶液浓度(溶质质量分数)的一种表示方法,1升水溶液中有1毫克的溶质,g/m3或mg/L. 对于气体:,一百万体积的空气中所含污染物的体积数. 而按我国规定,特别是环保部门,则要求气体浓度以质量 ...
- HDU 4081 Qin Shi Huang's National Road System [次小生成树]
题意: 秦始皇要建路,一共有n个城市,建n-1条路连接. 给了n个城市的坐标和每个城市的人数. 然后建n-2条正常路和n-1条魔法路,最后求A/B的最大值. A代表所建的魔法路的连接的城市的市民的人数 ...
- Redis集群功能概述
在单机Redis中介绍过Redis的复制特性以及Redis Sentinel和twemproxy,其中: 复制:可以创建指定服务器的复制品,这些复制品可以用户扩展系统处理读请求的能力: Redis S ...
- Codeforces Round #223 (Div. 2) A
A. Sereja and Dima time limit per test 1 second memory limit per test 256 megabytes input standard i ...