2016年02月14日

シェルやシェルスクリプトからMySQLのコマンドやSQLを実行

シェルからMySQLのコマンドやSQLを入力して実行するには以下のようにするとできます。
echo '送りたいコマンドやSQL' | mysql オプション ...


例. データベースnewsで、"show table status"の必要な項目だけ確認したい場合は以下のようにできます。
$ echo 'show table status' | mysql -u root -D news | awk '{print $1,$2,$5}'
Name Engine Rows
carrier InnoDB 9
category InnoDB 6
item InnoDB 7916
site InnoDB 14
site_access_log InnoDB 62135


また、これを使ってSQLを実行するシェルスクリプトを作ればいろいろと便利です。

これらのまとめ
シェルからMySQLのコマンドやSQLを実行
シェルスクリプトでMySQLのコマンドやSQLを実行

posted by jun1 at 22:37| Comment(0) | TrackBack(0) | データベース

2014年10月26日

MySQL:IPアドレスを保存するカラムのデータ型

MySQLにクライアントのIPv4アドレスを保存する必要ができました。そこでテーブルを作ることになりましたが、IPアドレス用カラムはどのデータ型が良いか疑問に思ったので調べてみました。

今までの仕事で何度か稼働中のMySQLを使うことはありましたが、ほとんどの場合、IPアドレスはVARCHAR型で保存していました。(他の人の設計)

VARCHAR型でも問題ありませんでしたが、今回はPostgreSQLに専用のデータ型があることを思い出してしまいました。そのため、MySQLにも無いのかな?と疑問に思い、調べてみることにしました。

例 PostgreSQLのIPアドレス用のデータ型
ネットワークアドレス型 (PostgreSQL 9.3.2文書)

調べた結果、MySQLは文字列以外だとUNSIGNED INTEGERか、VARBINARY(4)で、INET_ATON()やINET_NTOA()関数と一緒に使うのが良さそうでした。
INET_ATON() (MySQL 5.6 Reference Manual)

IPv6の場合は、データ型にVARCHAR(16)を指定して、INET6_ATON()とINET6_NTOA()関数を使うようです。ただし、INET6_ATON()とINET6_NTOA()はMySQL 5.6.3から追加されました。そのため、5.6.3以前のバージョンでは使用できないそうです。試しに5.1でINET6_ATON()を使うとエラーになりました。
mysql> SELECT INET6_ATON('::1');
ERROR 1305 (42000): FUNCTION test.INET6_ATON does not exist

参考
IPv6 and internationalized domain (IDNA) functions for MySQL
Changes in MySQL 5.6.3 (2011-10-03, Milestone 6)

これらの結果は以下にまとめました。
MySQL IPアドレス用カラム

追記
MySQLへのIPv4アドレス保存を、PHPで試してみました。また、PHPにもIPv4アドレスの文字列、整数変換用の関数ip2long()、long2ip()がありますので、合わせてテストしてみました。
ip2long、long2ipのテスト
posted by jun1 at 14:21| Comment(0) | TrackBack(0) | データベース

2014年10月04日

Linux版Oracle 11g XEの文字コードをシフトJISに変更(2)

この前、Linux版 Oracle 11g XEで、データベースのキャラクタセットをシフトJISに変更しました。
Linux版Oracle 11g XE 文字コードをシフトJISに変更

そのときに使用したpfileやデータベース作成スクリプトですが、中身が良く分からない状態で作成したので、ちょっと調べてみました。また、データベース作成スクリプトで、ディスク容量を少なくしたものも試してみました。

以下、そのときのまとめ
Oracle 11g XE データベース作成用スクリプト
Linux版Oracle 11g XEの設定など

とりあえず、Oracleを試すのに問題がないので、これ以上の深入りはやめときます。
posted by jun1 at 10:04| Comment(0) | TrackBack(0) | データベース

2014年09月16日

Linux版Oracle 11g XEの文字コードをシフトJISに変更

これまで2回ほどOracleを使っているサイトの改修に関わったことがありますが、どちらもシフトJISでした。
そのため、無料のLinux版Oracle 11g XEの文字コードをデフォルトのUTF-8からシフトJISに変更してみようと、調べてみました。

最初は簡単にできるだろと思っていまいしたが、ネットで調べるとOracle初心者には難しい内容のページばかりでした。しかし、とりあえず変更してみようと思い、いろいろなサイトと新しく買ってきた本を参考に、どうにかシフトJISのデータベース作成に成功しました。

今後、WEB関係でOracleを使用する可能性は低いですが、とりあえずシフトJISへの変更作業をまとめてみました。
Linux版Oracle 11g XE 文字コードをシフトJISに変更
posted by jun1 at 22:51| Comment(0) | TrackBack(0) | データベース

2014年08月31日

PerlでOracleにアクセス

CentOSにインストールしたOracle Express Edition 11g にプログラムからアクセスすることを試してみました。サンプルプログラムはPerlで作成し、OracleへのアクセスはDBD::Oracleを使用しました。

DBD::Oracleの使い方は、以下のようなページを参考にしました。
DBD::Oracle

Oracleに不慣れのため、Oracleの環境変数、Oracleのテスト用ユーザー作成やテーブル作成にちょっと手間取ったので、それらを以下にまとめました。
Perl・DBD::Oracle
posted by jun1 at 23:39| Comment(0) | TrackBack(0) | データベース

2014年08月24日

Oracle Express Edition 11gをCentOSにインストール

仕事でOracleを扱うことになりましたが、Oracleはほとんど使ったことがありません。
そのため、ちょっと勉強がてら無料のOracle Express Edition 11gをVirtualBox上のCentOSにインストールしてみました。ただし、いくつか手間取ったことがあったので、忘れないようにインストール作業をまとめてみました。
続きを読む
posted by jun1 at 21:49| Comment(0) | TrackBack(0) | データベース

2010年09月26日

1レコードへの連続アクセスのテスト

WEBサービスなどでは1レコードに複数プロセスがSELECTとUPDATEを連続して行うことがあります。 そのような連続アクセスの場合、トランザクション分離レベルやクエリーによって動作がどのようになるかを確認してみました。

対象のデータベースはPostgreSQLとMySQLです。

テストはforkでプロセスを5個作成して、それぞれのプロセスが200まで連続して加算しています。 最後のプロセスのcountが1000になれば正常にカウントされたことになります。 1000に満たない場合はカウント漏れが発生していています。 エラーが発生した場合はエラーに、デッドロックが発生した場合はデッドロックという結果にしています。


クエリー
UPDATE test_postgres SET count=count+1 WHERE id=1;

結果
PostgreSQL:OK  MySQL:OK


クエリー
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT count AS current FROM test_postgres WHERE id=1 FOR UPDATE;
UPDATE test_postgres SET count=1+current WHERE id=1;
COMMIT;

結果
PostgreSQL:OK   MySQL:デッドロック


クエリー
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT count AS current FROM test_postgres WHERE id=1 FOR UPDATE;
UPDATE test_postgres SET count=1+current WHERE id=1;
COMMIT;

結果
PostgreSQL:エラー   MySQL:OK

詳細は以下にまとめています。
1レコードへの連続アクセスのテスト
posted by jun1 at 22:24| Comment(0) | TrackBack(0) | データベース

2010年09月05日

MySQLのMEMORYストレージエンジン

MySQLの情報スキーマ(INFORMATION_SCHEMA)を調べていたら、ストレージエンジンにMEMORYという表示を見つけました。MyISAM、InnoDBは使ったことがありますが、MEMORYは使ったことがないので、ちょっと調べてみました。

続きを読む
posted by jun1 at 23:17| Comment(0) | TrackBack(0) | データベース