. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
Hyson
 
Hyson 的头像
终极会员
 
资 料:
注册日期: Jul 2002
帖子: 35,872 声望值: 3
精华: 3,解答: 14
#1 旧 2019-02-15, 13:03:18 默认 【求助】定时备份MySQL数据库的crond指令怎么写才能执行?
Hyson 当前离线  

我借助https://crontab-generator.org/写了这么一段

代码:
0 */12 * * *  mysqldump -uroot -p123456 bbs > /backup/bbs-backup-$(date +%Y-%m-%d-%H:%M:%S).sql >/dev/null 2>&1
但是crontab -e编辑好后,它执行不起来,没见着备份的文件?

可是我自己手动执行却是好的,能备份的。

这命令是哪里出岔子了哪位知道?


宠辱不惊 闲看庭前野花开落
去留无意 漫随天外浮云卷舒
回复时引用此帖
飘雪
 
飘雪 的头像
高级会员
 
资 料:
注册日期: Jan 2002
帖子: 638 声望值: 3
精华: 0
#2 旧 2019-02-15, 13:46:44 默认
飘雪 当前离线  

先改成全路径试试


紧急下潜……下潜……下潜……下潜……下潜……下潜……
回复时引用此帖
xampere
 
xampere 的头像
超级会员
 
资 料:
注册日期: May 2008
帖子: 1,029 声望值: 5
精华: 0,解答: 2
#3 旧 2019-02-15, 13:50:47 默认
xampere 当前离线  

crontab里的%需转义
$(date +"\%Y-\%m-\%d")
回复时引用此帖
hefish
 
hefish 的头像
超级会员
 
资 料:
注册日期: Aug 2001
帖子: 1,380 声望值: 2
精华: 0,解答: 12
#4 旧 2019-02-15, 14:29:48 默认
hefish 当前离线  

cron 里面要手动定义一下PATH,不然他找不到mysqldump,抑或用全路径也成。
回复时引用此帖
jimmy_dong
 
jimmy_dong 的头像
管理员
 
资 料:
注册日期: Aug 2000
帖子: 5,252 声望值: 9
精华: 2,解答: 88
#5 旧 2019-02-15, 15:06:53 默认
jimmy_dong 当前离线  

crontab的经验:

1,写成 sh 文件
2,su -s /bin/sh
3,cd /

验证执行有效,然后再写到crontab。


给你贴一段线上用的:

#!/bin/sh
database="somedb"
file=/WORK3/dump_`date +%F_%T`.sql
rundir="/WORK/DB/server0"

echo "dump $database from $rundir"
/usr/local/mysql/bin/mysqldump --socket="$rundir"/mysql.sock --master-data=2 -u root -p`cat $rundir/mysql.security.ini` $database > $file


~~呵呵~~


……你呀,考虑一下吧,要快一点,你知道,肚子很快又饿了。 jimmy_dong@sina.com Oicq:816937

如果失去了“呵呵”,生活会是怎样?
回复时引用此帖
Hyson
 
Hyson 的头像
终极会员
 
资 料:
注册日期: Jul 2002
帖子: 35,872 声望值: 3
精华: 3,解答: 14
#6 旧 2019-02-15, 20:15:08 默认
Hyson 当前离线  

引用:
作者: xampere 查看帖子
crontab里的%需转义
$(date +"\%Y-\%m-\%d")
还真是!没想到有这个问题。

引用:
作者: hefish 查看帖子
cron 里面要手动定义一下PATH,不然他找不到mysqldump,抑或用全路径也成。
试了下,如果用软件包安装的mysql,倒是能成。

引用:
作者: jimmy_dong 查看帖子
crontab的经验:1,写成 sh 文件2,su -s /bin/sh3,cd /验证执行有效,然后再写到crontab。给你贴一段线上用的:#!/bin/shdatabase="somedb"file=/WORK3/dump_`date +%F_%T`.sqlrundir="/WORK......
没想到把董吉米大侠引来回答我的问题了

我把情况给大家报告一下。

为了能够让它这个定时任务迅速的测试,我最后把定时器设成了全是星星,就是说让它每分钟执行一次,然后我不停的修改命令,以便看出哪条命令是可行的。

