Ruby on Rails database.yml 中的套接字声明是啥?
Posted
技术标签:
【中文标题】Ruby on Rails database.yml 中的套接字声明是啥?【英文标题】:What is the socket declaration for, in Ruby on Rails database.yml?Ruby on Rails database.yml 中的套接字声明是什么? 【发布时间】:2011-06-04 07:44:40 【问题描述】:config/database.yml中的socket声明有什么用?
示例代码:
staging:
adapter: mysql
encoding: utf8
database: (database)
pool: 5
username: (user)
password: (pass)
socket: /tmp/mysql.sock # <--------- this line
我的应用可以正常工作,无论这条线是否被评论。那么它有什么用呢?我有什么理由留下它、评论它或改变它的价值?
【问题讨论】:
【参考方案1】:当两个程序想要通过网络相互通信时,一个程序可能会打开一个与另一个程序的 TCP 连接(“套接字”)。第一个程序需要知道第二台计算机的 IP 地址和程序正在侦听的端口。
在 Linux 上,当同一台计算机上的两个程序想要相互通信时,它们仍然可以打开 TCP 连接。但他们也可以通过“套接字文件”打开连接。 Linux 使套接字文件 API 与 TCP API 非常相似,因此将已经通过 TCP 通过网络进行通信的程序更新为也支持通过套接字文件进行通信并不是什么大问题。 Socket 文件比 TCP 快,但仅在两个程序在同一台计算机上时才有效。
【讨论】:
在我的 Rails 4 应用程序中,socket
设置似乎被忽略了。相反,我必须设置 host: /path/to/socket/
才能至少使 rake db:migrate
工作。【参考方案2】:
MySQL 有两种在 unix-ish 系统上与它通信的方法,tcp/ip 和域套接字。通过指定套接字 Rails,或者更确切地说是数据库驱动程序,将使用套接字而不是网络连接。使用socket可以更快,但是YMMV。
http://dev.mysql.com/doc/refman/5.5/en/connecting.html
【讨论】:
另外补充一句——只有当你的数据库与应用服务器在同一个机器上运行时,套接字才会起作用——所以这种机制往往不适合集群部署【参考方案3】:因为我的 database.yml 中指定了一个套接字,我浪费了整个下午——测试环境的数据库规范根本没有被解析。 因此,如果您的测试数据库无法访问,尽管一切似乎都很好,请尝试删除套接字规范。
【讨论】:
【参考方案4】:这将显示 UNIX 套接字的文件位置:
mysqladmin version -u 'your user name' -p
结果:
mysqladmin Ver 8.42 Distrib 5.7.26, for Linux on x86_64
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.7.26-0ubuntu0.19.04.1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 6 min 40 sec
您的用户必须已授予权限。
【讨论】:
以上是关于Ruby on Rails database.yml 中的套接字声明是啥?的主要内容,如果未能解决你的问题,请参考以下文章
ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.