さくらのVPSを借りて構築を行っています。

基本的にMySQLだけを導入して運営させていてしばらく問題もなかったのですが、
最近、Perlなどを導入して権限周りに色々悩まされていました。

で、何が原因かはわかっていないのですが、MySQLが起動できなくなりました。

/etc/rc.d/init.d/mysqld restart
を行うと、停止は出来るのですが起動に失敗します。

/var/log/mysqld.log を見てみると、

InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Using Linux native AIO
InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: Completed initialization of buffer pool
InnoDB: highest supported file format is Barracuda.
InnoDB: Waiting for the background threads to start
InnoDB: 1.1.8 started; log sequence number 1595675
[ERROR] /usr/libexec/mysqld: Error writing file '/var/run/mysqld/mysqld.pid' (Errcode: 28)
[ERROR] Can't start server: can't create PID file: No space left on device
mysqld_safe Number of processes running now: 0
mysqld_safe mysqld restarted
[Note] Plugin 'FEDERATED' is disabled.

と書かれており、権限で起動が出来なくなってるのかと思い、
ls -ld /var/run/mysqld/ で調べてみると、
drwxr-xr-x 2 mysql mysql 4096 11月 1 23:52 /var/run/mysqld/
と、MySQLをインストールした時と同様に、ユーザーはmysqlのままでした。
一応、chown -R mysql:mysql /var/run/mysqld/ でもう一度設定しなおして再起動を試みましたが、起動のみやはり失敗して、同じエラーログとなっています。

Apacheの起動・停止は問題ありません。

OSはCentos5.7でApache2.2ですが、どうも権限周りの設定が良くわかっておりません。

どうにか再インストール無しでMySQLを起動させたいのですが、ご教示頂けますと幸いです。
宜しくお願い申し上げます。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

> No space left on device



ディスクがいっぱいになっていたりしませんか?
df コマンドで確認してみてください。
    • good
    • 0
この回答へのお礼

ご教示頂きまして有難うございます。
返信が遅れて申し訳ございません。

早速チェックしたところ、仰るとおりディスクをチェックしてみると、アクセスとエラーの両ログが膨大化しすぎていて、それでHDDが一杯で色々エラーになっていたようでした。

これからはログのローテもきちんと設定するようにします。
勉強になりました!

本当に有難うございました。

お礼日時:2011/11/03 02:58

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Qcakephpでのトランザクション処理について

このカテゴリには初めて投稿いたします。
どうにも解決ができないため、質問させていただきました。

cakephpで、注文番号の連番発行のために、今回初めてトランザクション処理が必要なケースが出てきまして、
ネットで検索して出て来る情報を元に、そのとおりに記述しているのですが、どうやってもうまく行きません。
DBのテーブルはInnoDBになっています。

参考にしたサイトは例えば
http://wataame.sumomo.ne.jp/archives/3812
などです。

--------------------実際のコード

-----以下はあるモデル内(ここでは、SamplemodelDataとしています)に記述した関数での処理です。$thisはそのモデルを示します。

$dataSource = $this->getDataSource();
$dataSource->begin($this);

$res = $this->find('first',array('conditions'=>array('classification'=>$classification,'commoncode'=>$commoncode)));

if($this->getNumRows()==0){//レコードなしの場合
$returnNumber = 1;
$this->save(array('classification'=>$classification, 'commoncode'=>$commoncode, 'number'=>1));
}else{
$res['ExsamplemodelData']['number'] += 1;
$returnNumber = $res['SamplemodelData']['number'];
$this->set('id', $res['SamplemodelData']['id']);
$this->saveField('number', $returnNumber);
}

$dataSource->commit($this);

return $returnNumber;

--------------------

■目的
ユーザーが同時刻に何人同時に注文しようと、注文番号を重複させずに注文番号を採番することが目的です。
極端なことを言えば、ある同じ時刻(秒まで一緒)に世界各国から100人同時に全く同じタイミングで注文が入っても、注文番号を重複させないようにしたいです。
※DBのシリアルを使えば確実に重複させないようにできることは知っています。しかし、今回は単純に連番だけでなくいろいろなケースにおいて意味をもつ文字列も付与したものをプライマリキーとしているので、単純なシリアルではだめなのです。