首先,针对转义的问题,我没搞懂,但是一开始我加了\这个反斜杠之后,系统不报什么少个括号之类的错误了,也生成了数据库导出文件。然而,问题来了,导出的文件是零字节,也就是说,文件存在,但没有内容。

于是继续折腾,在网上搜索了一会儿,找到两处
https://www.linode.com/docs/databases/mysql/use-mysqldump-to-back-up-mysql-or-mariadb/

https://linuxize.com/post/how-to-back-up-and-restore-mysql-databases-with-mysqldump/

与我通过顶楼链接的自动生成器生成的命令不一样的是,它最后是没有什么 >/dev/null 和2>&1这个尾巴的,而我也弄不明白这个尾巴有什么用,就暂时不去管它了。

在上面两处教程中,例如,它给出的命令是这样的
引用:
0 3 * * * /usr/bin/mysqldump -u dbuser mydb > /home/username/db_backups/mydb-$(date +%Y%m%d).sql
也就是说,它没有转义问题,而我不用斜杠转义,系统就过不去。但是我从这两处教程中看到它们的处理方案有价值的部分是新增了MySQL的配置文件中加了些内容。如在用户目录下新增
代码:
[client]
user = root
password = 12345
类似这样的操作。我个人觉得吧,它就是让执行cron操作的时候获取操作MySQL的用户权限,但没搞懂为何
代码:
mysqldump -uroot -p12345
这样的操作不行。就算是在MySQL8中,也可以通过一个什么expire参数绕过。

于是我试了下,记得MySQL还是MariaDB的手册之类的当中提及过,MySQL它们寻找配置文件是有几处的,比如 /etc/my.cnf、/home/user/my.cnf、/etc/mysql/my.cnf,反正它会顺着一处一处找吧,路径记不太住了,在这些配置文件中增加有关[client]的信息能登录连接就行。

最后,我试了几种,发现比较方便的,也就是一些一键安装包那样的,提供的都是像董大侠那样的处理方案,这种方式应当是比较稳妥安全的,毕竟不用直接在关键配置文件中标明密码信息。而如果不会编写sh命令,只能照搬MySQL命令行的,那么有下面两种可能的方式(说是可能,是因为我估计不同的发行版可能有命令参数上的差异),假设我是用root账号进行每分钟一次的备份操作,且把一个叫bbs的数据库导出保存在根目录的backup文件夹下。

引用:
* * * * * /usr/bin/mysqldump --defaults-extra-file=/root/.my.cnf -uroot bbs > /backup/bbs-$(date +"\%F-\%H-\%M").sql

* * * * * /usr/bin/mysqldump --defaults-extra-file=/root/.my.cnf -uroot bbs > /backup/bbs-$(date +\%F-\%H-\%M).sql

* * * * * mysqldump --defaults-extra-file=/root/.my.cnf -uroot bbs > /backup/bbs-$(date +\%F-\%H-\%M).sql
有关全路径,我在查找零字节问题时,在下面此处也看到了,但偏作者没提为什么会有零字节的原因
http://www.linuxdiyf.com/linux/28271.html

上面三条测试过的命令的第3条我没加全路径,可成功执行,应当是由于我用软件管理包安装的MySQL,它本身就在系统PATH中的原因了。如果是自己安装的且未加进PATH中,那就没戏了。

多谢以上各位协助我折腾完工!
回复时引用此帖
天凤凰
 
天凤凰 的头像
超级会员
 
资 料:
注册日期: May 2002
帖子: 1,156 声望值: 3
精华: 0,解答: 2
#7 旧 2019-02-16, 23:36:09 默认
天凤凰 当前离线  

引用:
作者: Hyson 查看帖子
......与我通过顶楼链接的自动生成器生成的命令不一样的是,它最后是没有什么 >/dev/null 和2>&1这个尾巴的,而我也弄不明白这个尾巴有什么用,就暂时不去管它了。......
查看这篇文章: Linux Shell 1>/dev/null 2>&1 含义

通俗的讲,就是不记录mysqldump产生的日志,抛弃掉


