CentOS6でyumを使ってmysqlからMariaDBにした(なった)話
2013年12月15日 04時27分
yumのサードパーティ製リポジトリ(CentALT)を追加してうっかりyum update時のパッケージリストを流しで確認する程度に更新したらmysqlがMariaDBになった。
yumのログを確認してみるとmysqlが消されてる。
|
Packages Erased: mysql-libs mysql mysql-server mysql-devel |
mysqlからMariaDBに切り替えるにしても心の準備が整っていなかったので焦る焦る。
とりあえずデーモンが起動していなかったので起動してみる。
問題なくMariaDBが起動した。
wordpress、piwik、mediawiki、redmine、自作アプリは問題なく動いてる。
アプリケーション層はあまり意識する必要はないという噂通りに互換性はバッチリだ。
と一安心していたら日時実行しているmysqlバックアップのバッチ処理がコケた。
|
mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577) |
eventsテーブルがダメージ受けてる?
確認する為にmysql(MariaDB)コンソール使用して以下で確認。
|
MariaDB [(none)]> use information_schema; Database changed MariaDB [(information_schema)]> select * from events; ERROR 1577 (HY000): Cannot proceed because system tables used by Event Scheduler were found damaged at server start |
確かにエラーが発生する。
こんな時はmysql_upgradeを使用する。
|
$ mysql_upgrade -u root -h localhost -p --verbose ... Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13 |
落ちた。
/var/lib/mysql/mysql_upgrade_infoの中身を見たらバージョンが書かれている1行だけのテキストファイルだった。
所有者がrootでパーミッションが644になってたので所有者をmysqlに変更。
それでもダメだったのでパーミッションを666に変えたらエラーなくコマンドが完了した。
気持ち悪いのでパーミッションは元に戻しておいた。
図らずも流行に乗れた感じ。
yumでenablerepoした時は特に気をつけないといけないという備忘録でした。
mysql error:FUNCTION .FIELD does not existが特定環境だけ発生する
2013年01月13日 20時52分
とあるQueryがローカルでは問題なく動くのに本番環境だと動かないという症状に悩まされたのでメモ。
|
SELECT 1 ORDER BY FIELD (1, 1) |
これがローカルだと動くのだが本番だと以下ようなのエラー文が出て通らない。
|
FUNCTION .field does not exist |
エラーメッセージをそのまま読むと.fieldという関数はありません?? しかしローカルだと動くしそんな最近増えた機能でもないはずなのになんでかなぁと思って調べてみたら関数の前に空白があるかないかが問題だった。
以下のようにFIELDの前を削除すると正常に動作した。
|
SELECT 1 ORDER BY FIELD(1, 1) |
MySQLはsql_modeなどの設定で関数の前の空白を許可するかしないか等の細かい設定まで出来る。 結局は本番環境と開発環境の違いを把握しておきましょうというお話。
8.2.4. 関数名の構文解析と名前解決
http://dev.mysql.com/doc/refman/5.1/ja/function-resolution.html
mysqlで外部クライアントから接続ができない!?
2012年03月21日 20時12分
開発用MVのmysqlにローカルから接続できるが外部から接続できなくて悩んだのでメモ。
ターミナルからコマンド打てばすんなり接続できるのにWindows PCのWorkBentchからの接続は拒否される。
iptables等を切っても駄目。
何故?と悩んでたらどうやらユーザ作成のQueryが正しくなかったようだった。
|
GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password'; |
上だと繋がらない…下のようにPRIVILEGESを追加すると意図した通りに動く。
|
GRANT ALL PRIVILEGES ON *.* TO user@'%' IDENTIFIED BY 'password'; |
※勿論、FLUSH PRIVILEGESを忘れずに!
このブログにも当てはまりますがググって簡潔に書いてあるページを見てそのまま鵜呑みにする前に公式ページを確認しようという話でした。
でもmysqlの場合は公式サイトの情報が多いのでいいけど公式の情報が少ないものも多いのでTips系Blogにはいつもお世話になっています…
mysqlの起動に失敗(MySQL Daemon failed to start)
2012年03月06日 19時25分
mysqlの再起動を行ったら起動に失敗したのでメモ。
調べることとしてやっぱりログ。
ターミナル2つ立ち上げてtailでログ監視しつつmysql起動。
ターミナル1
|
$ tail -f /var/log/mysqld.log |
ターミナル2
|
$ /etc/init.d/mysqld start |
すると見事にエラーログが大量に出てくる。
|
InnoDB: Unable to lock ./ibdata1, error: 11 InnoDB: Check that you do not already have another mysqld process |
どうやら停止しきれなくて残ってしまったプロセスがある様子。
|
$ ps aux | grep mysql $ kill -9 プロセスNo |
上の手順で残っていたmysqlのプロセスを停止させてから起動したら正常に起動した。
復帰が早かったとはいえ会社でなく自サーバで良かった。
SQL ServerからMySQLへする時にQueryではまったこと
2012年01月26日 16時53分
SQL Server用に作成したQueryをMySQLで動かしたら動かない動かない…
ということではまった点を記述。
1.SELECT INSERT 文
よく既にレコードが存在する場合はINSERTしないという場合に以下のように記述していた。
|
INSERT INTO table1(v1, v2) SELECT '値1', '値2' FROM table1 WHERE NOT EXISTS(SELECT * FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
v1辺りが主キーと思ってみてほしい。
既にレコードが存在している場合はレコードを登録しないというQueryだ。
しかしMySQLだとこのQueryは動かない。
NOT EXISTSだろうがEXISTSだろうが行が取れないためにレコードが登録されなかった。
|
INSERT INTO table1(v1, v2) SELECT * FROM (SELECT '値1' AS c1, '値2' AS c2) tbl WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
と一つサブクエリを挟むことで行が作成されレコードが登録されるようになる。
2.
DELETE文などで自分自身をサブクエリで参照することはできない
|
DELETE FROM tbl1 WHERE key IN ( SELECT key FROM tbl1 WHERE key2 = 'hoge' ) |
サブクエリ使わずにそのまま書ける文だがわかりやすくする為に完結なQueryにした。
key2の値がhogeのレコードのkeyの値を持つレコードを削除するという文だ。
これがMySQLではエラーになる。
※参考サイト
http://hamamuratakuo.blog61.fc2.com/blog-entry-427.html
上記の問題にあたったらSelect文とDELETE文を分けれる場合は分けた方が無難だろう。
3.
AUTO_INCREMENTは物理削除すると削除した番号を再利用する
SQL ServerのIDENTITYと同じ感覚で使用するとはまる。
主キーとして使用するには注意が必要。