为 Web 应用程序的每个用户帐户创建一个 MySQL 用户是否明智?

rsi*_*oes 6 mysql

我最近想到了这个想法,但我怀疑这个想法可能是疯狂的。我认为的几个好处是:

  • 通过触发器促进自动记录
  • 在每个(web-application-)用户级别控制 mysql 连接

显然,这会给我一个长得可笑的用户表,但我还不清楚任何惩罚:该User表已正确索引以进行 O(Log(n)) 单用户查找。

Der*_*ney 7

您希望获得哪种类型的日志记录?我在我的应用程序中做的是一个审计表,用于跟踪应用程序用户、应用程序命令和结果(以及其他内容)。这与另一个跟踪单个表更改的审计表一起,提供了我们每个用户需要的所有日志记录。

您还可以在应用程序中设置一个连接池来控制每个应用程序的连接。

乍一看,我认为尝试管理这么多用户是一种负担,超过了任何可能的好处。


Rol*_*DBA 6

通过触发器促进自动记录

您肯定会付出代价,因为您会使用触发器来记录每次登录,从而引入额外的磁盘 I/O。您可以通过一些精心设计的基础设施细微差别来减轻大部分磁盘 I/O,如下所示:

  • 通过触发器将用户记录到 BLACKHOLE 表
  • 将复制从属设置为仅接受来自主服务器的 BLACKHOLE 表的 SQL
  • 将slave上的BLACKHOLE表转换为MyISAM
  • 仅从从站读取登录统计信息
  • 您必须通过二进制日志记录额外的磁盘 I/O

然而,触发器的引入会降低应用程序的性能,只是为了验证用户,特别是在用户登录数量很高的情况下。您的研究的反问:

  • 基础设施建议和触发编码是否能够处理用户登录高峰?
  • 如果从未见过高峰,这些想法的实施是否值得?
  • 如果您预计未来会出现高峰,那么实施这些想法是否值得?

在每个(web-application-)用户级别控制 mysql 连接

已经有一个内置功能可以根据每小时可以完成的查询数量来控制 mysql 身份验证。请在 MySQL 5.5.12 中 mysql.user 的描述中注意它们:

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

您有max_questions、max_updates、max_connections 和 max_user_connections

在 MySQL 5.0 中,您可以限制个人帐户使用以下服务器资源

  • max_questions :帐户每小时可以发出的查询数
  • max_updates - 帐户每小时可以发出的更新数
  • max_connections :帐户每小时可以连接到服务器的次数
  • max_user_connections :一个帐户同时连接到服务器的数量

可以通过为每个应用程序用户创建相应的 mysql 用户来为您的应用程序用户管理这些。如果您打算管理用户限制,请记住不要重新发明轮子,因为 MySQL 可以在其身份验证协议中控制这些方面。