■うまくいかない点
・上記の記述でも、トランザクション自体は機能しているようです。
 最後の $dataSource->commit($this); をコメントアウトにすると、DBの番号が永遠にインクリメントされませんので。
・begin ~ commit までの間に、他のスレッドで、
$this->find('first',array('conditions'=>array('classification'=>$classification,'commoncode'=>$commoncode)));
が実行されると、インクリメントされる前の番号が返されるのです。
=>それよりも前のスレッドが begin をした瞬間からcommitするまでは、他のスレッドでfindしても、待ち状態になって欲しいのです。
・検証用プログラムで、上記の処理を、2つのブラウザから同時に100回繰り返す(2つ併せて200回繰り返し処理させる)と、
毎回200件中、5~7件程度、番号が重複してしまいます。

■質問内容
・このような精度を求めるようなケースでは、cakephpでトランザクション処理をしても、もともと無理な要望なのでしょうか?
・上記の記述で不足している部分は何でしょうか?例えば、mysqlのトランザクションには他スレッドから、updateだけを禁止にする指定と、updateとselectも禁止にする指定ができるようですが、上記の記述だと他スレッドではupdateしか禁止されていないために、selectであるfindは待ちが発生しないということなのでしょうか?しかし、selectも禁止にするとかそういう指定方法がどう探してもそういう情報が見つけられませんでした。


要約すると、つまり、
「cakephpでトランザクション処理(beginからcommitの間は、他スレッドからはupdateもselectも禁止)にする方法はどうやったらよいのでしょうか?」
ということでございます。

ご存じの先生方、是非、お力お貸しいただけますでしょうか。
何卒よろしくお願いいたします。

このカテゴリには初めて投稿いたします。
どうにも解決ができないため、質問させていただきました。

cakephpで、注文番号の連番発行のために、今回初めてトランザクション処理が必要なケースが出てきまして、
ネットで検索して出て来る情報を元に、そのとおりに記述しているのですが、どうやってもうまく行きません。
DBのテーブルはInnoDBになっています。

参考にしたサイトは例えば
http://wataame.sumomo.ne.jp/archives/3812
などです。

--------------------実際のコード

-----以下はあるモデル内(ここ...続きを読む

Aベストアンサー

find('first', のとき、降順設定しないと、取得する先頭1行目は最小値だけど、そこは設定してますか?
ちゃんと最大値を得るようになっていたとして、あとは、cakePHPよりは、MySQL innodb の問題じゃないかな。
http://dev.mysql.com/doc/refman/5.1/ja/innodb-locking-reads.html

innodb のtransaction は、defaultは REPEATABLE READ で、select 文でのデータ取得時は、他者に読み書き可能なので、これを防ぐには、先に発行される select文に for update が必要です。これで、他者の読み書きをブロックします。
Modelの findメソッドでは、それを追加するすべはないので(接続先データベースによって対応の違う物は実装されていない)
よって、 Model->query(string $sql ,array $placedata) メソッドで直接SQL文を渡して実行することになります。
プレースホルダーも使えるので、pdoでのプレースホルダー指定方法に則って作成するとよいです。
SQL例
SELECT max( number ) as number FROM exsample_models where classification=? and commoncode=? FOR UPDATE;

find('first', のとき、降順設定しないと、取得する先頭1行目は最小値だけど、そこは設定してますか?
ちゃんと最大値を得るようになっていたとして、あとは、cakePHPよりは、MySQL innodb の問題じゃないかな。
http://dev.mysql.com/doc/refman/5.1/ja/innodb-locking-reads.html

innodb のtransaction は、defaultは REPEATABLE READ で、select 文でのデータ取得時は、他者に読み書き可能なので、これを防ぐには、先に発行される select文に for update が必要です。これで、他者の読み書きをブロックしま...続きを読む


人気Q&Aランキング