常见错误
本页内容
如果您收到以下错误
> client[:contacts].insert_one({ vpa: 'cool@cool'}) Mongo::Error::NoServerAvailable: No server is available matching preference: #<Mongo::ServerSelector::Primary:0x14987080 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015 from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/server_selector/selectable.rb:115:in `select_server' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/cluster.rb:246:in `next_primary' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/retryable.rb:150:in `legacy_write_with_retry' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/retryable.rb:103:in `write_with_retry' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/collection.rb:422:in `block in insert_one' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/client.rb:485:in `with_session' from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/collection.rb:421:in `insert_one' from (irb):6 from /rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'
该错误在 Ruby 驱动程序版本 2.6.x 及更早版本中产生。当驱动程序无法连接到服务器时,会引发此错误。为了解决这个问题,您可以尝试以下操作
将驱动程序更新到最新的 2.x 版本。
确保在 URI/连接字符串或主机列表中端口号码正确。
如果您正在连接到 Atlas,请确保已正确配置防火墙规则。请参阅有关集群安全.
如果您使用的应用程序是支持分叉的 Web 服务器,请参阅有关分叉.
有关此问题的更多信息,请参阅此处:RUBY-1281。
OperationFailure
当尝试使用身份验证读取 local
数据库时
如果在尝试读取 local
数据库时遇到以下错误
Mongo::Error::OperationFailure: not authorized on local to execute command { find: "oplog.rs", filter: { ts: { $gte: Timestamp 1497449043000|0 } }, sort: { $natural: 1 } } (13)
您可以通过调整用户角色并确保其具有对本地数据库的权限来解决这个问题。如果您特别想访问 oplog,也可以创建一个具有读取本地数据库的 oplog.rs
集合权限的自定义角色。更多关于角色管理的信息,请参阅此处。
关于此问题的更多信息,请参阅MONGOID-4446。
SocketTimeoutError
和 EC2 上的名称解析错误
一些用户报告遇到了以下错误
Exception Mongo::Error::SocketTimeoutError Error execution expired /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `pack_sockaddr_in' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `block (2 levels) in connect!' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket.rb:199:in `handle_errors' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `block in connect!' /usr/lib/ruby/2.3.0/timeout.rb:101:in `timeout' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:56:in `connect!' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/address.rb:172:in `connect_socket!' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connection.rb:86:in `connect!' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connectable.rb:84:in `ensure_connected' /var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connection.rb:256:in `write'
这个错误最后是在 Ruby 驱动程序版本 2.5.1 上报告的,因此更新驱动程序可能可以解决此问题。有用户报告说他们这样解决了这个问题
EC2 上的 DNS 服务器默认在 /etc/resolv.conf 中生成。按照这个答案 和设置名称服务器为 Google NS,我能够解决这个问题。
您可以在以下位置找到有关此问题的更多信息: MONGOID-4527.
Mongo::Auth::Unauthorized
用户无权访问
一些用户报告遇到了以下错误
Mongo::Auth::Unauthorized: User ... is not authorized to access ...
在升级到 Ruby 驱动程序版本 2.5+ 后,驱动程序默认改为使用 scram 认证机制。如果用户创建时使用的认证机制与驱动程序使用的认证机制不匹配,则可能会发生此错误。您可以通过在 mongoid.yml
文件中指定 auth_mech
选项来指定首选的认证机制。
有关此问题的更多信息,请参阅此处:RUBY-1684。