Read it later.

Web製作に関するサーバ構成やコーディングネタの備忘録として使ってます。

*

MySQL 5.5からMySQL 5.6へのアップグレード後の諸々の対応

   

先日、とあるシステムのデータベースをMySQL5.5からMySQL5.6にアップグレードしました。
そうすると、Warningが出てきた(T-T)
本家のドキュメント『Upgrading from MySQL 5.5 to 5.6』に詳細は載っているのだけど、いくつか気をつけなくちゃいけないことがあったので、何をやったか纏めてみました。

http://dev.mysql.com/doc/refman/5.6/en/upgrading-from-previous-series.html

『innodb_additional_mem_pool_size』の廃止

Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.

InnoDBデータベースのメモリは、今までInnoDBメモリアロケータで管理されていたが、それをOSの管理に任せる方向になるそうです。『innodb_additional_mem_pool_size』『innodb_use_sys_malloc』ともに、コメントアウトします。

※『innodb_use_sys_malloc』は、
 値『0』の場合、InnoDBメモリアロケータを使う。
 値『1』の場合、OSの管理に任せる。※初期値
とのこと。『innodb_use_sys_malloc』を敢えて『1』にすると、下記の警告が出てきます。

Setting innodb_use_sys_malloc to FALSE is DEPRECATED. This option may be removed in future releases, together with the InnoDB's internal memory allocator.

InnnoDBメモリアロケータについての本家のドキュメントに解説はこちら。

『explicit_defaults_for_timestamp』の設定

TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

MySQL5.6で新登場のパラメタ。timestamp型のカラムの初期値についての設定です。
『explicit_defaults_for_timestamp』をmy.cnfに追加。
 値『0』の場合、これまでのバージョンのものと同じ。MySQLが暗黙的に初期値を用意します。※初期値
 値『1』の場合、明示的に初期値を指定することを宣言します。NULLが適用されます。

設定例

[mysqld]
explicit_defaults_for_timestamp = 1

初期値は必ず明示していたので知らなかったのですが、明示していなかったら下記のようになりました。

CREATE TABLE `hoge` (
  `hogehoge` timestamp
) ENGINE=InnoDB;

上記のSQLを実行した場合、explicit_defaults_for_timestamp=0だと、

CREATE TABLE `hoge` (
  `hogehoge` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

と解釈され、explicit_defaults_for_timestamp=1だと、

CREATE TABLE `hoge` (
  `hogehoge` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

と解釈されます。

MySQLの制約として、
 CREATE TABLEでは、CURRENT_TIMESTAMPを利用できるのは1カラムのみ
という制約があるのだけど、それを当てにして敢えてTIMESTAMP型カラムに初期値を定義していない作りをしている人は要注意。
この制約のおかげで、
TIMESTAMPに関しては、NULLを用いず、DEFAULT 0で、プログラム側でCURRENT_TIMESTAMPを明示して更新するように私はしています。

explicit_defaults_for_timestampについての本家のドキュメントに解説はこちら。

コマンドラインからMySQL系のコマンドを使ってパスワードを使っている場合に警告がでる

Warning: Using a password on the command line interface can be insecure.

MySQLのバックアップなど、シェルスクリプトを組んで、それをcronから叩くってのはよくあるケースなのですが、
そのときに、

mysql -uユーザ名 -pパスワード データベース名
mysqldump -uユーザ名 -pパスワード データベース名

というような感じで、コマンドライン上にパスワードを埋め込んで実行していると、この警告が出てきます。
まぁ、historyコマンドなどでパスワードを観ることができるから、セキュリティ上宜しくない。という意見はとてもごもっともなんですが、この警告の表示は要らない。

[client]
user = ユーザ名
password = パスワード
host = ホスト名(localhost,IPアドレスなど)

上記のアカウント情報をテキストファイルで保存し、mysql系のコマンドに引数として「アカウント情報を記載したファイルがこれ」と指定することができます。

mysql --defaults-extra-file=アカウント情報ファイル データベース名

これで、警告は消えます。

シェルスクリプトの場合は一時ファイルを使うと便利かも。

#!/bin/bash

# 接続情報をファイルに一時出力
MYSQLCLIENT_CNF=`mktemp`
echo "[client]" >> $MYSQLCLIENT_CNF
echo "user = ユーザ名" >> $MYSQLCLIENT_CNF
echo "password = パスワード" >> $MYSQLCLIENT_CNF
echo "host = ホスト名" >> $MYSQLCLIENT_CNF
# echo $MYSQLCLIENT_CNF

# 上記の接続情報をもとに、以下のスクリプトファイルを実行する。
mysql --defaults-extra-file=$MYSQLCLIENT_CNF --comments データベース名 < 実行したいSQLファイルのパス

# 接続情報ファイルの削除
rm -rf $MYSQLCLIENT_CNF
exit

TRUNCATE TABLEが遅い

まだ詳しく調査できてませんが、DELETE FROM [テーブル名]のほうが断然早いというケースが発生しています。
詳しいことが分かり次第、また記事書きます。

 - MySQL

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

  関連記事

mysql
[MySQL]テーブルのカラムのコメントの変更

MySQLでカラムのコメントを変更する方法を探してみた。 結局、カラムの再定義と …

mysql
[MySQL]プロセスの確認と、プロセスの強制終了

ストプロ内でのどのSQLが実行されているかもプロセスを見れば分かる MySQL内 …

mysql
[MySQL][phpMyAdmin]Allowed memory size of XXXXXX bytes exhausted (tried to allocate XXXXXX bytes)

こんな現象がおきました phpMyAdminでデータベース全体をエクスポートした …

mysql
[MySQL]Cannot load from mysql.proc. The table is probably corrupted

mysqlのストアドプロシージャの再登録をしようとすると、下記のエラーが表示され …

mysql
[MySQL] ランダム文字列の生成

「指定された文字の構成で、ランダムの文字列を生成する。」 よく使うのだけど、なか …

mysql
mysqlで一般クエリログをする

mysqlで一般クエリログをするためには、 my.cnfをいじるといいのだけど、 …

mysql
MySQL用シーケンス制御ファンクション集(PostgreSQL風にファンクションを揃えてみた)

MySQLには、PostgreSQLのようなシーケンスが機能的にないので、作って …

mysql
[MySQL]コマンドでのSQL文入力の途中キャンセル

mysqlをコマンドラインで操作している際、特に複数行、SQL文を入力してて途中 …

mysql
[MySQL]SELECT文で、FROM句を使用しないで、WHERE句を使用する

『SELECT文で、FROM句を使用しないで、WHERE句を使用する』 といった …

mysql
[MySQL]よく使うコマンド一覧

自分用のメモです。