Archive for the 'mysql' Category

mysql:configure: error: Cannot find libmysqlclient under /usr

mysql5のconfigureで以下のようなメッセージが出るとき、

configure: error: Cannot find libmysqlclient under /usr/local.
Note that the MySQL client library is not bundled anymore!

かつ、アーキテクチャが64のときは./configure オプションに
--with-mysql=/usr/bin/ --with-libdir=lib64
が足りない。

アーキテクチャの確認方法は
uname -r

mysql: mysql5.1.41をソースからインストール

mysqlをソースからインストールする。
pluginは全部有効にする。

cd /usr/local/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.41.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
tar zxfv mysql-5.1.41.tar.gz
cd mysql-5.1.41
./configure --prefix=/usr/local/mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-plugins=max \
--enable-local-infile
make
make install
以上でインストールは完了。
※この段階でエラーが出る場合は後述のエラーがでるときを参照

次に初期設定をおこなう。
ソースの雛形からmy.cnf を作成する。
cp support-files/my-medium.cnf /etc/my.cnf
作成したmy.cnf に文字コードの設定を追加する。
mysqld、mysqldump、mysql セクションにそれぞれ以下の設定を追加する。
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
mysqlを起動する前に、mysql 用のユーザを追加する。
groupadd mysql
useradd -g mysql mysql
mysql のインストールフォルダのオーナーをmysql ユーザに変更する。
chown -R mysql:mysql /usr/local/mysql

次に、データベースを初期化を行う。
cd /usr/local/mysql
bin/mysql_install_db --user=mysql


MySQL サーバーを起動する。
./bin/mysqld_safe --user=mysql &

※mysql起動後はrootユーザログインできるようになる。
初期状態ではrootにパスワードが設定されていないので、必ずrootユーザのパスワードを設定すること。


mysqlのconfigure,makeでエラーがでるとき

もし./configureでこんなエラーがでたら
checking for termcap functions library... configure: error: No curses/termcap library found

ncurses-develというものをインストールすればconfigureできるようになる。
yum install ncurses-devel