Steering my ship with hope,leave fear behind
回复时引用此帖
tacoal
 
tacoal 的头像
终极会员
 
资 料:
注册日期: Aug 2000
帖子: 10,414 声望值: 3
精华: 0,解答: 30
#8 旧 2019-02-17, 03:05:43 默认
tacoal 当前离线  

引用:
作者: Hyson 查看帖子
还真是!没想到有这个问题。

试了下,如果用软件包安装的mysql,倒是能成。


没想到把董吉米大侠引来回答我的问题了

我把情况给大家报告一下。

为了能够让它这个定时任务迅速的测试,我最后把定时器设成了全是星星,就是说让它每分钟执行一次,然后我不停的修改命令,以便看出哪条命令是可行的。

首先,针对转义的问题......
>/dev/null 和2>&1这个尾巴简单的说就是把执行任务时的输出,包括出错都丢掉。这样做是因为如果系统设置了用户邮箱的话,执行cron产生的输出会自动发送到邮箱里。当你不需要这些时,就需要用到这个尾巴。
但是,在调试时,这个尾巴是非常有用的,它会告诉你哪里出了问题。
回复时引用此帖
fatality
 
fatality 的头像
终极会员
 
资 料:
注册日期: Dec 2001
帖子: 13,549 声望值: 3
精华: 1,解答: 24
#9 旧 2019-02-20, 15:05:23 默认
fatality 当前离线  

生产环境Mysql数据库备份脚本

代码:
#!/bin/bash
#Author absolutely.xu@gmail.com
MAXIMUM_BACKUP_FILES=10              #最大备份文件数
BACKUP_FOLDERNAME="database_backup"  #数据库备份文件的主目录
DB_HOSTNAME="localhost"              #mysql所在主机的主机名
DB_USERNAME="root"                   #mysql登录用户名
DB_PASSWORD="123456"                 #mysql登录密码
DATABASES=(
            "openfire"
            "csp"                    #备份的数据库名
)
#=========
echo "Bash Database Backup Tool"
#CURRENT_DATE=$(date +%F)
CURRENT_DATE=$(date +%F)              #定义当前日期为变量
BACKUP_FOLDER="${BACKUP_FOLDERNAME}_${CURRENT_DATE}" #存放数据库备份文件的目录
mkdir $BACKUP_FOLDER #创建数据库备份文件目录
#统计需要被备份的数据库
count=0
while [ "x${DATABASES[count]}" != "x" ];do
    count=$(( count + 1 ))
done
echo "[+] ${count} databases will be backuped..."
#循环这个数据库名称列表然后逐个备份这些数据库
for DATABASE in ${DATABASES[@]};do
    echo "[+] Mysql-Dumping: ${DATABASE}"
    echo -n "   Began:  ";echo $(date)
    if $(mysqldump -h ${DB_HOSTNAME} -u${DB_USERNAME} -p${DB_PASSWORD} ${DATABASE} > "${BACKUP_FOLDER}/${DATABASE}.sql");then
        echo "  Dumped successfully!"
    else
        echo "  Failed dumping this database!"
    fi
        echo -n "   Finished: ";echo $(date)
done
echo
echo "[+] Packaging and compressing the backup folder..."
tar -cv ${BACKUP_FOLDER} | bzip2 > ${BACKUP_FOLDER}.tar.bz2 && rm -rf $BACKUP_FOLDER
BACKUP_FILES_MADE=$(ls -l ${BACKUP_FOLDERNAME}*.tar.bz2 | wc -l)
BACKUP_FILES_MADE=$(( $BACKUP_FILES_MADE - 0 )) 
#把已经完成的备份文件数的结果转换成整数数字

echo
echo "[+] There are ${BACKUP_FILES_MADE} backup files actually."
#判断如果已经完成的备份文件数比最大备份文件数要大,那么用已经备份的文件数减去最大备份文件数,打印要删除旧的备份文件
if [ $BACKUP_FILES_MADE -gt $MAXIMUM_BACKUP_FILES ];then
    REMOVE_FILES=$(( $BACKUP_FILES_MADE - $MAXIMUM_BACKUP_FILES ))
