【问题标题】:Problem with migrating an Azure database for a Ruby application为 Ruby 应用程序迁移 Azure 数据库的问题
【发布时间】:2019-11-08 02:24:15
【问题描述】:

我在 Linux 服务器(Amazon AMI v 2018.03 rhel fedora)上有一个可运行的 Ruby on Rails 应用程序(运行 Ruby 2.2.10p489 和 Rails 4.2.5 和 activerecord-sqlserver-adapter 4.2.6)。它连接到 Azure 数据库。一切都很好。但是,当我迁移到不同的 Azure 数据库并将凭据更改为指向新数据库时,我会得到一长串无用的错误,如下所示:

SystemStackError: stack level too deep
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `dblib_connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:271:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:59:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `sqlserver_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:87:in `connection'
        from (irb):1
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:110:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:9:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'

有效的 Azure 连接如下所示:

env PRODUCTION_DATABASE_HOST="xxx.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

不工作的看起来像:

env PRODUCTION_DATABASE_HOST="xxx2.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="other_databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

问题不在于连接或防火墙,因为我实际上可以使用 /node_modules/sql-cli 连接到这个新的 Azure 服务器。什么可能是错的?我的 Ruby 版本与 Azure 的其他实例之间存在一些不兼容性?我没有想法。

只要发出如下语句,就可以在 irb 中触发一堆错误:

results = ActiveRecord::Base.connection.exec_query("SELECT 1")

【问题讨论】:

  • “堆栈级别太深”意味着一个方法在不经意间以某种方式调用了自己。您能否将范围缩小到您更改的导致问题的确切原因?您是否探索过升级依赖项,因为这可能是在以后的补丁中解决的已知错误?值得尝试 Rails 4.2.6 和更多最新驱动程序。
  • 但在这种情况下唯一的区别是数据库是由不同的服务器提供的。为什么将提供数据的位置从导致失控递归更改? Azure-Rails 界面极其脆弱的特性让我很高兴自己是一名 Node.js 开发人员。

标签: ruby-on-rails sql-server ruby azure


【解决方案1】:

更新:解决这个问题的关键是创建一个新的 Azure 登录名/用户(参见https://azure.microsoft.com/en-us/blog/adding-users-to-your-sql-azure-database/)。虽然您可能想使用的管理员用户在某些数据库连接上工作得很好,但在 Ruby on Rails 中,它可能会以上述无用的方式失败。相信我,如果您先设置一些其他特定于应用程序的 SQL 登录,您可以避免很多麻烦。如果 Ruby on Rails 简单地报告数据库用户没有足够的权限而不是陷入失控的递归,那么所有这一切都是可以避免的。

【讨论】:

  • 感谢分享您的解决方案
【解决方案2】:

你可以试试:

env PRODUCTION_DATABASE_HOST="xxx2.数据库.windows.net"

【讨论】:

  • 我已经尝试了域和用户名的所有排列,有时使用 @s 和不同数量的子域
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2022-01-18
  • 2012-08-16
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多