Showing posts with label mysql. Show all posts
Showing posts with label mysql. Show all posts

August 23, 2013

FluentdでMySQLのスロークエリログをMongoDBに保存してみる

1. スロークエリの設定を済ませます。

MySQLのスロークエリログの設定メモ
http://madroom-project.blogspot.jp/2013/08/mysql.html

2. fluent-plugin-mysqlslowquery をインストールします。
$ sudo fluent-gem install fluent-plugin-mysqlslowquery
3. /etc/fluent/fluent.conf を編集します。
<source>
  type mysql_slow_query
  path /var/log/mysql/mysql-slow.log
  tag mongo.mysql.slow
</source>
<match mongo.mysql.slow>
  type mongo
  database fluent
  collection mysql.slow
</match>
3. fluentdを起動します。
$ sudo fluentd
4. 適当にクエリを発行します。
$ mysql -u root -p[パスワード] mysql
mysql> select * from db where 1 = 1;
5. MongoDB側を確認します。(反映まで少しラグがあるかも)

MySQLのスロークエリログの設定メモ

なんでもない内容ですが。。。メモです。

1. my.cnfに以下を記述
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = [秒数(小数可)]
2. MySQLを再起動
"long_query_time"よりも時間がかかるクエリの内容が"slow_query_log_file"に出力されます。とりあえず確認する目的なら"long_query_time"を0にすると、たぶん全部出力されます。

次はこれをFluentdでMongoDBに保存してみようと思います。

August 18, 2013

Vagrantのローカル開発環境でホスト側からMySQLに接続する

SSHで接続しても良いんですが、XAMPPとかMAMPのような感じでローカルの3306(ではなく3366)に直接接続できる感じにしてみました。以下、飽くまでローカル開発環境の話なので、セキュリティ周りは考慮していません。尚、使用しているOSはUbuntu13.04です。

ポイントは以下の3つでした。

1. Vagrantfileで":forwarded_port"の設定をします。ホストの3366がゲストの3306を指すようになります。
config.vm.network :forwarded_port, guest: 3306, host: 3366
2. "/etc/mysql/my.cnf"の"bind-address"の設定をします。ゲストのMySQLにリモートからのアクセスを許可させます。
bind-address  = 0.0.0.0
3. SQLを実行します。rootユーザがリモートからアクセスできるようになります。
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'xxxxxxxxxx' WITH GRANT OPTION
2と3を反映したChefのレシピは、以下のようになりました。
* node['mysql']['password'] はVagrantfileの"chef.json"に書きます。レシピに直書きでもOKです。
# MySQLのインストール
package 'mysql-server' do
    action :install
    notifies :run, 'execute[mysqladmin]'
    notifies :run, 'execute[mysql]'
end

# パスワードの変更(初回のみ実行される)
execute 'mysqladmin' do
    action :nothing
    command 'mysqladmin password -u root ' + node['mysql']['password']
end

# リモート(ホスト)からの接続を許可(初回のみ実行される)
execute 'mysql' do
    action :nothing
    command "mysql -u root -p#{node['mysql']['password']} -e \"GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '#{node['mysql']['password']}' WITH GRANT OPTION\""
end

# サービスを有効にしてスタート
service 'mysql' do
    supports :status => true, :restart => true, :reload => true
    action [:enable, :start]
end

# 前述の"bind-address"の設定を反映する
template '/etc/mysql/my.cnf' do
    notifies :restart, 'service[mysql]'
end
適当なGUIクライアントソフトからlocalhost:3366にrootユーザで接続できればOKです。(ほんとは専用のユーザを用意した方が良いんだろうけど。)

February 22, 2013

データベース(MySQL)とドキュメントについて考えてみた

最近の、データベース(MySQL)とドキュメントの管理についてです。

■DDLとER図の作成
MySQL Workbenchを使っています。
ER図はpngで出力しています。

■ドキュメントの作成
fuel-dbdocsを使っています。(自作です。。。)
https://github.com/mp-php/fuel-dbdocs
http://madroom-project.blogspot.jp/2013/02/fuelphpmysqlpostgresqlsqlite.html
Jenkinsのビルド時に自動実行しています。自動実行するのは大げさな感じがしますが、見たい時に決まった場所に最新のドキュメントがある。のって大事かなと思います。JenkinsサーバのMySQLも適宜更新しないといけませんが、ユニットテストも実行していれば、そっちの関係で更新されているはずですし。
カラムにはコメントをつけるようにしていこうと思います。

■カラムの追加等
MySQL Workbenchファイルを更新します。
DDLとER図(png)も更新します。
稼働しているサーバで実行するALTER TABLE文は、MySQL Workbenchから出力できます。

MySQL Workbenchでalter tableを自動生成する
http://madroom-project.blogspot.jp/2013/01/mysql-workbenchalter-table.html



これで、MySQL Workbenchファイルで一元管理できるかなと。
Excelドキュメント(嫌いですが)が必要な場合は、後からEclipseのER Masterで生成できます。
http://ermaster.sourceforge.net/
Excelドキュメント(嫌いですが)のフォーマットもカスタマイズ可能です。

この方法で、ずっとネックだった、実際の状態とドキュメントの内容が「ズレる」ことを回避できそうです。

January 29, 2013

FuelPHPでMySQLドキュメントを生成するパッケージを作ってみました。

2013/01/10 追記
高機能版作りました。

FuelPHPでMySQL/PostgreSQL/SQLiteのドキュメントジェネレータを作ってみました。
http://madroom-project.blogspot.jp/2013/02/fuelphpmysqlpostgresqlsqlite.html

