暂时禁用MySQL远程访问

4

我需要在Linux服务器上进行夜间mysql维护期间禁用远程访问,以便在此期间没有人可以查询数据库。 我不能执行SERVICE MYSQL STOP,因为那样我就无法完成我需要做的事情(截断并重建几个表)。 有没有办法在短时间内关闭外部访问?
提前致谢。


你的意思是拒绝除了本地主机以外的连接吗? - elitalon
4个回答

9
这里有一种不需要改动操作系统的好方法:
第一步,将所有用户导出到SQL文件中,操作如下:

mysql -h localhost -u root -p rootpassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hlocalhost -uroot -prootpassword --skip-column-names -A | sed 's/$/;/g' > /root/MySQLGrants.sql

第二步,禁用除了root@localhost以外的所有用户。
DELETE FROM mysql.user WHERE CONCAT(user,host) <> 'rootlocalhost';
FLUSH PRIVILEGES;

第三步) 进行维护工作

第四步) 重新加载授权

mysql -h localhost -u root -p rootpassword < /root/MySQLGrants.sql

试一下这个方法!!!

附注:

在维护之前,运行service mysql restart --skip-networking仍然是最简单和最快的方法,并且在维护之前断开所有连接。

只需在维护后运行service mysql restart即可。


其实,那听起来不错...我需要做的维护工作是从本地脚本中完成的...为什么这是个坏主意? - Xi Vix
我原本认为自己所说的是个坏主意,因为我以为MySQL需要持续上升。 - RolandoMySQLDBA
哦...好吧,如果服务mysqld restart--skip-networking执行优雅重启(即等待活动查询完成),那就太完美了。我需要mysql进行维护,但对于用户来说必须是关闭的。 - Xi Vix

2
自 MySQL 5.7.5 版本开始,有一种“官方方式”来处理这个问题:
MySQL 服务器现在支持一个“脱机模式”,具有以下特点:
1. 没有 SUPER 权限的连接客户端用户在下一个请求时会被断开连接,并显示适当的错误信息。断开连接包括终止正在运行的语句和释放锁。这样的客户端也无法启动新的连接,并收到适当的错误信息。
2. 具有 SUPER 权限的连接客户端用户不会被断开连接,并且可以启动新的连接来管理服务器。
3. 复制从属线程被允许继续将数据应用到服务器上。
4. 只有具有 SUPER 权限的用户才能控制脱机模式。要将服务器置于脱机模式,请将新的 offline_mode 系统变量的值从 OFF 更改为 ON。要恢复正常操作,请将 offline_mode 从 ON 更改为 OFF。在脱机模式下,被拒绝访问的客户端会收到一个 ER_SERVER_OFFLINE_MODE 错误。

0

禁用远程应用程序使用的登录凭据?

防火墙MySQL端口,以便远程应用程序无法访问?


好的想法...但我希望有一些更加流畅的方法。关闭端口可能会损坏查询。收回和重新建立特权比我预期的要多一些工作。我希望有一些晦涩的mysql命令可以胜任此事。 - Xi Vix
@xivix 关闭一个端口如何损坏查询? - Vladislav Rastrusny
我可能会在 select 或 update 的过程中关闭一个端口,从而无法向请求者提供结果反馈。这样做并不干净利落。 - Xi Vix

0

在维护期间,有一些其他方法可以暂时禁用对MySQL数据库的访问。

编辑/etc/mysql/my.conf'

将bind-address更改为: bind-address = 127.0.0.1

重新启动MySQL: service mysql restart --skip-networking

除非您将bind-address更改为原始值并再次重启MySQL,否则没有人可以从远程访问MySQL服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接