【问题标题】:One large MySQL database for several clients用于多个客户端的大型 MySQL 数据库
【发布时间】:2014-09-18 21:29:10
【问题描述】:

注意这不是另一个“一个大型数据库或几个小型数据库”问题。

为多个客户端(相同的结构等)使用一个大型 MySQL 数据库,并使用 user 列分隔客户端,是否可以通过匹配的 user 列限制用户的表访问?

我对 Microsoft 的 SQL Server 不太熟悉,但我读过一些关于“多租户数据架构”的文章,似乎提供了这一点。

MySQL 有类似的吗?

【问题讨论】:

  • 不是本机没有,但您可以通过每个客户端的不同数据库“相对轻松地”模拟它。这种方法提供了隐含的安全性和可扩展性。
  • @yshavit 我知道,但这不是我要问的。

标签: mysql privileges sql-grant multi-tenant


【解决方案1】:

MySQL 有表级和列级权限,但没有行级权限。

最接近的方法是定义一个用户访问表的视图。视图有权访问基表,每个用户都有权访问该视图。

定义视图以限制对当前用户的访问。

mysql> create table base (user varchar(16), x int);
mysql> insert into base values ('root@localhost', 123), ('bill@localhost', 456);
mysql> create view v as select * from base where user = USER() with check option;
mysql> select * from v;
+----------------+------+
| user           | x    |
+----------------+------+
| root@localhost |  123 |
+----------------+------+

【讨论】:

  • 不错的答案!你回答了我的问题并给了我一个很好的解决方法!
  • 您的意思是“为每个定义一个视图”而不是“为每个用户定义一个视图”?看来v 的单一视图适用于所有用户。
  • @Sarke,是的,好电话。每个表的一个视图就可以了。此外,并非每张桌子都需要以这种方式处理。某些表可能对所有用户都是完全可访问的。
【解决方案2】:

出于多种原因,我建议您不要为所有客户使用 1 个大型数据库:

  1. 我曾在一家初创公司工作,我们的一个数据库的 AWS 实例刚刚泄露(这不是我们的错)。让我们说那对办公室里的每个人来说都是忙碌的一天。如果这发生在您唯一的数据库中,您将如何确保客户满意度?你将如何维护一个强大的系统?有一种说法,在谷歌,服务器每 2 秒运行一次。虽然在您刚开始时可能不会发生这种情况,但要知道您不能免受服务器故障的影响。将您的数据库分片为多个实例是对冲重大故障的好方法。
  2. 如果您有很多事务,您的线程池总是会被锁定。您不希望这样做,因为它会增加对数据库执行 CRUD 操作所需的时间,进而影响客户满意度。

您想要的更好的多租户架构是:

  1. 为每个客户端拥有 1 个主数据库(可能在开始时每 2 个客户端),然后为每个主数据库拥有从属数据库。现在,您可以在从属设备上执行所有写入操作并从主设备执行所有读取操作。只要您保持数据库同步,这是确保您的线程池保持可用性并快速执行所有事务的最佳方式。

这是一篇名为“High Availability, Load Balancing, and Replication”的精彩文章,它将为您提供构建强大的多租户系统的入门知识。我还建议阅读High Scalability上的文章

如果您有任何问题,请告诉我!

【讨论】:

  • 有趣,我喜欢你对“读主,写从”的看法。支持,但遗憾的是这不是我问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2011-11-30
  • 2015-09-24
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多