3.30. 数据库备份

3.30.1. 备份数据库

#!/bin/bash
#
# Filename:
# backupdatabase.sh
# Description:
# backup cms database and remove backup data before 7 days
# crontab
# 55 23 * * * /bin/sh /yundisk/cms/crontab/backupdatabase.sh >> /yundisk/cms/crontab/backupdatabase.log 2>&1

DATE=`date +%Y-%m-%d`
OLDDATE=`date +%Y-%m-%d -d '-7 days'`

#MYSQL=/usr/local/mysql/bin/mysql
#MYSQLDUMP=/usr/local/mysql/bin/mysqldump
#MYSQLADMIN=/usr/local/mysql/bin/mysqladmin

BACKDIR=/yundisk/cms/database
[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}
[ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE}
[ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE}

mysqldump --default-character-set=utf8 --no-autocommit --quick --hex-blob --single-transaction -uroot  cms_production  | gzip > ${BACKDIR}/${DATE}/cms-backup-${DATE}.sql.gz
echo "Database cms_production and bbs has been backup successful"
/bin/sleep 5

aws s3 cp ${BACKDIR}/${DATE}/* s3://example-share/cms/databackup/

使用mysqldump进行mysql数据库备份的完整shell

http://www.04007.cn/article/1050.html

3.30.2. Linux定时备份数据库到COS

https://www.naraku.cn/posts/92.html

3.30.3. Centos环境下编写mysql定时备份脚本

数据库备份是应用容灾处理很关键的一个部分,数据是一切,在应用出现问题,特别是数据出问题时, 数据的备份就显得尤为关键,我在工作中也遇到过类似的情况,都是备份的数据拯救了整个业务, 下面就是相关脚本,修改下相关的配置,然后放到系统里定时执行即可。

#!/bin/bash
# 初始化时,创建相应目录
# mkdir /home/node/bakmysql/sql/

# 定时任务
# 每天凌晨1:00执行备份脚本
#0 1 * * * /bin/bash -x /home/node/bakmysql/backup.sh >/dev/null 2>&1
#2分钟运行一次-测试用
#*/2 * * * * /bin/bash -x /home/node/bakmysql/backup.sh >/dev/null 2>&1

BakDir=/home/node/bakmysql/sql
LogFile=/home/node/bakmysql/sql/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql


# 导出到本地
mysqldump -uroot -p123456 test --quick --single-transaction | gzip > $DumpFile.gz
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo [FullBack] 开始:$Begin 结束:$Last $DumpFile.gz successful >> $LogFile


# 删除7天前的备份文件
find $BakDir -mtime +7 -type f -name "*.sql.gz" | xargs rm -f

你需要做的就是修改数据库配置,然后就是配置一下定时任务即可

3.30.4. MySQL数据库分库备份

数据库密码保存在/etc/my.cnf文件中,所以在执行与mysql相关的命令不需要输入密码

分库备份思路:

mysqldump  db1 >db1.sql.gz
mysqldump  db2 >db2.sql.gz

拿到库名

mysql  -e 'show databases' |sed '1d' |grep -v "_schema"

1.注释版

#!/bin/bash
# author: xiongminghao
# mail: jasonminghao@163.com
# describe:Mysql database backup
# 定义变量
IP=$(ifconfig eth1 |awk 'NR==2{print $2}')
Path=/backup/database  # 备份目录路径
Time=$(date +%F)
Ba_Path=$Path/$Time
Ba_Logs=/var/log/db_database_$Time # 定义一个存放日志的文件
Md5_Path=$Path/$Time/md5 # 定义一个存放md5校验的目录


# 创建两个目录以当天时间为命名
[ ! -d $Ba_Path ] && mkdir $Ba_Path
[ ! -d $Md5_Path ] && mkdir $Md5_Path

