几个客户端的一个大型MySQL数据库

时间:2014-09-18 21:29:11

标签: mysql privileges grant multi-tenant

N.B。这不是另一个"一个大型DB或几个小型DB"问题

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

我对Microsoft的SQL Server不太熟悉,但我读到了一些关于"多租户数据架构"这似乎提供了这个。

MySQL有类似的东西吗?

2 个答案:

答案 0 :(得分:1)

我建议不要为所有客户提供1个大型数据库,原因有多种:

  1. 我曾在一家初创公司工作,其中我们的一个DB的AWS实例刚刚放弃(因为我们没有错)。我们只是说这对办公室里的每个人来说都是忙碌的一天。如果您的ONLY数据库发生这种情况,您将如何确保客户满意度?你打算如何维持一个强大的系统?有一种说法是,在谷歌,服务器每2秒就会运行一次。虽然在您开始时可能不会发生这种情况,但要知道您的服务器无法免于失败。将数据库分成多个实例是对冲重大故障的好方法。
  2. 如果您有很多交易,您的线程池总是会被锁定。您不希望这样,因为它会增加在您的数据库上执行CRUD操作所需的时间,这反过来会影响客户满意度。
  3. 您想拥有的更好的多租户架构是:

    1. 为每个客户端(可能在开头每2个客户端)拥有1个主数据库,然后为每个主数据库设置从属数据库。现在,您可以在从属设备上执行所有写入操作,并执行主设备的所有读取操作。只要您保持数据库同步,这就是确保您的线程池保持可用性并快速执行所有事务的最佳方法。
    2. 这是一篇很棒的文章,标题为" High Availability, Load Balancing, and Replication,"这将为您提供建立强大的多租户系统的良好入门。我还建议您阅读High Scalability

      上的文章

      如果您有任何疑问,请与我们联系!

答案 1 :(得分:1)

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

最接近的是定义用户访问表的VIEW。该视图具有访问基表的权限,每个用户都有权访问该视图。

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

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 |
+----------------+------+