Skip to content

Ubuntuで/var/lib/mysqlを移動したらエラーが

Ubuntuで/var/lib/mysqlを移動したらエラーが published on Ubuntuで/var/lib/mysqlを移動したらエラーが へのコメントはまだありません

開発環境(Ubuntu on VirtualBox)のディスク容量が少なくなってきたので、/var/lib/mysql を 別のディレクトリ ( /data の下)に移動して、シンボリックリンクを張ったんだけど、MySQL起動時に以下の様なエラーが出た。

/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
131203 18:27:23 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
131203 18:27:23  InnoDB: Initializing buffer pool, size = 8.0M
131203 18:27:23  InnoDB: Completed initialization of buffer pool
131203 18:27:23  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

結論から言うと、/etc/apparmor.d/usr.sbin.mysqld で、/data/mysql への権限を追加すればOK。

  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /data/mysql/ r,
  /data/mysql/** rwk,

環境: Ubuntu 10.04.4 (面倒なのでアップグレードしていない・・・)

Amazon RDS (MySQL)のslow query logを集計する

Amazon RDS (MySQL)のslow query logを集計する published on Amazon RDS (MySQL)のslow query logを集計する へのコメントはまだありません

RDSではslow query logはテーブルに書きだされる。

Amazon RDSのMySQLでは、デフォルトではslow query logはmysqlデータベースのslow_logというテーブルに保存される(※)。

今までの普通のMySQLであれば、slow query logを有効化するとデフォルトではファイルに書きだされて、それをmysqldumpslowで集計・解析するってのが一般的だったと思うけど、テーブルに書きだされると、それにもう一手間必要になってくる。

※以前は、slow_logテーブルに書き出す以外に選択肢は無かったと思うけど、最近はファイルに書き出すことも出来るらしい。

大まかな方針

  1. slow_logテーブルから通常のslow query logファイル形式にエクスポート
  2. mysqldumpslowで集計

slow_logをエクスポートするツール2つ

pythonのスクリプト

AWSのフォーラムのスレッド(AWSにログインしていないと見られない)で見つけたこちらのスクリプト。

mysql関連のモジュールがないと動かないので、今回は使用せず。

シェルスクリプト

MySQL Performance Blogの記事で紹介されていたこちらのツール群。そこにexport-slow-log-tableというスクリプトがあるので、それを使う。先頭に以下の行を追加して、

#!/bin/bash

.my.cnf にホスト名、ユーザー名、パスワードを以下のように記載して、

[client]
host=xxx.yyy.ap-northeast-1.rds.amazonaws.com
user=awsuser
password=secretpassword

スクリプトを実行すればOK。

その後

あとは通常通り、エクスポートしたファイルをmysqldumpslowで集計する。

集計が終わったらslow_logテーブルの内容は不要だと思うので、以下のストアドプロシジャでローテートしておく。

CALL mysql.rds_rotate_slow_log;

まとめ

Amazon RDS (MySQL) では、デフォルトではslow query logはslow_logというテーブルに書き込まれるので、それをファイルにエクスポートしてmysqldumpslowで集計する方法を紹介した。で、その結果を利用してボトルネックの調査・分析をする、という流れ。

slow query logを定期的に確認してパフォーマンスを改善させる運用フローを作っておくと、システムの規模が大きくなった時にも安心。

MySQLでrootなのにaccess denied

MySQLでrootなのにaccess denied published on MySQLでrootなのにaccess denied へのコメントはまだありません

MySQLのrootユーザーでDBを作成して、そのユーザーに権限を与えようとしたらAccess deniedのエラーが出た。

mysql> grant all on foodb.* to 'foo'@'localhost';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'foodb'

■問題の詳細(?)

発生前にやった事。

1. rootユーザーのパスワードが空だったので、パスワード設定。

GRANT USAGE ON *.* TO 'root'@'localhost' IDENTIFIED BY 'newpassword'

2. DB作成

CREATE DATABASE foodb;

3. 上述の通り、GRANT ALL … をやろうとしてエラー発生。

 

Continue reading MySQLでrootなのにaccess denied

LiftでMySQLを使う

LiftでMySQLを使う published on LiftでMySQLを使う へのコメントはまだありません

タイトル通り。検索するとLiftを使ってる人にはお馴染みの武田ソフトさんのページが出てくる。基本はそれでOKなんだけど、バージョンが違うとちょっと違うので一応メモ。

■環境

  • Scala 2.8.1
  • Lift 2.2

Continue reading LiftでMySQLを使う

PDO

PDO published on PDO へのコメントはまだありません

■PHPからMySQLにアクセス

最近PHPを使う時はいつもsymfonyを使ってるので、DBに接続したりSQLを投げるコードを直接書くことはなかったんだけど、つい最近、ほんのお遊びプログラムを作る時に、わざわざsymfonyを使うまでもないと思ったので、プレーンなPHPで書くことにした。

普通のPHPを使うのなんて久しぶりなので、最初はmysql_connectとかの昔ながらのやり方をやってたんだけど、それだとさすがに芸がないので他のやり方をすることにした。

■PDO

どうやら調べてみたら、ここ最近ではPDOを使う人が多いみたいなので自分もそうしてみることにした。CodeZineにPDOの記事が載ってたのでそれを見つつやってみる。PDOにしろ何にしろ、そもそも人間の労力を減らすための物なので、そんなに難しいわけがない。

・文字コード

で、次に引っかかったのが定番の文字コード。色々見てると例の

set names utf8

ってのを実行してる例が多かったけど、これって筋が悪いというかあまり美しくないって個人的には思う。で、調べている途中にこんなページが見付かった。

Shift JISの場合、set namesで文字コードを指定しても、PDOが文字コードを意識した作りになってないから(?)、SQLインジェクションが起こる可能性があるらしい。

Continue reading PDO

MySQLでCSVを入出力

MySQLでCSVを入出力 published on MySQLでCSVを入出力 へのコメントはまだありません

自分用メモ。

今やってる仕事で、他のDB(SQL Server)からMySQLにデータを移行する必要があったので、CSVを使う事にした。

MySQLでCSVやTSVをインポートするのは非常に簡単。このページを参考にした。TSVの場合は terminated by ‘t’ とすればOK。

phpMyAdminの認証方法

phpMyAdminの認証方法 published on phpMyAdminの認証方法 へのコメントはまだありません

phpMyAdminってレンタルサーバーとかでインストールされているのを使った事しかなかったんだけど、今ちょこちょこ開発を進めているシステムではXAMPPを開発環境にしてるので、初めてphpMyAdminを自分で設定変更可能な環境で使っている。(まぁ基本はXAMPPを入れると勝手にインストールされるんだけど)

最初はrootのパスワードは無しでMySQLを使ってたんだけど、さすがに良くないなと思ってパスワードを設定したら、phpMyAdminで以下のようなエラーを吐いてDBが見られなくなった。

エラー
MySQLのメッセージ: ドキュメント
#1045 - Access denied for user 'root'@'localhost' (using password: NO)
MySQL サーバに接続しようとしましたが拒否されました。config.inc.php のホスト、ユーザ名、パスワードが MySQL サーバの管理者から与えられた情報と一致するか確認してください

Continue reading phpMyAdminの認証方法

symfonyでMySQLの文字コードを指定

symfonyでMySQLの文字コードを指定 published on symfonyでMySQLの文字コードを指定 へのコメントはまだありません

symfonyではschema.ymlに書いた内容でテーブルが作られるけど、その際に文字コードがlatin1とかになってしまう場合がある(設定によるんだけど)。で、それを防ぐ方法。

database.ymlで文字コードを指定すればよいだけ。

all:
doctrine:
class: sfDoctrineDatabase
param:
dsn:      mysql:host=localhost;dbname=dbfoo
username: foo
password: secretpassword
attributes:
default_table_collate: utf8_general_ci
default_table_charset: utf8

MySQLで外部キーを付ける時にエラー

MySQLで外部キーを付ける時にエラー published on MySQLで外部キーを付ける時にエラー へのコメントはまだありません

symfonyでschema.ymlにごにょごにょ書いていざテーブル作成!と思ったら以下のエラー。

SQLSTATE[HY000]: General error: 1005 Can't create table 'dbname.#sql-192c_1a6' (errno: 150). Failing Query: "ALTER TABLE table1 ADD CONSTRAINT table1_user_id_sf_guard_user_id FOREIGN KEY (user_id) REFERENCES sf_guard_user(id)". Failing Query: ALTER TABLE table1 ADD CONSTRAINT domain_user_id_sf_guard_user_id FOREIGN KEY (user_id) REFERENCES sf_guard_user(id)

結論:原因は外部キーを付けるフィールドと参照先のフィールドの型があっていないこと。

Continue reading MySQLで外部キーを付ける時にエラー

DreamHostのmysqlコマンドで文字化け

DreamHostのmysqlコマンドで文字化け published on DreamHostのmysqlコマンドで文字化け へのコメントはまだありません

自分用メモ。

DreamHostで動いているシステムのDBの中身を触る際、phpMyAdminなんて使うのはたるいのでsshでログインしてmysqlコマンドを使う。

DBの文字コードはutf8だけど、mysqlコマンドはlatin1を使おうとする。解決方法は2通り。

1. 以下のようにコマンドラインオプションで文字コードを指定。

mysql -h mysql.example.com -u user -p --default-character-set=utf8

2. ホームディレクトリに .my.cnf というファイルを作り、そこに以下の内容を記述。ファイル名はドットで始まることに注意(3分くらいハマった)。

[client]
default-character-set=utf8