echo "[+] Remove ${REMOVE_FILES} old backup files."
#统计所有备份文件,把最新备份的文件存放在一个临时文件里,然后删除旧的文件,循环出临时文件的备份文件从临时目录里移到当前目录
    ALL_BACKUP_FILES=($(ls -t ${BACKUP_FOLDERNAME}*.tar.bz2))
    SAFE_BACKUP_FILES=("${ALL_BACKUP_FILES[@]:0:${MAXIMUM_BACKUP_FILES}}")
echo "[+] Safeting the newest backup files and removing old files..."
    FOLDER_SAFETY="_safety"
if [ ! -d $FOLDER_SAFETY ]
then mkdir $FOLDER_SAFETY
                                                                                                                   
fi
for FILE in ${SAFE_BACKUP_FILES[@]};do
                                                                                                                     
    mv -i  ${FILE}  ${FOLDER_SAFETY}
done
    rm -rf ${BACKUP_FOLDERNAME}*.tar.bz2
    mv  -i ${FOLDER_SAFETY}/* ./
    rm -rf ${FOLDER_SAFETY}
#以下显示备份的数据文件删除进度,一般脚本都是放在crontab里,所以我这里只是为了显示效果,可以不选择这个效果。
    
CHAR=''
for ((i=0;$i<=100;i+=2))
do  printf "Removing:[%-50s]%d%%\r" $CHAR $i
        sleep 0.1
CHAR=#$CHAR
done
    echo
fi
转自:http://blog.51cto.com/laoxu/1353542


在互联网上总是不负责任,总能干出最恶毒的事情。因为,他们可以隐藏在众人之后。
回复时引用此帖
zeroxia
 
zeroxia 的头像
核心会员
 
资 料:
注册日期: Jun 2009
帖子: 2,839 声望值: 3
精华: 0,解答: 37
#10 旧 2019-02-20, 19:33:18 默认
zeroxia 当前离线  

留个标记学习一下。


The world is beautiful for Cece.
回复时引用此帖
jeremyyao
 
jeremyyao 的头像
高级会员
 
资 料:
注册日期: Feb 2002
帖子: 733 声望值: 3
精华: 0,解答: 1
#11 旧 2019-02-21, 17:44:44 默认
jeremyyao 当前离线  

crontab 执行任务如果有出错,其实用mail命令看一下邮件,就基本能判断出问题了。
回复时引用此帖
zhengshb
 
zhengshb 的头像
支柱会员
 
资 料:
注册日期: Sep 2001
帖子: 6,885 声望值: 4
精华: 0,解答: 1
#12 旧 2019-02-22, 11:18:24 默认
zhengshb 当前离线  

代码:
#!/usr/bin/env bash
#! Encoding UTF-8
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH

#保存备份份数,我现在每半小时执行一次,96就是3天的数据。
number=96
#备份保存路径
backup_dir=/home/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=xxxx


#如果文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi


function backup {
	db=$1

	new_backup_dir=$backup_dir/$db
		if [ ! -d $new_backup_dir ]; 
		then     
			mkdir -p $new_backup_dir; 
		fi
	
	$tool -u $username -p$password $db|gzip > $new_backup_dir/$db-$dd.sql.gz
	
	#写创建备份日志
	echo "create $new_backup_dir/$db-$dd.dupm" >> $new_backup_dir/log.txt
	
	#找出需要删除的备份
	delfile=`ls -l -crt  $new_backup_dir/*.sql.gz | awk '{print $9 }' | head -1`

	#判断现在的备份数量是否大于$number
	count=`ls -l -crt  $new_backup_dir/*.sql.gz | awk '{print $9 }' | wc -l`

	if [ $count -gt $number ]
	then
	  #删除最早生成的备份,只保留number数量的备份
	  rm $delfile
	  #写删除文件日志
	  echo "delete $delfile" >> $new_backup_dir/log.txt
	fi
}

backup data1   #数据库1
backup data2   #数据库2
保存为sh文件,然后定时任务执行sh.

9楼哪个太复杂了。这个简单。
回复时引用此帖
发表新主题 回复

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 14:41:48.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号