mysqldump以cron和命令行的不同用户身份连接

我在一个备份脚本中发现了一个错误,这个脚本是作为一个cron作业运行的,我发现并纠正了这个错误,但是我仍然对这个错误从命令行启动时没有显示出来感到困惑。 脚本本身是以root身份启动的,并且在某个时刻以另一个用户(实际上是“mysql”)启动另一个脚本

su another_user -c "/some/path/another_script" 

another_script反过来在某些时候做db转储:

 mysqldump db_name > file.sql 

这个mysql的实例没有本地主机的root密码,所以以root身份运行这个命令总是有效的。 我不明白的是,如果我从命令行启动这个脚本,它仍然有效,尽pipe这个命令不是由'root'而是'mysql'用户调用的。 数据库日志显示连接用户仍然是“根”。 而当脚本作为一个cron作业启动时,它会像预期的那样失败,mysql日志显示连接用户是'mysql'。

这个问题实际上可以被简单地重现:

 su mysql -c "mysqldump db_name > file.sql" 

意外地以根用户数据库用户身份连接,如果从命令行以根用户身份启动,并且预期以mysql数据库用户身份连接(如果作为根cron作业启动)。

如果用户在本地计算机上,则无法调用该命令。

如果您允许root访问%@ localhost,则可以使用任何用户连接到mysql服务器。

例如:如果你使用用户test1login,你仍然可以用root用户连接到本地mysql。

 user1@machine~$ mysql -h localhost -u root 

要么

 user1@machine~$ mysqldump -h localhost -u root mydatabase > backup.sql 

检查您正在使用的备份脚本。 有重要的事情。

如果你需要用不同的用户运行脚本,你可以使用这个例子:

 su - user1 -c "/path/scripts/backup.sh" 

您遇到两种不同行为的原因是cron不能在shell中运行,因此您在cron中可以访问的所有环境variables都从cron中丢失。 如果你想让cron的行为像你的shell一样,你需要在shell env中调用它。 对于bash来说,这将是:

 /bin/bash -l -c 'your command'