MySQL
インストールmysqlはインストールされている可能性がありますので、 rpm -qa | grep mysql で確認します。バージョンが怪しかったので、とりあえずけしておきました。 rpm -qa | grep mysql| xargs rpm -e 消えなかった場合は、--nodepsでインストールしました。http://dev.mysql.com/downloads/から4.1.7をダウンロードして、 rpm -Uvh --nodeps MySQL-server-4.1.7-0.i386.rpm rpm -Uvh --nodeps MySQL-client-4.1.7-0.i386.rpm rpm -Uvh --nodeps MySQL-devel-4.1.7-0.i386.rpm もししくはソースからのコンパイルです。http://dev.mysql.com/downloads/mysql/4.1.html#Sourceから落として、 ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-charset=sjis --with-extra-charsets=all --with-berkeley-db --with-innodb --without-readline --with-named-thread-libs="-lpthread" この --with-named-thread-libs="-lpthread"は、CentOS5にインストールしたときに(MySQL4.0.25) configure: error:This is a linux system and LinuxThreads was not found. とエラーが出ちゃったので、指定してます。 また他にエラーがでるときは --without-readline をはずしてみましょう。 make CentOS5で下記のエラーが mysqld.o: In function `main': mysqld.cc:(.text+0x3ee0): undefined reference to `my_fast_mutexattr' mysqld.o:mysqld.cc:(.text+0x4143): more undefined references to `my_fast_mutexattr' follow collect2: ld returned 1 exit status んーー http://bbs.fedora.jp/read.php?FID=9&TID=3606を参考にmysql-4.0.25/sql/sql_class.ccを修正します。39行目あたりに #include <assert.h> がありますので、その下に #ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP pthread_mutexattr_t my_fast_mutexattr; #endif を追加します。するとmakeは通りました。 opensuse11.1で mysql.cc:1641: error: expected primary-expression before '?' token とでたので、gccとg++を4.1にしてやるといけました。 ld: cannot find -lstdc++ とのエラーが.. ln -s /usr/lib/libstdc++.so.5.0.7 /usr/lib/libstdc++.so として再びmakeでいけました。 make install このとき、/usr/local/mysql/share/mysqlにmy-???.cnfがありますので、自分にあったファイルを/etcにmy.cnfでコピーしましょう。また/usr/local/mysql/binにパスをとおしておきましょう。 mysql-server.sh がありますので、自動起動する場合は使用しましょう。 basedir=/usr/local/mysql bindir=/usr/local/mysql/bin if test "$datadir" != "/usr/local/mysql/var" pid_file=$datadir/`/bin/hostname`.pid RedHat?の場合 cd support-files cp mysql.server.sh /etc/rc.d/init.d/mysqld chmod 755 /etc/rc.d/init.d/mysqld chkconfig --add mysqld chkconfig --level 345 mysqld on FreeBSDの場合 cd support-files cp mysql.server.sh /usr/local/etc/rc.d/ chmod 755 /usr/local/etc/rc.d/mysql.server.sh 次にDBD::mysqlをインストールします。これはperl用のドライバです。http://www.cpan.org/modules/by-module/DBD/から DBD-mysql-2.9004.tar.gzをダウンロードしました。では解凍してコンパイルです。(20070618時点ではDBD-mysql-4.005.tar.gz) perl Makefile.PL make make test make install ここでエラーが failed: Can't load '/root/DBD-mysql-4.005/blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.12 とか出る場合は、 cd /usr/local/lib ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.12 libmysqlclient.so.12 で作っておきました。 次にPHPで使用するにはPHPのソースを展開しているディレクトリで(4.3.9) ./configure --with-mysql make make install ユーザがないときは作成しておきます。 groupadd mysql useradd -g mysql -d /dev/null -s /bin/false mysql もしくはもう一度PHPをインストールしてください。ではMySQLを初期化します。 scripts/mysql_install_db /usr/local/mysql/varにできてました。これは、my.cnfのdatadirのところです。また権限を変更しておきます。 chown -R mysql:mysql /usr/local/mysql/var /etcにmy.cnfがいます。では起動して、パスワードを変更しておきましょう。 mysqld_safe --user=mysql & /usr/local/mysql/bin/mysqladmin -u root password 'new-password' /usr/local/mysql/bin/mysqladmin -u root -h localhost password 'new-password' たまたまwindows版でもやってみたんですが、password 'new-password'の'までパスワードとして登録されてしまいました。ほんま? さらにmy.iniにパスワードがそのまま書いてあるけど、なんだこれ? では接続してみましょう。 mysql -u root -p windowsの場合はsetup.exeで終わり。インストールディレクトリのbin\winmysqladmin.exe を実行しましょう。userとpasswordを設定してログインすると、my.iniがWINDOWS配下にできております。 http://www.nihon-eng.co.jp/c-break/TechNote/mysql/MySQL5_Inst.htm を参考にしてみてください。サービスはbin\mysqld-nt --install-manualで登録できます。 またよく/etc/my.cnfとありますが、my.cnfはここにおく必要があるのでしょうか。別にここでなくてもよく、最初に参照するのが、/etc/my.cnfで、次にデータディレクトリの下のmy.cnf、次に--defaults-extra-fileで指定されたファイルとなります。ではこれらに複数存在する場合は、内容が加算されるようなので、注意しましょう。 http://web.kuicr.kyoto-u.ac.jp/manual/mysql/manual.ja_Access_denied.html インストール Ver5http://dev.mysql.com/downloads/mysql/5.0.htmlから5.0.13をダウンロードしました。 wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.13-rc.tar.gz/from/http://www.softagency.co.jp/MySQL/ tar xzvf mysql-5.0.13-rc.tar.gz cd mysql-5.0.13-rc どのようなオプションがあるか見ておきます。 ./configure --help ./configure --prefix=/usr/local/mysql5 --with-mysqld-user=mysql --with-charset=binary --with-extra-charsets=all --with-berkeley-db このとき checking for termcap functions library... configure: error: No curses/termcap library found ってエラーが出た場合は、 yum install ncurses-devel で入れてやりました。 make あれ? exec: g++: not found なんでいれてないんだろ? yum install gcc-c++ でインストール make install ではデータディレクトリの権限を変更しておきましょう。ユーザmysqlがない場合は作成しておきます。 groupadd mysql useradd -g mysql -d /dev/null -s /bin/false mysql またcnfファイルをコピーしておきます。 cp support-files/my-large.cnf /etc/my.cnf my.cnfのmysqldにdefault-character-set=ujisを追加して、 [client] default-character-set=ujis [mysqld] default-character-set = ujis skip-character-set-client-handshake [mysqldump] default-character-set = ujis [mysql] default-character-set = ujis また[mysqld]にinnodb_file_per_tableを追加しておくと、ibdata1にデータが保存されずに、テーブル毎に.ibdファイルが作成されます。 scripts/mysql_install_db おっ?5.1の時エラーがでたぞ unknown option '--skip-federated' my.cnfにskip-federatedってあるからか。とりあえずコメント chown -R mysql:mysql /usr/local/mysql5/var/ では起動させてパスワードを変えておきます。 /usr/local/mysql5/bin/mysqld_safe --user=mysql & /usr/local/mysql5/bin/mysqladmin -u root password 'new-password' /usr/local/mysql5/bin/mysqladmin -u root -pnew-password -h localhost.localdomain password 'new-password' 文字化けについてはこちらを参考にさせていただきました。http://wota.jp/ac/?date=20061011#c15 アップグレードwww.mysql.gr.jp4.1以上(含む5) への移行支援 4.1に移行する場合はパスワードの長さに対応するためにmysql_fix_privilege_tablesというスクリプトがあるらしい。 また [mysqld] old-passwords で逃げるかです。しかし、これ以上に問題なのは、VARCHARとCHARの長さがはバイトから文字になってしまったことです。ですので、いったん
mysql5を止めた後、mysql5のデータディレクトリにmysql4.0のデータをコピーして、mysql5を起動します。その後、
長さを変更していきます。変更後myisamchk -r *.MYIでリペアして、mysql5を起動させます。んーーー ./mysql_change_char_len.sh --fix --user=hogeuser --password=hogepass -h127.0.0.1 -P3307 ポートを3306から3307に変更している場合です。そのままであれば、-P3307はいりません。若干桁数が1増えている項目があったりします。
参考 複数バージョンを共存起動時(mysqld)に --defaults-fileオプションで、my.cnfを指定してやります。もしくはMYSQL_HOME/varにmy.cnfをコピーしてやります。また各バージョンのmy.cnfのpid-file,port,socketがぶつからないように(当然データも)設定しておきます。 デーモンでの起動cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld でコピーしてやります。あとは chmod 755 /etc/init.d/mysqld chkconfig --add mysqld コマンドパスワードを設定している場合は -u root -pを付加しましょう。パスワードを聞かれるのがいやな場合は、-u root --password=passとしましょう。もしくは -uroot -ppassです。 mysql -u root -p rootpassword mysql -uroot -prootpassword mysql -user=root --password=rootpassword
MySQLコマンド
SQL
型
my.cnfmysqladmin -u root variables -pで値を確認してからいろいろさわってみましょう。 あとmysql --helpも
ODBChttp://dev.mysql.com/からMySQL Connector/ODBCのGenerally Available (GA) 3.51.09 を選択してダウンロードします。 JDBChttp://dev.mysql.com/downloads/からMySQL Connector/JのGenerally Available (GA) 3.1.6を選択してダウンロードします。 その中にmysql-connector-java-3.1.6-bin.jarがありますので、これをCLASSPATHに追加します。ドライバクラスは、 org.gjt.mm.mysql.Driver URLは jdbc:mysql://hogeserver/hogedb?useUnicode=true&characterEncoding=SJIS もしくは文字コードによってはSJISにeuc-jpなんですが、これをxmlファイルにかくとこの&でエラーになるはずです。ですので、 & → & として、 jdbc:mysql://hogeserver/hogedb?useUnicode=true&characterEncoding=SJIS とします。また全角-が化けるとか~が化ける場合は、 jdbc:mysql://hogeserver/hogedb?useUnicode=true&characterEncoding=MS932 とします。これはあくまでSJISでDBを作成しており、pageEncodingをMS932にしている場合です。またSetCharacterEncodingFilter?.javaもつかって、web.xmlに <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>MS932</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> としてます。MySQL4.0の場合です。他のバージョンは試していません。しかしOracleもそうですが、正直どうにかならんもんでしょうか。これ。 MySQL Control Centerhttp://dev.mysql.com/downloads/other/mysqlcc.html ダンプ・リストアmysqldump -F -l hogedb > dump.sql オプションの-Fはすべてのログをflushします。 -lはREAD LOCALロックをかけます。 mysql hogedb < dump.sql mytoptopコマンド風にMySQLの負荷状況がみれます。http://jeremy.zawodny.com/mysql/mytop/からダウンロードしました。 tar xzvf mytop-1.4.tar.gz perl Makefile.PL おっと Warning: prerequisite Term::ReadKey 2.1 not found. とでました。CPANを参考にして、 perl -MCPAN -e shell install Term::ReadKey 再度mytop-1.4.tar.gzを解凍したディレクトリで、 perl Makefile.PL make make install ここでDBD::mysql 1 not found.と出る場合は、上のほうの記述にしたがってDBD::mysqlをインストールしておきましょう。インストールが終わったんで、実行してみます。 mytop -uhogeuser -phogepass -ddatabase -s1 hogeuser,hogepassはユーザ、パスワードです。-dでデータベース、-sは画面のリフレッシュ時間です。遅いSQLがあればfを押してIDを入力するとSQL全体が見えます。http://jeremy.zawodny.com/mysql/mytop/mytop.htmlにマニュアルがあります。 チューニングまず時間がかかっているSQLをEXPLAIN を頭につけて実行します。すると、 table,type,possible_key,key,key_len,ref,rows,Extra に値が設定されているかと思います。まずkeyが適切に使われているか、またrowsの値が小さいかを確認しましょう。またkeyについては5.0以前は1テーブルについてひとつしかインデックスは使われないそうです。ですので、異なる項目でORとかを使うような検索は注意しましょう。また!=は使わないように。EXPLAINでrowsをみてみよう。 バイナリログ以前からvarの下にマシン名-bin.001とかいうようなファイルが複数できていたので、気にになって調べてみると、バイナリログ というもので、更新するステートメントが入ってます。mysqldを--log-bin=logfilenameで起動するとできるようです。ここでファイル名を指定してなければ、マシン名-binでファイルが作成されます。RESETコマンドで消すことができるようです。 RESET MASTER; もし部分的に消したい場合は、 PURGE MASTER LOGS TO 'machine-bin.005'; として、 SHOW MASTER LOGS; を見てみると005より小さいバイナリログが削除されます。時間を指定るする場合は、 PURGE MASTER LOGS BEFORE '2005-01-01 01:01:01'; とすると2005-01-01 01:01:01より古いデータが消されます。 またバイナリログがvarの下にたまってきましたので、場所を変えておきます。 log-bin = /usr/local/mysql/binlog/binlog また max-binlog-size=256M <=バイナリログの最大ファイルサイズ expire-log-days=7 <=ログの保持期間 binlog-do-db=dbname <=バイナリログを取るdb binlog-ignore-db=dbname <=バイナリログを取らないdb も指定できます。 http://www.softagency.co.jp/mysql/Manual/4.1.1/html-split/manual_4.html#SEC314 移行別のマシンに同じ環境を作るとき、/usr/local/mysql/varの中の対象のデータをコピーしてやる。その後、データベースmysqlのuserとdbをエクスポートして、移行先で、必要なデータをインポート ib_logfile0 ib_logfile1 ibdata1 もコピーします。 TOOLMySQL提供のMySQL GUI ToolsかNavicatが便利。ただしnavicatは有償
他にもつみきウェブへ!!のCommon SQL Environment ver1.59(http://www.fiberbit.net/user/mo880d4/cse/winclients-3_22_28_sjis.zipもしくはhttp://www.fiberbit.net/user/mo880d4/cse/winclients-3_22_28_euc.zipがいる)があります。 TIPS別のDBにコピーmysqlhotcopy -u root -p hoge dbmoto dbsaki なぜかDBD-mysql-4.005.tar.gzでは駄目で、DBD-mysql-2.9008.tar.gzではうまくいけました。mysqlは4.0です。 スペースは空けないといけない。 PHPが違うsocketを見ているときphp.iniのmysql.default_socket = "/tmp/mysql.sock"に記述してやりましょう。 ERROR 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL clienthttp://dev.mysql.com/doc/mysql/ja/Old_client.htmlから mysql> UPDATE user SET Password = OLD_PASSWORD('mypass') -> WHERE Host = 'some_host' AND User = 'some_user'; や SET PASSWORD FOR hoge@localhost = OLD_PASSWORD('hogepass'); 後は mysql> FLUSH PRIVILEGES; つまり以前はパスワードのハッシュが、16バイトだったのに4.1からは40バイトに変更されているためにこのエラーがおこっている。普段から、16バイトで作成したい場合は、my.cnfに [mysqld] old-passwords としておけばいい。これはどうかと思いますが... もしくはwhich mysqlでmysqlの居所をみてみましょう。もしかしたら、ver3のコマンドが動いてるかもしれません。 SQL実行mysql -u root -pyourpassword database < hoge.sql テーブル最適化削除を繰り返していると肥大化してくるので、最適化しておきましょう。 optimize table hogetable; javaで全角カナのパをlikeでとるとケもとってくる。dbをujisでやっていると、なぜか、where koumoku like 'パ%'とするとケもとってきます。アとかは大丈夫。なんだこりゃ。sjisにするととりあえず動きました。 漢字の十で落ちた文字列に漢字の十がある場合にinsertが失敗しました。この場合は、 [mysqld] default-character-set=sjis [mysql] default-character-set=sjis のあたりを見直しましょう。ソ、申などもそれにあたります。 likeで検索されない例えば hoge like '%ほ%' とかしても検索されない場合があります。そのときは、 hoge like binary '%ほ%' 1030: Got error 127 from table handler対象のテーブルが壊れているようなので、 repair table hogetbl; を実行。チェックだけの場合は、 check table hogetbl; ログsafe_mysqld --log=/var/log/mysql logオプションで出力したいログファイル名を指定します。 日付加算日付を1日koumoku1に加算 koumoku1 + interval "1" DAY 日付を1日5時間koumoku1に加算 koumoku1 + interval "1 5" DAY_HOUR java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00'JDBCで日付のデータを取得しようとしたら、SQLExceptionが投げられました。そもそもこの問題はJava側で"0000-00-00 00:00:00"の値を持てないことに発端しているとのことです。 AUTO_INCREMENTで生成された値の取得方法last_insert_id()で取得可能 年月で集計select date_format(datekoumoku,'%Y-%m') ,count(*) from table1 where group by date_format(datekoumoku,'%Y-%m') 調べ物リンクhttp://www.mysql.gr.jp/ FAQはためになります。 参考書籍MySQL全機能リファレンス コメント
|