集計結果で数字を見る際に桁数がよくわからないことが会ったので、SQLで集計出力時に3桁ごとにカンマ区切りで見やすく表示させる対応をしたので備忘で残しておく。 各DBごとにSQLの記述が異なるのでひとまずよく使用されるMariaDB、PostgreSQL、OracleDB、SQL Serverごとで調べてみることにした。

1. MySQL/MariaDBの場合

MySQL/MariaDBの場合、対象のカラムをformat()で指定することで桁区切りが行える。

select format(1234567,0);
MariaDB [test]> select format(12345...

MariaDBで手元のPC上で動作しているDBから、リモートサーバにssh越しにバックアップする必要があったので、備忘で残しておく。

mysqldump -u ユーザ名 -p パスワード DB名 | gzip | ssh リモートサーバ 'cat > ~/BackupPATH.sql.gz'
mysqldump --single-transaction -u ユーザ名 -p パスワード DB名 | gzip | ssh リモートサーバ 'cat > ~/BackupPATH.sql.gz' # オンラインバックアップ

個人的には、ログはテキストファイルの方が色々と都合が良い(後からの統計取得だったり検知・加工してエラー確認とかシェル芸でできるので)のだが、諸々の事情(セキュリティ的な色々だったり、コマンド操作があまりできない人でも使える状態にしたいなど)によって、テキストファイルでの出力や保管、閲覧が都合が悪い事がある。 で、rsyslogではログをDBに出力可能なので、今回はOSにはCentOS 7を、出力先のDBにはローカルにインストールしたMariaDBを用いる。

1. MariaDBのインストール

まずはMariaDB自体のインストールから。以下のコマンドでインストールする。

yum i...

MariaDBで、rootのパスワードを失念してしまってその後の操作ができなくなってしまった。 で、初期化をしたので備忘として残しておく。 なお、MariaDBのバージョンは5.5を用いている。

やり方は簡単で、一旦MariaDBのプロセスを落としてからセーフモードで起動、パスワードを設定してMariaDBのプロセスを再度起動させてやるだけだ。


CentOS7でNginx・MariaDB・PHP7(LEMP環境)によるWordPressの構築

今回は、CentOS 7でNginx・MariaDB・PHP7を用いた環境(LEMP環境)でのWordPressの構築を実施する。
まず、対象のサーバにLEMP環境が導入されていることが前提となるのだが、それについては下の内容を参照してもらいたい。

CentOS7でNginx・MariaDB・PHP7(LEMP環境)を導入する

1.Nginxの設定変更

まず、NginxでVirtualHostの設定を行う。
今回の場合、テストとしてローカルネットワーク内で構築をするため、以下のような設定となる。

  • server_name : bs-pub-wordpress-01.black...

CentOS7でNginx・MariaDB・PHP7(LEMP環境)を導入する

今回は、CentOS7でNginx・MariaDB・PHP7を利用した環境(LEMP環境)の構築を行う。
なお、作業の前提としてSELinuxはすでに停止済みとする。

1.前提パッケージの導入

まず、前提パッケージであるNginxやphp7を用いるためにepelとremiのインストールを行う。

epel

yum install -y epel-release
sed -i.bk '/[epel]/,/^enabled/s/enabled=1/enabled=0/' /etc/yum.repos.d/epel.repo

remi

rpm --import http://...

MariaDB Galera Clusterで、クライアントとの接続にSSLを利用することができるようなので、設定してみることにした。
調べていると、Galera Clusterのバージョンが10.0系と10.1系で設定方法が違うようだったが、今回は10.1系での設定を行う。

1.鍵ファイルの作成

まずは、Galera Cluster側で以下のコマンドを実行し、公開鍵の作成を行う。

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-...

会社の検証機でMaxscaleのバージョンを1.2.1→1.4.3へ上げたところ、ちょっと引っかかったのでその備忘。
MaxscaleはCentOS 7にインストールしていたので、そのまま「yum update maxscale」でアップデートした…のだけど、その後にmysqlコマンドでDBを指定してログインしようとしたところ、ログインできなかった。で、何故かDB名を指定せずにコマンドを打つとログインできる。

以前、maxscaleユーザの権限を適切に設定してなかったので、とりあえず見直しをしてみたのだけど、その辺りはちゃんと設定されていた。
なんだろうなぁ…と少し引っかかったのだけど、こちらをみるとどうも1.4系からは追加でgrant文が必要になったようだ。
DB側で以下のSQLを実行してやり、無事ログインできるようになった。


Maxscaleとアプリケーションサーバが同居したサーバで負荷テストを行ったところ、どうも途中でDBとの通信が失敗したりする部分があった。
で、なんでなんだろと調べていく際にssコマンドを実行したところ…

[root@test-server01 ~]# ss -nap | grep ':3306' | wc -l
24299

…えっΣ(゚д゚ )
3306って、確かにMaxscaleのポートだけど…
どうも、すべてTIME-WAIT状態でローカルのTCPポート(CentOS7のデフォルトのローカルポート範囲が「61000-32768=28232」)を使い潰していたようだ。通信内容...


会社のシステム(Maxscale経由でDBに接続)で負荷テストをしていたところ、不可解な接続エラーが発生していた。どうも新しいセッションが作成出来ないとの事なのだが、後ろのMariaDB側のMax Connection値は余裕がある。で、いろいろと調べていたところ、Maxscaleのエラーログに以下のようなエラーが出ていた。

2016-04-26 16:53:56   Error 24, Too many open files. Failed to accept new client connection.

Oh...(´・ω・`)

どうやら、ファイルディスクリプタが上限を超えてし...


phpでSQLで取得した複数行・複数列の内容をそのまま出力させる(多次元連想配列)

仕事で何故かPHPを少し触る事になった。
で、その中でPHPで作られたコマンドラインツールでクエリの結果(複数行・複数列)をそのまま出力させたい箇所があり、以下のように多次元連想配列を利用すると簡単に書けたので備忘として残しておく。
※以下の例では、PDOを使用してSQLiteに接続している。

●test.php

/*
 ==== 変数 ====
*/
$dbfile  = 'test.db'; // 使用するDBファイル
$dbtable = 'TEST';    // SQLを実行するテーブル名
$dbwhere = 'AAA';     // SQLで検索する文字列
$dbc...

仕事でMaxscaleを利用しているのだが、Limitation and Knownを読んでなかったので読むことにした。
そんなに文章量も無いので、以下重要そうなトコだけ抜粋して記述していく。

MySQL Serverのハンドシェイクに圧縮は含まれない

Compression is not included in MySQL server handshake

Galera Cluster Monitorではデフォルトのマスターは「wsrep_local_index」が最も低いノードが対象となる

The default master selection is b...


Maxscaleについて調べていたところ、中継するSQL文の内容に応じて、指定したサーバにSQLを飛ばすように出来るフィルター機能(Named Server Filter)があるようなので、試してみる事にした。
なお、検証に用いたMaxscaleのバージョンは1.3.1を利用している。

今回は、SQL文に「five」という文字列があった場合は特定のサーバに行く、というような記述をしてみる。

●/etc/maxscale.cnf(Before)

[maxscale]
threads=4 # 同時処理数
log_messages=1
log_trace=1
logdir=/var...

MaxscaleでルーティングするSQLクエリの書き換えを行う

Maxscaleについて調べていたところ、中継するSQLクエリを正規表現で書き換えてDB側に伝える機能(Regex Filter)があるようだったので、少し触ってみる事にした。
※Maxscale 1.3.0以降で利用可能になったらしい。

書き換えルールについては、Maxscaleの設定ファイルに事前に書いておく必要があるので、以前書いたこちらの記事の設定を元にして記述していく。

●/etc/maxscale.cnf(Before)

[maxscale]
threads=4 # 同時処理数
log_messages=1
log_trace=1
logdir=/var/lo...

Maxscaleで特定のノードを優先的にマスターとして取り扱うようにする

※この設定は、Maxscale 1.3.1以降で利用可能。それ以前では動作しなかったので注意。
MariaDBのLBとして利用出来るMaxscaleだが、Read/Write Spliterとして動作させた場合、通常はwsrep_local_indexの値がもっとも若い番号(基本的には0)がマスター(書き込みノード)として扱われる。

で、このマスターに障害が発生した場合、Maxscale側でマスターを自動的に切り替えて書き込みを継続して出来るようにするのだが、Galera Clusterが復旧してwsrep_local_indexの値が変わると、自動的にMasterが切り替わってしま...


Maxscaleのチュートリアルを読んでいたら、Corosync & Pacemakerを用いてのMaxscaleのHA化についてあったので、試してみる事にした。
今回利用するOSはCentOS 7を用い、Maxscaleはインストール済、SELinuxとFirewalldは無効化済とする。

なお、同じHAのカテゴリとしてLsyncdを用いる手法も紹介されていたが、正直これは単にmaxscale.confを自動同期させるだけでそこまで役に立つものでもないので無視する。

1.Corosync & Pacemakerのインストール

まずは、HA化に必要となるCorosyn...


先日、MariaDBでテーブルの暗号化を行ってみたが、今回はそれをGaleraClusterで行ってみる。
前回でも触れたが、この機能はMariaDB 10.1.3以降である必要がある。GaleraClusterの設定方法が10.0系と10.1系で少し違っているので、少し注意しよう。
10.1系でのGaleraClusterの設定については、こちらを参照してもらいたい。

今回はMariaDB 10.1.11、GaleraClusterはすでに構成済として進めていく。

1.鍵ファイルの作成・配布

さて、まずは前回と同じく鍵ファイルを作成、そのファイルを各ノードに配布する。...


MariaDB Serverのバージョンを確認する

MariaDB Serverのバージョンを確認する場合、何個か方法がある。

1.インストールされているパッケージからバージョンを確認する

rpmファイルやdpkgファイルからインストールされている場合(yumやapt-getも同様)、それらの情報からバージョンを確認する事が出来る。

RHEL系の場合

rpm -qa | grep -i mariadb

Debian/Ubuntuの場合

dpkg -l | grep -i mariadb

2.MariaDB Serverに接続して確認する

mysqlコマンドからMariaDBに接続してバージョンを確認することができ...


今仕事でMariaDBを使っているのだが、どうやらMariaDBにはテーブルを暗号化する機能があるらしい。
というわけで、こちらを参考に実際にやってみる事にした。

なお、すでにMariaDBはインストール済みで、プロセスは起動していない状態とする。
また、この機能はMariaDBの10.1.3以降でないと利用出来ないので、もしこれより前のバージョンを使用しているようであればアップデートが必要なので注意。
今回は、2016/02/12時点で最新版であるMariaDB 10.1.11を用いている。

1.鍵ファイルの作成

まずは、以下のコマンドでテーブルの暗号化をする鍵ファイル...


作ってある検証用の環境で、MariaDBの最新版を使いたかったので、yumから最新版へアップデートしてみることにした。

まず、こちらへアクセスし、repoファイルで指定する最新バージョンのURLを把握しておく。
例えば、2016/02/11時点の最新バージョンで、CentOS7用だと以下のURLとなる。


MariaDB 10.1系でGalera Clusterを使いたかったので、その方法について備忘。
地味に10.0系から結構変わっていて、少し手こずってしまった。

今回インストールするのは、2016年02月12日時点で最新版となる10.1.11とする。

1.インストール

まずはインストールから。
MariaDB 10.1系からはMariaDBにGalera Clusterが含まれているので、普通にそのままインストールを行う。

rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
cat << EOF > /etc/...

前回、前々回とMariaDB+Galera Clusterでのバックアップについて、記述してきた。
今回は、それらと同じくMariaDBのバックアップ・リストアを実施するツールであるPercona XtraBackupを使用してのバックアップを取得してみる。

  1. GaleraClusterの構成ノードを切り離しorLVMのスナップショットを使用し、ファイルをバックアップする
  2. mysqldumpを使用してオンラインバックアップ
  3. Percona XtraBackupを使用してオンラインバックアップ

このPercona XtraBackup、mysqldumpとくらべてコマンド側で差分...


さて、前回はGalera Clusterからノードを切り離しての、もしくはLVMスナップショットを用いてのバックアップ・リストアを紹介した。
で、次は以下の3つのうち2個目である、mysqldumpを用いてのオンライン・バックアップについて検証したいと思う。

  1. GaleraClusterの構成ノードを切り離しorLVMのスナップショットを使用し、ファイルをバックアップする
  2. mysqldumpを使用してオンラインバックアップ
  3. Percona XtraBackupを使用してオンラインバックアップ

1.バックアップ

まずはバックアップ。mysqldumpでは「--single-t...


仕事で、MariaDB+GaleraClusterのバックアップについて検討する事があったので、その備忘。
さて、当たり前の話として、業務で利用している大体のDBってクラスタ化した上で定期的にバックアップを取得していると思う。

バックアップの取り方としては何通りもあると思うが、MariaDB+GaleraClusterの組み合わせで取得する場合、以下の3通りが考えられる。

  1. GaleraClusterの構成ノードを切り離しorLVMのスナップショットを使用し、ファイルをバックアップする
  2. mysqldumpを使用してオンラインバックアップ
  3. Percona XtraBackupを使...

Maxscaleの設定ファイルに記述するパスワードを暗号化する

Maxscaleでは、設定ファイルにモニタリング・接続するGalera ClusterのID/PWを記述する必要があるのだけど、そのままの生パスワードだと、やはりセキュリティ的によろしくない。
というわけで、MaxscaleにはそのパスワードをHash化して記述することができるようになっている。

まず、以下のコマンドで鍵ファイルを設置する「/usr/local/maxscale」ディレクトリを作成し、maxscale用の鍵ファイル「.secrets」を生成する。

mkdir -p /usr/local/maxscale
maxkeys /usr/local/maxscale/

...


MariaDB(MySQL)でmysqlコマンドから接続時のみautocommitを無効にする

MariaDBやMySQLでは、デフォルトでautocommitが有効になっているんだけど、コンソールなどから接続する際にはこれが結構迷惑になる。
通常、データベースなんてアプリケーションなどが利用して、コンソールから操作するって時点でイレギュラー対応の方が多いので、間違えて変な操作すると大変な事になったりする。

では、mysqlコマンドから接続した場合に、autocommitを無効にするにはどうすればよいのか?
単純に、コマンドを実行するホストの設定ファイル(通常だと/etc/my.cnf.d/client)に、以下の一行を追記すればよい。

[client]
init-comma...

Maxscaleで設定ファイル編集後reloadを行う

systemctlでMaxscaleを使っていると、どうもreloadが利用出来ない状態になっている事に気づく。
こうなると、設定ファイルを編集した後、またいちいちrestartしないといけないのかなぁ…と思っていたのだが、どうやらreloadは出来るようだ。

Maxscaleには管理コマンドであるmaxadminというコマンドがあるのだが、これでreloadが行えるのだ。
以下、reloadコマンド。

maxadmin -p mariadb reload config

ただし、サーバの追加・削除に使うにはちょっと怖い挙動をしている。
サーバを追加したり削除すると、どうも上手...


Maxscaleで指定したサーバをメンテナンスモードにする

Maxscaleを使っていて、再起動などで後ろにいる特定のDBサーバに接続させないようにしたい時もあるだろう。
そんなときは、指定したDBサーバをメンテナンスモードにすればよい。

Maxscaleで特定サーバをメンテナンスモードにしたい場合は、maxadminコマンドで以下のように実行すればよい。

maxadmin -p パスワード(初期:mariadb) set server サーバ名 maintenance

[root@BS-PUB-GFRONT-01 ~]# maxadmin -p mariadb list servers
Servers.
--------------...

MariaDB+GaleraCluster用のLBソフト『Maxscale』を使ってみる

MariaDB+GaleraClusterの場合、各ノードで書き込み・読込みがされるのだけど、そうなると同じ行に同時タイミングで複数ノードから書き込みをしようとしてデッドロックになる事がある。
これを防ぐため、MariaDBでは専用のロードバランサー用に『Maxscale』というものが用意されている。

実際、会社でも使っているソフトなので、今回はこれをインストールし、GaleraClusterに接続してみよう。

1.Maxscaleの概要

Maxscaleの概要についてだが、細かく説明するとすごく大変そうなので、とりあえず以下のようなイメージだけ覚えておくと良いだろう。

...