问题描述
我一直在使用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.
我们的生产服务器也是如此,该数据库与应用程序位于不同的服务器上
"production": {
"username": "root","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","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,ORM: 6.3.5]
Loaded configuration file "config\config.json".
Using environment "production".
Database db created.
但是当我尝试进行迁移时,会发生这种情况:
Sequelize CLI [Node: 12.16.1,ORM: 6.3.5]
Loaded configuration file "config\config.json".
Using environment "production".
ERROR: UnkNown database 'db'
我已经证实我们所有的数据库服务器都具有该“ db”数据库,它甚至是通过基于配置的sequelize创建的,但是以某种方式,sequelize似乎无法识别或识别该“ db”数据库。
如果您之前有过类似的经验,请提供帮助,如果需要更多信息,请告诉我。 谢谢。
解决方法
您可以通过在log_info=true
部分下添加[maxscale]
来启用MaxScale中的详细日志级别。这应该有助于解释正在发生的事情以及失败的原因。
Sequelize可能会做一些假设它在同一数据库服务器上工作的事情。例如,执行INSERT并立即读取插入的值将始终在单个服务器上工作,但是使用分布式设置时,可能值未复制到所有节点。
如果找不到有关其为何如此运行的解释,或者您认为MaxScale做错了什么,请在MaxScale项目下打开MariaDB Jira的错误报告。
,结果证明maxscale用户没有足够的特权。向maxscale用户授予SHOW DATABASES
特权可以解决我的问题。
更多信息: https://mariadb.com/kb/en/mariadb-maxscale-14/maxscale-configuration-usage-scenarios/#service