もしmakeでこんなエラーがでたら
../depcomp: line 571: exec: g++: not found
make[1]: *** [my_new.o] エラー 127
make[1]: ディレクトリ `/usr/local/src/mysql-5.1.41/mysys' から出ます™
make:

gcc-c++をインストールする。
yum install gcc-c++

このままmakeすると、以下のようなエラーになるので、
licit-templates -fno-exceptions -fno-rtti -c -o my_new.o my_new.cc
../include/my_global.h:1099: error: redeclaration of C++ built-in type '˜bool'

make cleanしてconfigureからやりなおすこと。
make clean
./configure --prefix=/usr/local/mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-plugins=max \
--enable-local-infile

make

make install

mysql:PL/SQLでCursor declaration after handler declaration

mysqlのPL/SQLでこんなエラーは出るとき

ERROR 1338 (42000): Cursor declaration after handler declaration

意味:カーソル宣言がハンドラ宣言よりあとで行われています。

Variable or condition declaration after cursor or handler declaration

意味:変数または条件宣言がカーソルまたはハンドラ宣言より後で行われています。

つまりPL/SQLの宣言は変数、条件、カーソル、ハンドラの順で行えということですね。

CREATE PROCEDURE procname(
    in  arg1   VARCHAR(10),
    in  arg2   VARCHAR(20)
)
BEGIN
    -- 変数宣言
    DECLARE UserName     VARCHAR(10);
    DECLARE done INT DEFAULT 0;

    -- カーソル宣言
    DECLARE cur_name CURSOR FOR
        SELECT user_name
        FROM table_name
        WHERE user_prop = arg1;

    -- ハンドラ宣言
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    -- 処理開始
    OPEN cur_name;
    REPEAT
        FETCH cur_name INTO UserName;
        IF NOT done THEN
            -- いろいろ
        END If;
    UNTIL done END REPEAT;
    CLOSE cur_name;
END;

mysql:テーブルのrepair

mysqlでこんなエラーメッセージが出てた。

Table table_name is marked as crashed and should be repaired

とりあえず、エラーが出ているテーブルを調べる。

mysql> check table table_name;
+----+---+----+-------------------+
| Table | Op | Msg_type | Msg_text |
+----+---+----+-------------------+
| table_name | check | warning | Table is marked as crashed |
| table_name | check | warning | 1 client is using or hasn’t closed the table properly |
| table_name | check | error | Record at pos: 482160 is not remove-marked |
| table_name | check | error | record delete-link-chain corrupted |
| table_name | check | error | Corrupt |
+----+---+----+-------------------+

確かにテーブルにエラーがある。
これを直すにはrepairコマンドを使うらしい。
mysql> repair table table_name;
+----+----+----+--------------+
| Table | Op | Msg_type | Msg_text |
+----+----+----+--------------+
| table_name | repair | warning | Number of rows changed from 63 to 64 |
| table_name | repair | status | OK |
+----+----+----+--------------+
これで直ったっぽい。
どうしてこの手順で直るのかはいつか調べる。

mysql:DATETIME型とTIMESTAMP型

DATETIME型は8バイト、TIMESTAMP型は4バイト。
サポートする日付の範囲は
DATETIME: 0000年~9999年
TIMESTAMP: 1970年~2037年

4バイトくらいケチらずにDATETIME型を使うのが基本か。
TIMESTAMP型で更新日時など内部データを持つのはアリかもしれない。
けど、生年月日のようなデータ入れられない。
システムの中で何種類も日付型を使うのが面倒ならDATETIME型に統一したほうがいい。

mysql:リモートログインできるユーザの追加

mysqlにリモートログインできるユーザを追加するコマンド

GRANT ALL PRIVILEGES ON DBNAME.* TO username@”%” IDENTIFIED BY ‘password’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
“%”のところにIPアドレスを指定してアクセスできる接続元IPを指定することができる。
“%”なら何処からでも接続可になる。

mysql:mysql6のソースインストールでconfigure: WARNING: unrecognized options

mysql6をソースからインストールしようとしたらconfigureのところでこんなエラーが

configure: WARNING: unrecognized options: --with-innodb

そんなわけねー、と思いつつ調べたら最近はこう指定するらしい。
--with-plugins=partition,blackhole,heap,innobase,myisam,ndbcluster,maria 
これで無事にconfigureとおりました。

mysql:MySQLのバックアップとリストア

mysqldumpでバックアップ&リストア

すべてのデータベースをdumpでバックアップ

$ mysqldump -u root -p -x --all-databases > dump.sql
特定のデータベースをバックアップするときは
$ mysqldump -u root -p データベース名 > dump.sql
すべてのデータベースを復元するときは
$ mysql -u root -p < dump.sql
特定のデータベースを復元するときは
$ mysql -u root -p データベース名 < dump.sql

mysql:mysqlとsennaのインストール

yumで要るものを全部入れる。

yum install mecab
yum install mecab-ipadic
yum install senna
yum install MySQL-shared
yum install MySQL-client
yum install MySQL-server

mysql -urootでログインして、↓このように”Tritonn Project”のバージョンが表示されればOK。 mysql -Vでは表示されないので注意。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2419
Server version: 5.0.51a-modified-log MySQL Community Server (GPL) (portions (c) Tritonn Project)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysqlインストール後の儀式、rootのパスワードを変更する。
mysqladmin -u root password パスワード


次にmy.cnfを設定する。
/usr/share/mysql/にある雛形を使ってmy.cnfを作成する。雛形はサーバスペックにあわせて選ぶ。意味なく大きいのにしないこと。

my.cnf雛形選択の目安
my-small.cnf
64Mバイト以下のメモリの小規模サーバー向け
my-medium.cnf
32M~64Mバイトのメモリを持つMySQL専用サーバーか、128Mバイトのメモリを持つサーバー向け
my-large.cnf
512Mバイト程度のメモリを持ち、MySQL専用となる機械向け
my-huge.cnf
1G~2Gバイトのメモリを持つMySQL専用サーバー向け
my-innodb-heavy-4G.cnf
4Gバイトのメモリ、InnoDBのみ、ACID、少ない接続、大量のクエリ

/etc/my.cnfを作る
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
デフォルトUTF8で使うときの文字コードの設定をmy.cnfに追加する
/etc/my.cnf
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

MySQL:auto_incrementが最大値まで達したとき

auto_incrementにしたカラムの型がintなら2147483647、bigintなら9223372036854775807がautoincrementの最大になる。

実際に最大値までauto_incrementを進めてみる。

 ALTER TABLE table1 AUTO_INCREMENT= 2147483647;
auto_incrementが最大値に達するともうそのテーブルには行を追加することはできなくなります。

oracleのシーケンスならCYCLEオプションがあるけどmysqlのauto_incrementにはそのような機能は無いらしい。

ではauto_incrementが最大値に達したとき、どうすればよいのか?

単純に
 ALTER TABLE table1 AUTO_INCREMENT= 1;
としても、table1に1より大きいキーが存在する限りauto_incrementは1に戻らない。
 DELETE FROM table1; --データを全部消す。
 ALTER TABLE table1 AUTO_INCREMENT= 1;
ならばauto_incrementは1に戻るので、循環シーケンスと似たような動きにするにはINSERTトリガーで

1. 対象テーブルのauto_increment値が最大に達しているかチェック。最大なら2.へ
2. 対象テーブルのデータを別テーブルに退避
3. 対象テーブルのデータをDELETE
4. ALTER TABLE~でauto_incrementを初期値に設定

という流れになるけど、INSERTの度に1.のチェックを走らせるのはちょっと嫌(1/2147483647の為に余計な処理を入れたくない)。また、退避後のデータをどう扱うかも微妙(UNIONするにしても別のキーが要るし・・・)だから
int autoincrementでキーの枯渇が心配ならbigint型にしたほうがよいと思う。
bigintの最大値は9223372036854775807。intの約42億倍もある。
これは1日に1億個のキーを消費しても2億年持つという計算になる。

次ページへ »