memocon プログラミングのメモや物欲日記、雑記等

CentOS6でyumを使ってmysqlからMariaDBにした(なった)話

2013年12月15日 04時27分

yumのサードパーティ製リポジトリ(CentALT)を追加してうっかりyum update時のパッケージリストを流しで確認する程度に更新したらmysqlがMariaDBになった。

yumのログを確認してみるとmysqlが消されてる。

mysqlからMariaDBに切り替えるにしても心の準備が整っていなかったので焦る焦る。

とりあえずデーモンが起動していなかったので起動してみる。

問題なくMariaDBが起動した。

wordpress、piwik、mediawiki、redmine、自作アプリは問題なく動いてる。
アプリケーション層はあまり意識する必要はないという噂通りに互換性はバッチリだ。

と一安心していたら日時実行しているmysqlバックアップのバッチ処理がコケた。

eventsテーブルがダメージ受けてる?
確認する為にmysql(MariaDB)コンソール使用して以下で確認。

確かにエラーが発生する。

こんな時はmysql_upgradeを使用する。

落ちた。

/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がローカルでは問題なく動くのに本番環境だと動かないという症状に悩まされたのでメモ。

これがローカルだと動くのだが本番だと以下ようなのエラー文が出て通らない。

エラーメッセージをそのまま読むと.fieldという関数はありません?? しかしローカルだと動くしそんな最近増えた機能でもないはずなのになんでかなぁと思って調べてみたら関数の前に空白があるかないかが問題だった。

以下のようにFIELDの前を削除すると正常に動作した。

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が正しくなかったようだった。

上だと繋がらない…下のようにPRIVILEGESを追加すると意図した通りに動く。

※勿論、FLUSH PRIVILEGESを忘れずに!

このブログにも当てはまりますがググって簡潔に書いてあるページを見てそのまま鵜呑みにする前に公式ページを確認しようという話でした。

でもmysqlの場合は公式サイトの情報が多いのでいいけど公式の情報が少ないものも多いのでTips系Blogにはいつもお世話になっています…

mysqlの起動に失敗(MySQL Daemon failed to start)

2012年03月06日 19時25分

mysqlの再起動を行ったら起動に失敗したのでメモ。

調べることとしてやっぱりログ。
ターミナル2つ立ち上げてtailでログ監視しつつmysql起動。

ターミナル1

ターミナル2

すると見事にエラーログが大量に出てくる。

どうやら停止しきれなくて残ってしまったプロセスがある様子。

上の手順で残っていたmysqlのプロセスを停止させてから起動したら正常に起動した。

復帰が早かったとはいえ会社でなく自サーバで良かった。

SQL ServerからMySQLへする時にQueryではまったこと

2012年01月26日 16時53分

SQL Server用に作成したQueryをMySQLで動かしたら動かない動かない…

ということではまった点を記述。

1.SELECT INSERT 文

よく既にレコードが存在する場合はINSERTしないという場合に以下のように記述していた。

v1辺りが主キーと思ってみてほしい。
既にレコードが存在している場合はレコードを登録しないというQueryだ。

しかしMySQLだとこのQueryは動かない。
NOT EXISTSだろうがEXISTSだろうが行が取れないためにレコードが登録されなかった。

と一つサブクエリを挟むことで行が作成されレコードが登録されるようになる。

2.
DELETE文などで自分自身をサブクエリで参照することはできない

サブクエリ使わずにそのまま書ける文だがわかりやすくする為に完結なQueryにした。
key2の値がhogeのレコードのkeyの値を持つレコードを削除するという文だ。
これがMySQLではエラーになる。

※参考サイト
http://hamamuratakuo.blog61.fc2.com/blog-entry-427.html

上記の問題にあたったらSelect文とDELETE文を分けれる場合は分けた方が無難だろう。

3.
AUTO_INCREMENTは物理削除すると削除した番号を再利用する

SQL ServerのIDENTITYと同じ感覚で使用するとはまる。
主キーとして使用するには注意が必要。