--

ソースは、以下になります。
https://github.com/mp-php/fuel-packages-mydoc

Linuxサーバ上でMySQLドキュメントを作りたく、ジェネレータを探したんですが見つからず、FuelPHPのパッケージとして作ってみました。(実はまだLinuxサーバ上で実行していませんが。。。)

Twitter Bootstrapを使っています。

とりあえず、以下を出力するようにしてみました。
* テーブル一覧とテーブル詳細
* インデックス一覧とインデックス詳細
* トリガー一覧とトリガー詳細

以下、使い方です。(READMEはいつもの通り、後日。。。)

(1)
fuel/packagesに"mydoc"というディレクトリ名で配置します。

(2)
config.phpのalways_load.packagesに"mydoc"を追加します。

(3)
db.phpの設定をします。尚、PDOドライバは使用出来ません。

(4)
実行します。
php oil r mydoc:html <スキーマ名>
<スキーマ名>はdb.phpの"default"とかとは異なります。例えばmysqliなら、connection.databaseの値です。ローカルやCIサーバ上で実行することを想定しているので、スキーマ名指定にしました。

ドキュメントはapp/tmp/mydocに出力されます。第二引数にディレクトリ名を与えると、そのディレクトリの下にmydocディレクトリが出力されます。既にmydocディレクトリが存在する場合は"-f(--force)"オプションを付けて下さい。削除した後、再度、生成します。

(5)
設定で
* webfontの指定ができます。
* 除外するテーブルの指定ができます。
* 除外するテーブル名の正規表現が指定出来ます。


一気に作ったのでソースが散らかっている感がありますが、少しずつ整えようと思います。。。

明日、試しにJenkinsからキックしてみます。

January 13, 2013

MySQL Workbenchでalter tableを自動生成する

MySQL Workbenchでalter tableの自動生成が出来たので、手順をメモしておきます。

MySQL Workbenchは以下からDL出来ます。(要アカウント。)
http://dev.mysql.com/downloads/workbench/
ログイン(サインアップ)画面の"No thanks, just start my download."からアカウント無しでDL可能です。(Twitterでご教示頂きました。有難うございます。)


(1)
MySQL Workbenchで以下のような設計をして、DBを作成します。
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `mwb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mwb` ;

-- -----------------------------------------------------
-- Table `mwb`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mwb`.`users` (
  `id` INT NOT NULL ,
  `name` VARCHAR(255) NOT NULL ,
  `age` INT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
(2)
MySQL Workbenchで以下のような設計に修正します。修正内容は適当です。尚、MySQL Workbench上で修正しただけで、実際に実行はしません。
* users.nameをnull可に
* users.nameにインデックス"idx"を追加
* users.school_idを追加(外部キー)
* users.ageをusers.school_idの下に
* users.ageをnull不可に
* schoolsテーブル追加
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';


-- -----------------------------------------------------
-- Table `mwb`.`schools`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mwb`.`schools` (
  `id` INT NOT NULL ,
  `name` VARCHAR(255) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mwb`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mwb`.`users` (
  `id` INT NOT NULL ,
  `school_id` INT NOT NULL ,
  `age` INT NOT NULL ,
  `name` VARCHAR(255) NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_users_schools_idx` (`school_id` ASC) ,
  INDEX `idx` (`name` ASC) ,
  CONSTRAINT `fk_users_schools`
    FOREIGN KEY (`school_id` )
    REFERENCES `mwb`.`schools` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
(3)
現在、DBは(1)の状態です。つまり、(2)にするalter tableが欲しい状態です。
MySQL Workbenchで Database > Synchronize Model...と進んで、接続情報を入力して、Continueをクリックします。その後の画面を指示通りに進めると、以下のSQLが出力されました。Executeを押すと実際に実行されるので注意して下さい。
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

ALTER TABLE `mwb`.`users` CHANGE COLUMN `age` `age` INT(11) NOT NULL  AFTER `school_id` , CHANGE COLUMN `name` `name` VARCHAR(255) NULL DEFAULT NULL  , ADD COLUMN `school_id` INT(11) NOT NULL  AFTER `id` , 
  ADD CONSTRAINT `fk_users_schools`
  FOREIGN KEY (`school_id` )
  REFERENCES `mwb`.`schools` (`id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
, ADD INDEX `fk_users_schools_idx` (`school_id` ASC) 
, ADD INDEX `idx` (`name` ASC) ;

CREATE  TABLE IF NOT EXISTS `mwb`.`schools` (
  `id` INT(11) NOT NULL ,
  `name` VARCHAR(255) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
alter tableが正しく出力されない場合は、MySQL WorkbenchのSchema Nameと実際のDB名が一致していない可能性があります。

P.S.
ER MasterはDBインポートからのドキュメント自動生成専用で使うことにする。。。

December 21, 2012

UbuntuにMySQL(とphpMyAdmin)をインストールする

コマンドのメモです。phpMyAdminは必要に応じて。
$ sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev phpmyadmin
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (x86_64) using readline 6.2
* 途中、rootユーザのパスワードを入力します。

phpMyAdminをインストールした場合は、更に
$ sudo ln -s /usr/share/phpmyadmin /var/www
$ sudo service apache2 restart
をして、[ベースURL]/phpmyadmin にアクセス
* 公開される配置する場合、別途セキュリティ対策が必要です。

■参考
2.4. Linux に MySQL をインストールする
http://dev.mysql.com/doc/refman/5.1/ja/linux-rpm.html