Tag Archives: MySQL

phpから同じMySQLサーバ内の複数DBを操作

以前からMySQL接続を二重に張れない問題が残っていてどうしたらC言語のようにできるのだろうと思っていたら今のMySQLではUSE等で切り替えなくてもDB名を指定して操作できる事を思い出しました。

今までは
USE test_db1;

SELECT * FROM table1;

USE test_db2;

SELECT * FROM table1;

のようにしていましたが、これは下記の様に書き換えられます。

SELECT * FROM test_db1.table1;

SELECT * FROM test_db1.table2;

しかもこの方法なら2つのDB内テーブルの結合もできるのでは?

MySQL5利用時のphpMyAdmin文字化け

またくだらないことに時間をつぶされた。orz
先日、レコードの照会を全てbinaryにすることで一応PHPからの入出力に文字化けの問題がなくなったのだが、相変わらずphpMyAdminがcharset=utf-8でページ出力するためにphpMyAdmin上でSJISデータが入力できないだけでなく、複数のレコードを選択したりすると画面上でタグが破壊されて操作不能に陥る。MySQL4.0の時はメインページのLanguageで『日本語 – Japanese(sjis)』を選択すればよかったのがMySQL5だと『日本語 – Japanese』しかなくそれがutf-8になっている。リストを見た感じ他の言語も全部utf-8しか選べないようになってるようだ。

それでhttpヘッダの方charset設定はどこだろうとgrepを駆使して探していたらどうもconfigになくてlibraries/database_interface.lib.phpにそれらしき記述がある。でもconfigでないのであまり弄りたくないので、ググって見ることにしたら…。やっぱりここしかないのか…。

要するにMySQL4.1以上はlibraries/database_interface.lib.phpを使用しないように分岐されていました。ということで以前のようにShift-JISやEUCを選択したときは、PMA_DBI_postConnect関数内のif (PMA_MYSQL_INT_VERSION >= 40100)を無効にしてelse部分だけを残しましょう。

