Chinaunix首页 | 论坛 | 博客
  • 博客访问: 460979
  • 博文数量: 237
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-12 14:40
个人简介

  每个人生的当口,都是会有一个孤独的时刻,四顾无人,只有自己,于是不得不看明白自己的脆弱,自己的欲望,自己的念想,自己的界限,还有,自己真正的梦想。

文章分类

全部博文(237)

文章存档

2017年(3)

2016年(234)

分类: Mysql/postgreSQL

2016-05-11 11:12:34


更新日期 2011-08-04

 

1   功能介绍

脚本名 bakrec_mysql.sh

脚本存放路径 保证统一

备份路径 须根据具体服务器的分区情况,放到一个剩余空间较大的分区.

备份目录名 统一为backupdb

 

 

各个参数说明如下:

-a: backup all database #全库备份

-e: backup each database#分库备份

-d: backup single/multi database#备份指定的一个库或者多个库

-t: backup single/multi table of single database#备份一个库下面的一个表或者多个表

-b: backup binlog#备份binlog日志,备份过程,每次记录最后的二进制文件号,将之前范围内的binlog打包(bz2格式),放在$DIR_BACKUP目录下

-r: recover all database(!require password!)#恢复全库,为保安全,恢复时需要输入密码

-o: recover single database/talbe,you should be designation database name(!require password!)#恢复单库或单表,恢复时需要输入密码

-p: create connect mysql password#创建连接mysql的密码文件,存放位置$DIR_MySQL/etc目录下,权限是600

-s: configuration rsyncd#创建rsyncd服务(backup机上有rsyncd服务,故不需要在每台DB server上创建rsyncd服务)

    If you want ceate a rsyncd, you should enter 'bakrec_mysql.sh -s cet'

    If you want restart rsyncd, you should enter 'bakrec_mysql.sh -s rst'

-c: sync to backup center#同步到backup

 

 

2   备份策略 2.1     分库备份

在脚本的LIST_EXCLUDE_DB='(test|information_schema|performance_schema)'可以过滤不备份的数据库.

备份路径 根据服务器具体分区情况而定

备份目录名统一 backupdb

 

 

关于是否打开binlog的函数解释

function backup()

{

read_pwd

LOGBIN_STATUS=`$CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW VARIABLES LIKE 'log_bin'" | gawk '{print $2}'`

if [ $LOGBIN_STATUS = "ON" ]; then

  MASTER='--master-data=2'

else

  MASTER=' '

fi

}

这个函数的功能是检测MySQL服务器有没有打开binlog日志,如果打开,则在备份的时候添加--master-data=2这个参数,否则不添加.

 

 

分库备份在脚本中的实现函数为backup_each

function backup_each()

{

backup

for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)

do

  $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER $db --databases |gzip >$HOSTNAME.$db.$TIME.sql.gz

done

# delete 7 days ago

for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)

do

  if [ ! -f $HOSTNAME.$db.$TIME_7.sql.gz ]; then

    echo

  else

    rm $HOSTNAME.$db.$TIME_7.sql.gz -f

  fi

done

}

功能说明:

依次备份除列表之外的所有库,在本机会自动删除7天之前的备份

2.2     binlog备份

binlog备份在脚本中的实现函数为backup_binlog

function backup_binlog()

{

if [ -s $DIR_BACKUP/mysql-bin.queue ]; then

  read POS < $DIR_BACKUP/mysql-bin.queue

  cd $DIR_DATA

  tar -jcvf $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME.bz2 `gawk -F'/' '{print $2}' $BINLOG_NAME.index |sed -n "/$POS/,//p"`

  cd -

  if [ -f $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 ]; then

    rm $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 -f

  fi

fi

# write last pos

gawk -F'/' '{print $2}' $DIR_DATA/$BINLOG_NAME.index | tail -n 1 >$DIR_BACKUP/mysql-bin.queue

}

逻辑如下:

1,如果检测到$DIR_BACKUP/mysql-bin.queue这个文件,并且文件大小大于0个字节.则读取这个文件内容,并付给变量POS,然后执行tar –jcvf命令,并删除7天之前的备份,否则直接执行gawk命令.

2,gawk命令的意思是把当前binlog日志的编号记录到$DIR_BACKUP/mysql-bin.queue文件内.

 

2.3     推到备份机

实现功能代码如下

  c)

    rsync -czrpt  --password-file=$DIR_BIN/bakrec_mysql.password $DIR_BACKUP/$TIME_YM backupdbuser@192.168.0.1::backup/$HOSTNAME

    result_status

    ;;

 

rsync参数的意思如下:

c: 打开校验开关,强制对文件传输进行校验

z: 对备份的文件在传输时进行压缩处理(节省网络带宽,消耗本机CPU)

r: 对子目录以递归模式处理

p: 保持文件权限

t: 保持文件时间信息

 

同步的目录$DIR_BACKUP/$TIME_YM

backup主机IP地址192.168.0.1

 

result_status函数功能,如果该语句执行失败,则发送邮件给db-request

 

2.4     backup机设置

backup机上面修改rsync配置,添加模块backup上面的配置如下

uid = root

gid = root

max connections = 10

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

 

[backupdb.cn5]

path = /backup

hosts allow = *

hosts deny = *

ignore errors

read only = no

list = no

auth users = user

secrets file = ****/password

 

说明

passwordrsync连接的密码文件,格式

user:password

权限600

 

3   使用说明 3.1     定义变量

根据服务器情况,可能会修改如下变量

DIR_MYSQL='/usr/local/mysql'

DIR_BACKUP="/tmp/backup"

 

对于rpm安装,或者非常规的安装,可能还需要修改

CMD_MYSQLDUMP="$DIR_MYSQL/bin/mysqldump"

CMD_MYSQL="$DIR_MYSQL/bin/mysql"

 

3.2     创建MySQL密码文件

执行脚本,-p参数,自动创建$DIR_MYSQL/etc/passwordfile文件,输入密码,脚本会自动写入该文件

 

# bash bakrec_mysql.sh  -p

Please enter MySQL(user=root)'s password:

 

验证密码文件创建成功与否,以及权限600

# ls -l $FILE_PASSWD

查看密码文件内容

# cat $FILE_PASSWD

 

3.3     创建rsync密码文件

权限600

3.4     测试备份与推送

bash –x 脚本名 测试的参数

可以看到脚本的执行过程.

 

-c参数是将备份目录内容,推送到backup

3.5     crontab设置

crontab执行脚本出错总结:

    1) 脚本本身问题

    2) 脚本执行权限问题

    3) 脚本名字拼写问题,指定了错误的脚本名

    4) 遗漏了脚本中需要的密码文件

    5) 备份的目录不存在

4   FAQ

问题补充

标记红色的password 要根据实际密码填写.

阅读(362) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~