备份数据库脚本
#!/bin/bash
#数据库IP
#数据库库备份
dbserver='172.16.70.xxx' #数据库地址
#数据库用户名
dbuser='root'
#数据密码
dbpasswd='nzroot'
#数据库,如有多个库用空格分开
dbname='auth_db farm_etian etian_daohang lovol-bigdata xxl-job'
#备份时间
backtime=`date +%Y%m%d`
#脚本执行时间
rtime=$(date "+%Y-%m-%d %H:%M:%S")
#备份输出日志路径
logpath='/data/demo/mysql_bak_log'
#备份文件地址
sqlbakpath='/data/demo'
echo "################## ${rtime} #############################" >> ${logpath}/mysqlback.log
echo "开始备份"
#日志记录头部
echo "" >> ${logpath}/mysqlback.log
echo "-------------------------------------------------" >> ${logpath}/mysqlback.log
echo "备份时间为${rtime},备份数据库 ${dbname} 开始" >> ${logpath}/mysqlback.log
#正式备份数据库
for table in $dbname; do
source=`mysqldump -h ${dbserver} -u ${dbuser} -p${dbpasswd} ${table} > ${sqlbakpath}/${backtime}.sql` 2>> ${logpath}/mysqlback.log;
#备份成功以下操作
if [ "$?" == 0 ];then
cd $sqlbakpath
#为节约硬盘空间,将数据库压缩
tar zcf ${table}${backtime}.tar.gz ${backtime}.sql > /dev/null
#删除原始文件,只留压缩后文件
rm -f ${sqlbakpath}/${backtime}.sql
#删除七天前备份,也就是只保存7天内的备份
find $sqlbakpath -name "*.tar.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
echo "数据库 ${table} 备份成功!!" >> ${logpath}/mysqlback.log
else
#备份失败则进行以下操作
echo "数据库 ${table} 备份失败!!" >> ${logpath}/mysqlback.log
fi
done
echo "完成备份" >> ${logpath}/mysqlback.log
echo "################## ${rtime} #############################" >> ${logpath}/mysqlback.log
修改sql文件,选择数据库 mysql -uroot -p密码 数据库名 < mysql_all_bak.sql
source /data/mysql_all_bak.sql
解释
command 反引号
command与$(command)的含义相同,都是返回当前执行命令的结果
$? 状态值 (status variable)
一般来说,UNIX(linux) 系统的进程以执行系统调用exit()来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。 一般指令程序倘若执行成功,其回传值为 0;失败为 1。 tar -cvfz dfbackup.tar.gz /home/user > /dev/nullecho"?\"$$ 由于进程的ID是唯一的,所以在同一个时间,不可能有重复性的PID。有时,script会需要产生临时文件,用来存放必要的资料。而此script亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$或许可以符合这种需求。它代表当前shell 的 PID。 echo \"HOSTNAME, MAIL" > ftmp.$$ 使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。 ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法,如果script 执行完毕后仍不加以清除,会产生其他问题。