Linux集群和自动化维2.6.1 备份类脚本

简介:

2.6.1 备份类脚本


俗话说得好,备份是救命的稻草。特别是重要的数据和代码,这些都是公司的重要资产,所以备份是必须的。备份能在我们不慎执行了一些毁灭性的工作之后(比如不小心删除了数据),进行恢复工作。许多有实力的公司在国内好几个地方都设有灾备机房,而且用的都是价格不菲的EMC高端存储。可能会有朋友要问:如果我们没有存储怎么办?这点可以参考一下笔者公司的备份策略,即:在执行本地备份的同时,让Shell脚本自动上传数据到另一台FTP备份服务器中,这种异地备份策略成本比较小,无须存储,而且安全系统高,相当于双备份,本地和异地同时出现数据损坏的概率几乎是不可能的。

此双备份策略的具体步骤如下。

首先,做好准备工作。先安装一台CentOS 6.4 x86_64的备份服务器,并安装vsftpd服务,稍微改动一下配置后启动。另外,关于vsftpd的备份目录,可以选择做RAID1或RAID5的分区或存储。

vsftpd服务的安装如下,CentOS 6.4 x86_64下自带的yum极为方便。

yum -y install vsftpd

service vsftpd start

chkconfig vsftpd on

vsftpd的配置比较简单,详细语法略过,这里只给出配置文件,可以通过组合使用如下命令直接得出vsftpd.conf中有效的文件内容:

grep -v "^#" /etc/vsftpd/vsftpd.conf | grep -v '^$'

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=YES

chroot_local_user=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

chroot_local_user=YES这条语句需要重点强调一下。它的作用是对用户登录权限进行限制,即所有本地用户登录vsftpd服务器时只能在自己的家目录下,这是基于安全的考虑,笔者在编写脚本的过程中也考虑到了这点,如果大家要移植此脚本到自己的工作环境中,不要忘了这条语句,不然的话异地备份极有可能会失效。

另外,我们在备份服务器上应该建立备份用户,例如svn,并为其分配密码,还应该将其家目录更改为备份目录,即/data/backup/svn-bakcup,这样的话更方便备份工作,以下备份脚本依此类推。

1.版本控制软件SVN代码库的备份脚本

版本控制软件SVN的重要性在这里就不再多说了,现在很多公司基本还是利用SVN作为提交代码集中管理的工具,所以做好其备份工作的重要性就不言而喻了。这里的轮询周期为30天一次,Shell会自动删除30天以前的文件。在vsftpd服务器上建立相应的备份用户svn的脚本内容如下(此脚本在CentOS 5.8 x86_64下已测试通过):

#!/bin/sh

SVNDIR=/data/svn

SVNADMIN=/usr/bin/svnadmin

DATE=`date +%Y-%m-%d`

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

BACKDIR=/data/backup/svn-backup

 

[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}

LogFile=${BACKDIR}/svnbak.log

[ -f ${LogFile} ] || touch ${LogFile}

mkdir ${BACKDIR}/${DATE}

 

 

for PROJECT in myproject official analysis mypharma

do

  cd $SVNDIR

  $SVNADMIN hotcopy $PROJECT  $BACKDIR/$DATE/$PROJECT --clean-logs

  cd $BACKDIR/$DATE

  tar zcvf ${PROJECT}_svn_${DATE}.tar.gz $PROJECT  > /dev/null

  rm -rf $PROJECT

sleep 2

done

 

HOST=192.168.2.112

FTP_USERNAME=svn

FTP_PASSWORD=svn101

 

cd ${BACKDIR}/${DATE}

 

ftp -i -n -v << !

open ${HOST}

user ${FTP_USERNAME} ${FTP_PASSWORD}

bin

cd ${OLDDATE}

mdelete *

cd ..

rmdir ${OLDDATE}

mkdir ${DATE}

cd ${DATE}

mput *

bye

!

2. MySQL从数据库备份脚本

主MySQL脚本跟其比较类似,主要是用MySQL自带的命令mysqldump 进行备份的。这里要说明的是,本地的轮询周期为20天,vsftpd的轮询周期为60天,备份后就算是用gzip压缩,MySQL的数据库还是很大,大家可以根据实际需求来更改这个时间,注意不要让数据库撑爆你的备份服务器。由于是内部开发环境,密码设置得比较简单,如果要将其移植到自己的公网服务器上,就要在安全方面多注意一下了。另外附带说明的是,--opt只是一个快捷选项,等同于同时添加 --add-drop-tables  --add-locking  --create-option  --disable-keys  --extended-insert  --lock-tables --quick --set-charset 选项。本选项能让mysqldump很快地导出数据,并且导出的数据可以很快被导回。该选项默认是开启的,可以用--skip-opt将其禁用。注意,如果运行mysqldump没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出的是大数据库则可能会出现问题,脚本内容如下(此脚本在CentOS 5.8 x86_64下已测试通过):

#!/bin/bash

USERNAME=mysqlbackup

PASSWORD=mysqlbackup

DATE=`date +%Y-%m-%d`

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

FTPOLDDATE=`date +%Y-%m-%d -d '-60 days'`

MYSQL=/usr/local/mysql/bin/mysql

MYSQLDUMP=/usr/local/mysql/bin/mysqldump

MYSQLADMIN=/usr/local/mysql/bin/mysqladmin

SOCKET=/tmp/mysql.sock

BACKDIR=/data/backup/db

 

[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}

[ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE}

[ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE}

 

for DBNAME in mysql test report

do

   ${MYSQLDUMP} --opt -u${USERNAME} -p${PASSWORD} -S${SOCKET} ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz

   echo "${DBNAME} has been backup successful"

   /bin/sleep 5

done

 

HOST=192.168.4.45

FTP_USERNAME=dbmysql

FTP_PASSWORD=dbmysql

cd ${BACKDIR}/${DATE}

ftp -i -n -v << !

open ${HOST}

user ${FTP_USERNAME} ${FTP_PASSWORD}

bin

cd ${FTPOLDDATE}

mdelete *

cd ..

rmdir ${FTPOLDDATE}

mkdir ${DATE}

cd ${DATE}

mput *

bye

!

3. MySQL数据备份至S3文件系统

这里先来介绍下亚马逊的分布式文件系统S3,S3为开发人员提供了一个高可扩展(Scalability)、高持久性(Durability)和高可用(Availability)的分布式数据存储服务。它是一个完全针对互联网的数据存储服务,借助一个简单的Web服务接口就可以通过互联网在任何时候访问S3上的数据。当然存放在S3上的数据要可以进行访问控制以保障数据的安全性。这里所说的访问S3包括读、写、删除等多种操作。在脚本的最后,采用AWS S3命令中的cp将MySQL上传至s3://example-shar这个bucket上面(S3详细资料介绍http://aws.amazon.com/cn/s3/),脚本内容如下所示(此脚本在Amazon Linux AMI x86_64下已测试通过):

#!/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/

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
1078 3
Linux系统初始化脚本
|
12月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
987 9
|
12月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
1031 2
|
12月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1082 1
二、Linux文本处理与文件操作核心命令
|
12月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
787 137
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
1298 143
linux命令—tree
|
12月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1722 58
|
11月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1654 2
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
908 16
|
12月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
1034 0
Linux内存问题排查命令详解