新手问题 backup + whenever 进行 mysql 数据备份,自动备份内容为空白,手动备份正常

chairy11 · 2015年01月09日 · 最后由 chairy11 回复于 2015年01月13日 · 3437 次阅读

用 backup + whenever 进行 mysql 数据备份,设置为自动备份的。 自动备份倒是会每天给我生成相应文件,但打开里面 0 行,一片空白。 但如果我手动执行,备份的内容却是正常的。

手动命令:

backup perform --trigger a_project

自动的话: whenever 配置是:

every 1.day, :at => '19:00' do
  command "backup perform --trigger a_project"
end

$ crontab -e 查看结果是:

# Begin Whenever generated tasks for: /var/www/a_project/config/schedule.rb

0 19 * * * /bin/bash -l -c 'backup perform --trigger a_project'

# End Whenever generated tasks for: /var/www/a_projec/config/schedule.rb

其实我在猜,是不是跟权限有关?我手动备份的时候,权限是 root,那 crontab 执行的时候,它用什么权限?在哪里设置? 我看到 backup 设置里面有句:

database MySQL do |db|
          db.name               = "db/a_project_production"
          db.username           = "bibi"
          db.password           = "xxxxx"
          db.host               = "localhost"
          db.port               = 3306
          # supplying a `socket` negates `host` and `port`
          db.socket             = "/var/lib/mysql/mysql.sock"
          # specifying `sudo_user` will run the backup utility on behalf of that Unix user (instead of current one)
          db.sudo_user          = "root"
          db.additional_options = ["--quick", "--single-transaction"]
      end

我看到里面有个 sudo_user,但不是已经写为 root 了吗? 真是百思不得其解啊!

在 Linux 里,切换用户的目的是使用 正确的用户 而不是一股脑用 root。

我猜测这里切换 root 用户需要密码,但是 crontab 是非交互的无法输入密码,所以静默退出。你退出再登录,然后手动执行备份,需要密码吗?

config/schedule.rb 里面加一行,定时运行后看看输出/tmp/cron.log set :output, "/tmp/cron.log"

#1 楼 @Rei 没明白你的意思耶…… 我之前的设想是:

  1. 对于整个服务器,设置一个非 root 的超级用户,用来部署。
  2. 对于 mysql,设置一个非 root 的超级用户,用来项目交互。

结果是:

  1. 对于整个服务器,我创建的用户总是受到各种限制(sudoer 没成功吧),我觉得麻烦,就一直用 root 了。
  2. 对于 mysql,超级用户创建成功,所以我一直用 bibi 这个用户名。

所以:

  1. 你说的切换 root 用户,指的是服务器的用户,还是 mysql 的用户?
  2. crontab 静默退出,那它为什么能每天生成一个表面正确的备份的? 比如,它会在目录下生成 2015.01.08.19.29.54/a_project.tar, 解压之后,里面是 weekly_report/databases/MySQL.sql.gz,再解压得到一个 MySQL.sql。 只是手动备份时,里面是有内容的。自动备份时,里面是空白的。但它生成了这个文件耶……
  3. 你说的退出再登录,是指退出什么啊?我平时用 ssh [email protected],直接登录(设置了 ssh key),不用密码的。 crontab 在服务器本身,backup 文件里有 mysql 密码,它还需要什么啊?

#2 楼 @liujianhei 你意思是在 whenever 的设置里改吗? 改成这样吗?

every 1.day, :at => '19:00' do
  command "backup perform --trigger a_project"
  set :output, "/tmp/cron.log"
end

那一天才备份一次,我得明天才能检查结果哦……

#4 楼 @chairy11 可以直接在 crontab -e 里面把时间改成几分钟后执行呀 50 15 * * * /bin/bash -l -c 'backup perform --trigger a_project >> /tmp/cron.log'

#5 楼 @liujianhei 哭……看不懂你这“50 15 * * * ”指的是几点?是不是已经过了?

#6 楼 @chairy11 15:50 50 15 * * * 分 时 日 月 星期

#7 楼 @liujianhei 噢,这是 UTC 时间吧?还得等……我今天折腾不下去了,各种 bug 各种坑……下周再看好了…… 谢谢啊……周末愉快啊……

#8 楼 @chairy11 不是 UTC 时间,是系统时间,这个时间你可以在 crontab -e 里面编辑,按照格式调成任意你想要的时间,如 17:15(15 17 * * *),不用等

#9 楼 @liujianhei 唉,没看到什么有用的信息。还得得到空白的结果……

