9

我正在运行一个通过 PHP 脚本执行 mysqldump 的 cron 作业,转储需要 RELOAD 权限。使用 MySQL 管理员帐户感觉不对,但创建具有管理员权限的用户也不正确。

我主要关心的是安全方面,我正在将数据库属性(用户名、密码等)加载到我正在使用的类的受保护数组“属性”中。

我想知道哪种方法更有意义,或者是否有另一种方法可以达到相同的结果。


概述:
LAMP 服务器:CENTOS 5.8、Apache 2.2.3、MySQL 5.0.95、PHP 5.3.3

Cron 工作大纲:

  1. 从网站数据库中的两个 InnoDB 表中转储原始统计数据,它们具有外键关系。
  2. 将数据加载到统计数据库中的表中
  3. 获取传输的自增主键的最后一个值
  4. 在从网站数据库中删除复制数据的查询中使用主键值
  5. 在 stats db 中处理传输的数据以填充报告表
  6. 处理完成后,从 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 管理员凭据,则可以正常工作。

4

2 回答 2

5

我想知道哪种方法更有意义,或者是否有另一种方法可以达到相同的结果。

底线是您需要具有特定权限的用户才能运行该mysqldump命令。虽然仅为这个 cron 作业创建一个新用户似乎很愚蠢,但这是您可以采用的最直接和最简单的方法,至少可以提供 lolsecurity 的外观。

鉴于这是一种权宜之计,直到您可以启动并运行复制,所以这里没有真正的危害。通过复制来做到这一点是完全可行的,权宜之计似乎是明智的。

此外,当需要进行复制时,xtrabackup是您的朋友。它包含二进制日志命名和位置信息以及它所拍摄的快照,这使得设置新的从站变得轻而易举

于 2012-12-19T04:37:32.323 回答
3

我刚刚遇到了同样的错误(可能在您正在处理的同一站点上:)),即使以 MySQL root 用户身份运行也是如此。我设法通过指定 --skip-add-locks 来解决它,例如这有效:

/usr/bin/mysqldump -u USERNAME -pPW DATABASE_NAME --skip-lock-tables --single-transaction --flush-logs --hex-blob
于 2015-02-19T05:29:24.873 回答