![MySQL 登录中断](https://linux22.com/image/795258/MySQL%20%E7%99%BB%E5%BD%95%E4%B8%AD%E6%96%AD.png)
晚上 9 点到早上 6 点之间,我运行自动作业来更新我们的数据库,并且我想禁止特定列表中的用户登录 MySQL。
答案1
在尝试任何此类操作之前,请备份数据库,但您可以有两个 cron 作业。第一个在晚上 9 点调用脚本,第二个在早上 6 点调用脚本
脚本将使用您选择的语言,并通过 mysql 连接到 mysql 数据库(我的意思是实际的mysql数据库。
您可以让它修改用户表,以便您不希望登录的用户拥有不存在的允许主机。
对于第二个脚本,你只需撤销更改即可。
然后,您可以让这两个脚本使用数据库或文件来获取临时列入黑名单的人员列表。
Perl 中的 Armchair 实现(前提是你已经安装了 mysql 模块)
use DBI;
$dbServer='';
$user='';
$pass='';
$ident=$ARGV[0];
my $dsn = "dbi:mysql:database=mysql;host=$dbServer;port=3306";
my $dbh = DBI->connect($dsn, "$user","$pass") or die "Can't connet to the Database: $DBI::errstr\n";
my $sth = $dbh->prepare("UPDATE user SET Host='nobody' WHERE User='johndoe'");
$sth -> execute();
优雅的替代方案可能是将其实现为mysql 插件假设您使用的是 5.1+,但是我不确定 API 是否允许这么多的控制。
答案2
虽然您可以轻松操作用户表以阻止用户登录,但如何处理已经在数据库上拥有会话的用户?或者这并不重要?
您的用户/应用程序如何连接?更新服务器框上的防火墙设置以阻止到 MySQL 网络端口的新连接可能更简单(在 Linux、BSD 上可行,但在 MS 平台上更棘手)。请注意,最后一句中的重要部分是新的连接(查看 iptables 的已建立/相关选项)。你没有说明你在什么操作系统上运行它。
更进一步,你可以在晚上 9 点 20 分左右增加已建立的连接数(请注意,仅仅阻止端口可能不会达到预期的效果)
然而,撇开如何暂时阻止访问不谈,如果你必须每天进行 9 小时的处理,你显然已经陷入了批处理地狱。无论如何都应避免使用批处理 - 异步消息传递稍好一些,但生活变得所以如果您同步处理输出和输入,则会简单得多。