function PMA_DBI_postConnect($link, $is_controluser = false)
{
(省略)
/* ←バッサリとコメントアウト
if (PMA_MYSQL_INT_VERSION >= 40100) {
(省略)
} else {*/
require_once(‘./libraries/charset_conversion.lib.php’);
//}

こうすれば分岐無視でcharset_conversion.lib.phpを読み込みます。

追記:
『if (PMA_MYSQL_INT_VERSION >= 40100) {』を『 if (false) {』にするだけでよかったな…。

参考:cl.pocari.org – MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法
http://cl.pocari.org/2006-06-17-1.html

MySQL5で文字化けと格闘

まだ、自分の中では実績のないMySQL5ですがUTF8でページ作成していたときは問題なかったのがSJISでページ作成したら思ったとおり文字化け起こしました。結局は文字列の照合を全てbinaryにして解決しましたが、いろいろと改造してしまったので確定要素がない…。(ページ作成を落ち着いたらテーブル設定以外を元に戻してみます)

◆以下は落ち着いたら元に戻す項目

php.iniを導入して言語を日本語、システムの文字コードをSJISに設定して再起動
# cp php.ini-dist /usr/local/lib/php.ini
# ee /usr/local/lib/php.ini

編集項目
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = SJIS

/etc/my.cnfにSJISの設定を追加

[mysqld]
default-character-set=sjis

[mysqldump]
default-character-set=sjis

[mysql]
default-character-set=sjis

と設定して再起動。
MySQLにログインしたあと下記のコマンドを発行して確認。

mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| character_set_client | sjis |
| character_set_connection | sjis |
| character_set_database | sjis |
| character_set_results | sjis |
| character_set_server | sjis |
| character_set_system | utf8 |
+————————–+——-+
6 rows in set (0.00 sec)

よくいろいろな薬を試して結果直ったけれど、どの薬が効いたのか分からない…そんな状況です。(多分、my.cnfやphp.iniの設定は不要だったきがしますが…)

MySQLのrootにパスワードを設定

面倒だったのでずっと放置気味でしたが、一応MySQLのrootにもパスワードを設定。PostgreSQLはインストール時に設定したので特に問題なし。

今回使用した方法はSETコマンド

SET PASSWORD FOR root@”localhost”=PASSWORD(‘****’);

****は伏字。これならリロード不要です。(5.0で確認)

パスワードを設定した以降は-pオプションをつけないと怒られます。

# /usr/local/mysql/bin/mysql -u root mysql -p

それとSHOW FIELDS FROM より楽な DESCRIBE というコマンドを知った。
単語的に直ぐ忘れそうだなぁ…。

mysql のバックアップ

MySQLのバックアップは以前ちょっとだけメモっていたが、今回crontabに登録するためシェルに書き込む。

例:
#!/bin/sh
cd /usr/local/mysql/bin/
date=`date +%Y-%m-%d`
./mysqldump -u root -q testdatabase > /home/user1/db_backup/backup-$date.sql
rmdate=`date –date ’10 day ago’ +%Y-%m-%d`
rmfile=/home/user1/db_backup/backup-$rmdate.sql

if [ -e $rmfile ]; then
rm -f $rmfile
fi

このシェルを毎日実行すると、日付を入れたバックアップファイルを生成し11日目からは古いファイルを削除します。mysqldump の -q はメモリを節約したいため。

尚、復元する時は予めDBを一旦削除して作り直してから
# cd /usr/local/mysql/bin/
# ./mysql -u root testdatabase < /home/user1/db_backup/backup-2006-07-31.sql
とコマンド発行して回復。

参考:MySQL講座 +++[smart]
http://www.rfs.jp/server/mysql/02/07.html

MySQLへ二重接続

ちょっと必要性の問題でひとつのプログラムから同時に2つのDBへ接続するテストを行いました。

ソースはこちら(クラスで使ったほうが楽になるのでC++版のみです。)
mysql_cxx20060520-1

コンパイルした後、実行したらFreeBSDだとライブラリが見つからないとエラー、初期のソースを組んだ後PHPのインストールと設定などで一度reboot掛けていたのでldconfigの効果が消えていたっぽい。

ldconfig -m /usr/local/mysql/lib/mysql

Linuxだと/etc/ld.so.confに書けば済むはず(こっちはreboot掛けたことない)なのに、FreeBSDには該当ファイルなし。findで探したら/usr/compat/linux/etc/ld.so.confに見つかったが編集してreboot掛けても意味なし。/etc/ld.so.confにコピーしてrebootしてもダメ。

結局、.loginに

if ($?LD_LIBRARY_PATH) then
setenv LD_LIBRARY_PATH “${LD_LIBRARY_PATH}:${MYLIB}”
else
setenv LD_LIBRARY_PATH “${MYLIB}”
endif

と追加して解決。

DBクライアントは他のユーザーでも使用するかも知れないから/etc/profileに書いたほうがいいかなー?

MySQLでDB操作

MySQLでデータベースを作成します。

> CREATE DATABASE [DB名];

作成したDBに切り替えた後テーブルを作成します。

CREATE TABLE user_master (
user_id varchar(10) BINARY,
user_name varchar(30) BINARY,
user_age numeric(3),
update datetime,
PRIMARY KEY(user_id)
);

テーブルの削除

> DROP TABLE user_master

データベースのバックアップ
# mysqldump –opt -u [ユーザ名] -p [データベース名] > [バックアップファイル名]

データベースのリストア
# mysql -u [ユーザ名] -p [データベース名] < [バックアップファイル名]

MySQLのコマンド

MySQLの使い始めに確認するコマンドの一覧です。以下のコマンド以降は通常のSQL文で操作します。

MySQLにログイン

# /usr/local/mysql/bin/mysql [DB名] -u [ユーザー名]

データベースの一覧を表示

> SHOW DATABASES;

データベースの切り替え

> USE [DB名]

テーブルの一覧

> SHOW TABLES;

フィールドの一覧

> SHOW FIELDS FROM [テーブル名];

ログアウト

> QUIT