# 循环获取数据库名进行备份和生成MD5校验文件
for dbname in `mysql  -e 'show databases' |sed '1d' |grep -v "_schema"`
do
# 判断是否有数据库已经备份了,如果备份了则continue 调出当次循环,否则进行备份

if [ ! -f $Ba_Path/${dbname}.sql.gz ];then

   # 备份参数
   # -B 增加use[name]语句, -R 备份存储过程和函数数据
   # --master=data2 记录备份时刻的binlog位置点,2表示将其位置点注释
   # --single-ransaction 对innodb引擎进行热备(对数据进行快照)
   # gzip 对备份的数据进行gzip压缩
   mysqldump  -B -R --master-data=2 --single-transaction  |gzip >$Ba_Path/${dbname}.sql.gz
   RETVAL=$?

   # 通过返回值判断备份是否执行成功,把执行的成功与否纪录到日志中
   [ $? -eq 0 ] && echo "${dbname} successful" >>$Ba_Logs || echo "${dbname} failed" >>$Ba_Logs

   # 对数据库的数据完整性做MD5校验
   md5sum $Ba_Path/${dbname}.sql.gz  >$Md5_Path/${dbname}_md5.log

 else
    # 如果备份已存在则跳出当次循环,进行下次循环
    continue

  fi
done

# 将备份日志结果邮件方式发送给管理员
 mail -s "$HOSTNAME $IP" jasonminghao@163.com < $Ba_Logs

3.30.5. MySQL数据库分库分表备份

数据库密码保存在/etc/my.cnf文件中,所以在执行与mysql相关的命令不需要输入密码

分库分表备份思路:

#库名db1,两张表
mysqldump  db1 table01 >db1_table01.sql.gz
mysqldump  db1 table02 >db1_table01.sql.gz

#库名db2,两张表
mysqldump  db2 table01 >db2_table01.sql.gz
mysqldump  db2 table02 >db2_table02.sql.gz

拿到表名列表

mysql  -e "show tables from db1;" |sed 1d

1.注释版

#!/bin/bash
# author: xiongminghao
# mail: jasonminghao@163.com
# describe:Mysql database table backup
# 定义变量
IP=$(ifconfig eth1 |awk 'NR==2{print $2}')
Path=/backup/table # 备份目录
Time=$(date +%F)
Ba_Path=$Path/$Time
Ba_Logs=/var/log/db_table_$Time  # 定义一个存放日志的文件
Md5_Path=$Path/$Time/md5 # 定义一个存放md5校验的目录

# 创建两个目录以当天时间为命名
[ ! -d $Ba_Path ] && mkdir $Ba_Path
[ ! -d $Md5_Path ] && mkdir $Md5_Path

# 循环获取数据库名
for dbname in `mysql  -e 'show databases' |sed '1d' |grep -v "_schema"`
do

  # 循环获取到数据库名后再次循环获取到该库名下的表,进行备份和MD5校验
  for tablename in `mysql -e "show tables from $dbname" |sed '1d'`
  do

  # 判断是否有表已经备份了,如果备份了则continue 调出当次循环,否则进行备份
  if [ ! -f $Ba_Path/${dbname}_${tablename}.sql.gz ];then

   mysqldump -R --master-data=2 --single-transaction  ${dbname} ${tablename} |gzip >$Ba_Path/${dbname}_${tablename}.sql.gz
   RETVAL=$?

   # 通过返回值判断备份是否执行成功,把执行的成功与否纪录到日志中
   [ $? -eq 0 ] && echo "${dbname}_${tablename} successful" >>$Ba_Logs || echo "${dbname}_${tablename} failed" >>$Ba_Logs
   # 对表的数据完整性做MD5校验
   md5sum $Ba_Path/${dbname}_${tablename}.sql.gz  >$Md5_Path/${dbname}_${tablename}_md5.log

 else
    continue

  fi
 done
done
# 将备份日志结果邮件方式发送给管理员
mail -s "$HOSTNAME $IP" jasonminghao@163.com < $Ba_Logs