我正在运行一个通过 PHP 脚本执行 mysqldump 的 cron 作业,转储需要 RELOAD 权限。使用 MySQL 管理员帐户感觉不对,但创建具有管理员权限的用户也不正确。
我主要关心的是安全方面,我正在将数据库属性(用户名、密码等)加载到我正在使用的类的受保护数组“属性”中。
我想知道哪种方法更有意义,或者是否有另一种方法可以达到相同的结果。
概述:
LAMP 服务器:CENTOS 5.8、Apache 2.2.3、MySQL 5.0.95、PHP 5.3.3
Cron 工作大纲:
- 从网站数据库中的两个 InnoDB 表中转储原始统计数据,它们具有外键关系。
- 将数据加载到统计数据库中的表中
- 获取传输的自增主键的最后一个值
- 在从网站数据库中删除复制数据的查询中使用主键值
- 在 stats db 中处理传输的数据以填充报告表
- 处理完成后,从 stats db 中删除原始统计数据
网站数据库配置为带有二进制日志记录的主数据库,一旦统计数据不再在网站数据库中存储和处理,将设置复制服务器(复制网站数据库是将统计数据移动到自己的数据库的动力) )。
在 cron 作业期间访问的所有文件都位于 DocumentRoot 目录之外。
细节:
第一步执行的 mysqldump 需要 RELOAD 权限,命令如下:
<?php
$SQL1 = "--no-create-info --routines --triggers --master-data ";
$SQL1 .= "--single-transaction --quick --add-locks --default-character-set=utf8 ";
$SQL1 .= "--compress --tables stats_event stats_event_attributes";
$OUTPUT_FILENAME = "/var/stats/daily/daily-stats-18.tar.gz";
$cmd1 = "/usr/bin/mysqldump -u website_user -pXXXXXX website_db $SQL1 | gzip -9 > $OUTPUT_FILENAME";
exec( $cmd1 );
?>
错误信息:
mysqldump: Couldn't execute 'FLUSH TABLES': Access denied; you need the RELOAD privilege for this operation (1227)
如果我使用 mysql 管理员凭据,则可以正常工作。