我已经在 Linode 上的 ubuntu VPS 上使用 mysql 启动并运行了我的应用程序。
这是 mysql 的版本:
mysql Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (x86_64) using readline 6.2
一切通常都运行良好,但有时当我打开新的 Rails 控制台时会出现以下错误:
/var/www/app/shared/bundle/ruby/2.0.0/gems/mysql2-0.3.14/lib/mysql2/client.rb:67:in `connect': Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) (Mysql2::Error)
from /var/www/app/shared/bundle/ruby/2.0.0/gems/mysql2-0.3.14/lib/mysql2/client.rb:67:in `initialize'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `new'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `mysql2_connection'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:315:in `new_connection'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `checkout_new_connection'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:247:in `block (2 levels) in checkout'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout'
from /home/user/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout'
from /var/www/app/shared/bundle/ruby/2.0.0/gems/activerecord-3.2.16/lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection'
from /home/user/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
并且所有进入控制台的尝试都失败了。为什么应用程序仍然运行良好并且仍然使用数据库。
如果我在 shell 中执行:
$ sudo /etc/init.d/mysql status
* MySQL is stopped.
$ sudo /etc/init.d/mysql stop
* Stopping MySQL database server mysqld ... [ OK ]
$ sudo /etc/init.d/mysql start
* Starting MySQL database server mysqld ... [fail]
但应用程序始终运行良好。
这三个命令之前是/var/log/mysql/error.log
空的,在这三个命令之后我读到:
140510 19:14:32 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140510 19:14:32 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
140510 19:14:32 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140510 19:14:32 [Note] Plugin 'FEDERATED' is disabled.
140510 19:14:32 InnoDB: The InnoDB memory heap is disabled
140510 19:14:32 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140510 19:14:32 InnoDB: Compressed tables use zlib 1.2.8
140510 19:14:32 InnoDB: Using Linux native AIO
140510 19:14:32 InnoDB: Initializing buffer pool, size = 128.0M
140510 19:14:32 InnoDB: Completed initialization of buffer pool
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
140510 19:14:32 InnoDB: Retrying to lock the first data file
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
..... several thousands of these lines...
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
140510 19:16:12 InnoDB: Unable to open the first data file
InnoDB: Error in opening ./ibdata1
140510 19:16:12 InnoDB: Operating system error number 11 in a file operation.
InnoDB: Error number 11 means 'Resource temporarily unavailable'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/operating-system-error-codes.html
140510 19:16:12 InnoDB: Could not open or create data files.
140510 19:16:12 InnoDB: If you tried to add new data files, and it failed here,
140510 19:16:12 InnoDB: you should now edit innodb_data_file_path in my.cnf back
140510 19:16:12 InnoDB: to what it was, and remove the new ibdata files InnoDB created
140510 19:16:12 InnoDB: in this failed attempt. InnoDB only wrote those files full of
140510 19:16:12 InnoDB: zeros, but did not yet use them in any way. But be careful: do not
140510 19:16:12 InnoDB: remove old data files which contain your precious data!
140510 19:16:12 [ERROR] Plugin 'InnoDB' init function returned error.
140510 19:16:12 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140510 19:16:12 [ERROR] Unknown/unsupported storage engine: InnoDB
140510 19:16:12 [ERROR] Aborting
140510 19:16:12 [Note] /usr/sbin/mysqld: Shutdown complete
140510 19:16:12 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
仅重新启动 VPS 似乎可以解决问题,但该问题在连接一两次控制台后又会出现。
我认为关闭 Mysql 并不init.d
会将其关闭,要停止它我需要先运行kill
它,然后它会自动重新启动。
$ ps -ef | grep mysq[l]
mysql 31063 1 0 May19 ? 00:00:34 /usr/sbin/mysqld
$ sudo /etc/init.d/mysql stop
* Stopping MySQL database server mysqld [ OK ]
$ ps -ef | grep mysq[l]
mysql 31063 1 0 May19 ? 00:00:34 /usr/sbin/mysqld
$ sudo kill -9 31063
$ ps -ef | grep mysq[l]
mysql 6052 1 3 09:23 ? 00:00:00 /usr/sbin/mysqld
$
有什么线索吗?
答案1
这可能是因为 mysql 在启动时无法启动。
尝试这个补救措施
/etc/init.d/mysqld 重启
或者尝试一下
从 /etc/my.cnf 文件中删除 basedir 属性
为什么?
basedir 指令指示 MySQL 在哪里找到其运行所需的一切:二进制文件、库、数据等。因此,通过规定 basedir=/var/lib,MySQL 将在 /var/lib 中搜索执行其功能所需的一切。
对于通过 RPM 进行的典型安装,此指令不是必需的,也不应该使用。有关此指令的更详尽描述,请参阅 MySQL 手册。
笔记
事实上我也曾因为内存问题遇到过这个问题。尝试检查一下是否有可用内存。