【问题标题】:Sequelize-cli returns "Unknown Database" when doing migrations执行迁移时,Sequelize-cli 返回“未知数据库”
【发布时间】:2021-02-11 10:34:16
【问题描述】:

我一直在使用 sequelize 迁移,但没有任何问题, 例如在我们的开发服务器中:

"development": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }

使用 sequelize-cli 可以正常工作:

npx sequelize db:migrate

结果:

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "development".
No migrations were executed, database schema was already up to date.

我们的生产服务器也是如此,其中 db 与 app 位于不同的服务器上:

"production": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "172.xx.xx.11",
    "dialect": "mysql"
  }

所以最近我们升级了我们的生产服务器,使用 mariadb 拥有 3 个数据库服务器,由负载平衡器 (maxscale)、galera 集群或其他东西管理,使用与以前相同的设置,所以现在它类似于:

server a: 172.xx.xx.11, 
server b: 172.xx.xx.12, 
server c: 172.xx.xx.13, 
load balancer: 172.xx.xx.10

我们的新配置如下:

"production": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "172.xx.xx.10",
    "dialect": "mysql"
  }

应用服务器和数据库服务器之间没有直接打开防火墙,只有应用服务器到负载均衡器。

使用 sequelize 测试应用服务器和负载均衡器之间的连接似乎没有问题, 如果用户名和密码正确,则可以通过, 如果用户名错误或密码错误会给出

ERROR: Access denied for user 'root'@'172.xx.xx.10' (using password: YES)

那里没有问题。只是说有联系。

那么使用也没有问题:

npx sequelize db:drop

npx sequelize db:create

导致

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "production".
Database db created.

在我们所有的数据库服务器中验证数据库确实删除和创建。

但是当我尝试进行迁移时,会发生这种情况:

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "production".

ERROR: Unknown database 'db'

我已经验证我们所有的 db 服务器确实有那个 'db' 数据库,它甚至是由 sequelize 基于配置创建的,但不知何故 sequelize 似乎无法识别或识别那个 'db' 数据库。

如果您以前有过类似的经历,请提供帮助,如果您需要更多信息,请告诉我。 谢谢。

【问题讨论】:

    标签: mariadb sequelize.js database-migration galera maxscale


    【解决方案1】:

    您可以通过在 [maxscale] 部分下添加 log_info=true 在 MaxScale 中启用详细日志级别。这应该有助于解释发生了什么以及失败的原因。

    Sequelize 可能会假设它与同一数据库服务器一起工作。例如,执行 INSERT 并立即读取插入的值将始终在单个服务器上工作,但使用分布式设置,这些值可能没有复制到所有节点。

    如果您找不到关于它为何会出现这种行为的解释,或者您认为 MaxScale 做错了什么,请在 MaxScale 项目下的 MariaDB Jira 上打开错误报告。

    【讨论】:

    • 感谢您的建议!我将尝试检查 maxscale 上的日志并打开错误报告。
    • 我修复了@markusjm 的问题。在 MariaDB Jira 上发现了相关问题。原来有一个“最大用户”,需要授予某些权限。
    【解决方案2】:

    原来 maxscale 用户没有足够的权限。向 maxscale 用户授予 SHOW DATABASES 权限解决了我的问题。

    更多信息: https://mariadb.com/kb/en/mariadb-maxscale-14/maxscale-configuration-usage-scenarios/#service

    Related issue on MariaDB Jira

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2019-07-12
      • 1970-01-01
      • 2016-01-30
      • 2021-01-25
      • 2016-02-15
      • 2017-01-11
      • 2018-05-28
      • 2019-12-18
      相关资源
      最近更新 更多