[2015/01/09 07:50:01][info] Performing Backup for 'xxx周报系统备份生成 (a_project)'!
[2015/01/09 07:50:01][info] [ backup 4.1.5 : ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] ]
[2015/01/09 07:50:01][info] Database::MySQL Started...
[2015/01/09 07:50:01][info] Using Compressor::Gzip for compression.
[2015/01/09 07:50:01][info]   Command: '/usr/bin/gzip'
[2015/01/09 07:50:01][info]   Ext: '.gz'
[2015/01/09 07:50:01][info] Database::MySQL Finished!
[2015/01/09 07:50:01][info] Packaging the backup files...
[2015/01/09 07:50:02][info] Packaging Complete!
[2015/01/09 07:50:02][info] Cleaning up the temporary files...
[2015/01/09 07:50:02][info] Storage::Local Started...
[2015/01/09 07:50:02][info] Storing '/root/backups/a_project/2015.01.09.07.50.01/a_project.tar'...
[2015/01/09 07:50:02][info] Cycling Started...
[2015/01/09 07:50:02][info] Removing backup package dated 2014.12.28.11.00.02...
[2015/01/09 07:50:02][info] Storage::Local Finished!
[2015/01/09 07:50:02][info] Cleaning up the package files...
[2015/01/10 07:50:02][info] Performing Backup for 'xxx周报系统备份生成 (a_project)'!
[2015/01/10 07:50:02][info] [ backup 4.1.5 : ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] ]
[2015/01/10 07:50:02][info] Database::MySQL Started...
[2015/01/10 07:50:02][info] Using Compressor::Gzip for compression.
[2015/01/10 07:50:02][info]   Command: '/usr/bin/gzip'
[2015/01/10 07:50:02][info]   Ext: '.gz'
[2015/01/10 07:50:02][info] Database::MySQL Finished!
[2015/01/10 07:50:02][info] Packaging the backup files...
[2015/01/10 07:50:02][info] Packaging Complete!
[2015/01/10 07:50:02][info] Cleaning up the temporary files...
[2015/01/10 07:50:02][info] Storage::Local Started...
[2015/01/10 07:50:02][info] Storing '/root/backups/a_project/2015.01.10.07.50.02/a_project.tar'...
[2015/01/10 07:50:02][info] Cycling Started...
[2015/01/10 07:50:02][info] Removing backup package dated 2014.12.30.11.00.02...
[2015/01/10 07:50:02][info] Storage::Local Finished!
[2015/01/10 07:50:02][info] Cleaning up the package files...
[2015/01/11 07:50:02][info] Performing Backup for 'xxx周报系统备份生成 (a_project)'!
[2015/01/11 07:50:02][info] [ backup 4.1.5 : ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] ]
[2015/01/11 07:50:02][info] Database::MySQL Started...
[2015/01/11 07:50:02][info] Using Compressor::Gzip for compression.
[2015/01/11 07:50:02][info]   Command: '/usr/bin/gzip'
[2015/01/11 07:50:02][info]   Ext: '.gz'
[2015/01/11 07:50:02][info] Database::MySQL Finished!
[2015/01/11 07:50:02][info] Packaging the backup files...
[2015/01/11 07:50:02][info] Packaging Complete!
[2015/01/11 07:50:02][info] Cleaning up the temporary files...
[2015/01/11 07:50:02][info] Storage::Local Started...
[2015/01/11 07:50:02][info] Storing '/root/backups/a_project/2015.01.11.07.50.02/a_project.tar'...
"/tmp/cron.log" 48L, 3162C


我们曾经也遇到过这种奇葩问题。你是不是 centos 系统?那么很有可能是 tab 占位符的缘故,用 Vim 打开后,删除不必要的占位符,然后再执行一次试试。

试试我所说的吧

#11 楼 @hanluner 是 centos,但你说的 tab 占位符,指的是哪个文件里的?

#13 楼 @chairy11 crontab 里面的。

#10 楼 @chairy11 日志看不出什么问题,我也不知道哪出错了。。 db.sudo_user = "root"这行应该是不必要的,不过加上也没问题好像

#14 楼 @hanluner cron 任务已经运行了,应该就不是 crontab 的配置问题了

#15 楼 @liujianhei 不是的,当时我们也是这么认为的,我们也手动执行了 crontab 任务,没问题。然后就是定时的时候总是有问题。后来偶然机会发现是占位符的问题,才修改好了。

#16 楼 @hanluner 如果我没有理解错你的意思的话,你是说你遇到的问题是当时定时任务没有定时运行。 题主的是 cron 任务可以定时运行,定时执行的日志都有了,问题是定时执行的结果和手动执行结果不一致。

#17 楼 @liujianhei 好吧,可能是我理解错了。sorry

#17 楼 @liujianhei 恩,是这样,它执行了,也生成了相应的文件,就是文件内容为空,很奇怪。手动 backup 的话,这个文件就不会为空。

#18 楼 @hanluner 还是很感激啊,各种解决的可能方案都很重要啊!

#17 楼 @liujianhei

#1 楼 @Rei 我发现一个问题,手动执行 backup perform --trigger a_project 与 cron 自动执行输出结果差别:

[2015/01/12 23:57:32][warn]   Pipeline STDERR Messages:
[2015/01/12 23:57:32][warn]   (Note: may be interleaved if multiple commands returned error messages)
[2015/01/12 23:57:32][warn] 
[2015/01/12 23:57:32][warn]   Warning: Using a password on the command line interface can be insecure.

手动比 cron 执行多了一个密码的警句,看来的确是用户权限和密码问题。 但我手动时也没有附带密码啊,密码应该已经写在 backup 文件里的了啊! 这应该修改哪里呢?

#20 楼 @chairy11 我测试的时候也遇到这个问题了,但跟你的情况有点区别,我手动备份报你上面的错误,直接退出了,不会生成备份文件,于是我找了解决方法 http://stackoverflow.com/questions/20751352/suppress-warning-messages-using-mysql-from-within-terminal-but-password-written 按照上面的,执行了下面的命令后 mysql_config_editor set --login-path=local --host=localhost --user=bibi --password(回车后会要求输入数据库密码) 修改配置文件如下:

database MySQL do |db|
          db.name               = "db/a_project_production"
          #db.username           = "bibi"
          #db.password           = "xxxxx"
          #db.host               = "localhost"
          #db.port               = 3306
          # supplying a `socket` negates `host` and `port`
          #db.socket             = "/var/lib/mysql/mysql.sock"
          # specifying `sudo_user` will run the backup utility on behalf of that Unix user (instead of current one)
          #db.sudo_user          = "root"
          db.additional_options = ["--login-path=local", "--quick", "--single-transaction"]
end

#21 楼 @liujianhei 哦,谢谢,我消化一下……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号