用 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"
结果是:
所以:
#2 楼 @liujianhei 你意思是在 whenever 的设置里改吗? 改成这样吗?
every 1.day, :at => '19:00' do
command "backup perform --trigger a_project"
set :output, "/tmp/cron.log"
end
那一天才备份一次,我得明天才能检查结果哦……
#7 楼 @liujianhei 噢,这是 UTC 时间吧?还得等……我今天折腾不下去了,各种 bug 各种坑……下周再看好了…… 谢谢啊……周末愉快啊……
#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 打开后,删除不必要的占位符,然后再执行一次试试。
#15 楼 @liujianhei 不是的,当时我们也是这么认为的,我们也手动执行了 crontab 任务,没问题。然后就是定时的时候总是有问题。后来偶然机会发现是占位符的问题,才修改好了。
#17 楼 @liujianhei 恩,是这样,它执行了,也生成了相应的文件,就是文件内容为空,很奇怪。手动 backup 的话,这个文件就不会为空。
#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