特定のSQL処理で、GROUP BYなどの集合関数を利用していて、
“Using temporary”,”Using filesort”などが出て処理時間がかかり過ぎたり、
サブクエリーによる結果をJOINしてindexが利用出来無かったりと、
困難な場面に遭遇する事があるかと思います。

基本的には、物理的に変更しても良くて数倍だと思いますので、
アプリケーションやクエリーを工数かけて書き換えて対応するのが良いと思いますが、
なかなか出来ない場合は、可能な範囲でサーバーパラメータを変更したり、
クエリーを若干変更してメモリーテーブルやTEMPORARY TABLEなどでワークテーブルを作成し、
サブクエリーなどの結果を随時集計しIndexを使えるように処理する方法もあるかと思います。
もちろんハードで短期、中期的に解決する為に、力技で対応した場合もありましたが。。。

過去にもMEMORY STORAGE ENGINEについて、書きましたが改めて再確認してみました。
MEMORY ストレージエンジン

その他ソリューション:
Entperprise Edition:Query Rewrite Plugins
検証:MySQL Query Rewrite Plugins

MEMORYストレージエンジンによるワークテーブル
以下、メモリーストレージエンジンを利用した一時テーブル例 (インデックス利用可)


root@localhost [test]> CREATE TABLE T_Work_mem01 (
    ->   id int(11) DEFAULT NULL,
    ->   text varchar(100) DEFAULT NULL,
    ->   KEY idx_T_MEM01_id (id)
    -> ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

root@localhost [test]> desc T_Work_mem01;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | MUL | NULL    |       |
| text  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

root@localhost [test]> insert into T_Work_mem01 select * from  T_ONLINE_DDL;
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

root@localhost [test]> explain select * from T_Work_mem01 where id = 8;
+----+-------------+--------------+------+----------------+----------------+---------+-------+------+-------+
| id | select_type | table        | type | possible_keys  | key            | key_len | ref   | rows | Extra |
+----+-------------+--------------+------+----------------+----------------+---------+-------+------+-------+
|  1 | SIMPLE      | T_Work_mem01 | ref  | idx_T_MEM01_id | idx_T_MEM01_id | 5       | const |    2 | NULL  |
+----+-------------+--------------+------+----------------+----------------+---------+-------+------+-------+
1 row in set (0.00 sec)

root@localhost [test]> 


root@localhost [test]> CREATE TABLE T_Work_mem02 (
    -> id int(11) DEFAULT NULL,
    -> text varchar(100) DEFAULT NULL,
    -> INDEX USING HASH (id)
    -> ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

root@localhost [test]> desc T_Work_mem02;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | MUL | NULL    |       |
| text  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

root@localhost [test]> insert into T_Work_mem02 select * from  T_ONLINE_DDL;
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

root@localhost [test]> explain select * from T_Work_mem02 where id = 8;
+----+-------------+--------------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | T_Work_mem02 | ref  | id            | id   | 5       | const |    2 | NULL  |
+----+-------------+--------------+------+---------------+------+---------+-------+------+-------+
1 row in set (0.00 sec)

root@localhost [test]> 

memory

メモリーテーブルなので、再起動したらデータは無くなりますが、
ワークテーブルとして一時的に利用するのであれば問題無いかと。


[root@GA01 admin]# /etc/init.d/mysql.server restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS! 
[root@GA01 admin]# exit
exit
[admin@GA01 ~]$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.24-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
root@localhost [test]> select count(*) from T_Work_mem01;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

root@localhost [test]> show tables like 'T_Work%';
+--------------------------+
| Tables_in_test (T_Work%) |
+--------------------------+
| T_Work_mem01             |
| T_Work_mem02             |
+--------------------------+
2 rows in set (0.00 sec)

root@localhost [test]>

※ データは空ですが、テーブル定義は残ります。

memory_table_after_reboot

参考 (レプリケーション時の注意点等):
8.3.8 Comparison of B-Tree and Hash Indexes

17.4.1.21 Replication and MEMORY Tables

15.3 The MEMORY Storage Engine

[留意点] MEMORY Tables and Replication
A server’s MEMORY tables become empty when it is shut down and restarted.
If the server is a replication master, its slaves are not aware that these
tables have become empty, so you see out-of-date content if you select data
from the tables on the slaves. To synchronize master and slave MEMORY tables,
when a MEMORY table is used on a master for the first time since it was started,
a DELETE statement is written to the master’s binary log, to empty the table on the slaves also.
The slave still has outdated data in the table during the interval
between the master’s restart and its first use of the table.
To avoid this interval when a direct query to the slave could return stale data,
use the –init-file option to populate the MEMORY table on the master at startup.

今回のデモ環境では,SLAVEにて除外してあります。

ignor

TEMPORARYテーブルの利用例(インデックス利用可)


root@localhost [test]> CREATE temporary TABLE T_Work_temp01 (
    ->  id int(11) DEFAULT NULL,
    ->  text varchar(100) DEFAULT NULL,
    ->  KEY idx_T_MEM01_id (id)
    -> ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

root@localhost [test]> desc T_Work_temp01;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | MUL | NULL    |       |
| text  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

root@localhost [test]> insert into T_Work_temp01 select * from  T_ONLINE_DDL;
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

root@localhost [test]> explain select * from T_Work_temp01 where id = 8;
+----+-------------+---------------+------+----------------+----------------+---------+-------+------+-------+
| id | select_type | table         | type | possible_keys  | key            | key_len | ref   | rows | Extra |
+----+-------------+---------------+------+----------------+----------------+---------+-------+------+-------+
|  1 | SIMPLE      | T_Work_temp01 | ref  | idx_T_MEM01_id | idx_T_MEM01_id | 5       | const |    2 | NULL  |
+----+-------------+---------------+------+----------------+----------------+---------+-------+------+-------+
1 row in set (0.00 sec)

root@localhost [test]> CREATE temporary TABLE T_Work_temp02 (
    ->  id int(11) DEFAULT NULL,
    ->  text varchar(100) DEFAULT NULL,
    ->  INDEX USING HASH (id)
    -> ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.01 sec)

root@localhost [test]> desc T_Work_temp02;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | MUL | NULL    |       |
| text  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

root@localhost [test]> insert into T_Work_temp02 select * from  T_ONLINE_DDL;
Query OK, 9 rows affected (0.01 sec)
Records: 9  Duplicates: 0  Warnings: 0

root@localhost [test]> explain select * from T_Work_temp02 where id = 8;
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | T_Work_temp02 | ref  | id            | id   | 5       | const |    2 | NULL  |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------+
1 row in set (0.00 sec)

TEMPORARYテーブルは、Show Tablesをしても表示されません。
作成したセッションでは、SELECTする事は可能です。


root@localhost [test]> show tables;
+--------------------+
| Tables_in_test     |
+--------------------+
| FW_DEMO            |
| T_MEM              |
| T_MEM01            |
| T_ONLINE_DDL       |
| T_ONLY_FULL        |
| T_UNION01          |
| T_UNION02          |
| T_Work_mem01       |
| T_Work_mem02       |
| card_info          |
| employees          |
| tbl_partition      |
| tbl_partition2     |
| tbl_partition_year |
| users              |
+--------------------+
15 rows in set (0.00 sec)

root@localhost [test]> select count(*) from T_Work_temp01;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

root@localhost [test]> select count(*) from T_Work_temp02;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

root@localhost [test]> 

オラクル等では、Global Session Temp Tableなどを利用して
他のセッションからもTEMPORARY TABLEにアクセス出来ますが、
こちらは、他のセッションからアクセスする事は出来ません。


[admin@GA02 ~]$ mysql -h 192.168.56.201 -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.24-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

admin@192.168.56.201 [(none)]> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
admin@192.168.56.201 [test]> select count(*) from T_Work_temp01;
ERROR 1146 (42S02): Table 'test.T_Work_temp01' doesn't exist
admin@192.168.56.201 [test]>

temporary_table

ログオフ、ログインし直しても、当然無くなっています。
作成した、セッションのみで有効


root@localhost [test]> exit
Bye
[admin@GA01 ~]$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.24-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
root@localhost [test]> select count(*) from T_Work_temp01;
ERROR 1146 (42S02): Table 'test.T_Work_temp01' doesn't exist
root@localhost [test]> 

その他、参考情報
Materialized Views with MySQL
MySQLにおけるJOINのチューニングの定石


MySQL Clusterの良いところの一つに、Rolling Upgradeが可能なので、
サービスを停止せずに、MySQL Clusterのアップグレードが可能な部分があると思います。
やはり、アップグレードにサービス停止を伴うと、インフラ管理者もサービス担当者と
メンテナンス時間の調整をしなければならず、なかなか対応がが難しいと思います。

アップグレードには、MCM(MySQL Cluster Manager)というCommercial版のツールを使えば、
コマンド一つでアップグレード可能ですが、今回はマニュアルで一つ一つアップグレードしています。

MySQL Cluster Managerは、基本的な管理ダスクを自動化することによって、
MySQL データベースの作成と管理を簡易化します。
MCM参照:
https://www-jp.mysql.com/products/cluster/mcm/
その他:
How MySQL is able to scale to 200 Million QPS – MySQL Cluster
http://highscalability.com/blog/2015/5/18/how-mysql-is-able-to-scale-to-200-million-qps-mysql-cluster.html

■ 現状の構成確認
本番環境ではお勧めしませんが、デモ環境なので2台のサーバー上に共存して構成しています。

SQL Node x 2
Data Node x 2
Management Node x 1

+------+   +------+
| SQL1 |   | SQL2 |
+------+   +------+
+------+   +------+
| NDB1 |   | NDB2 |
+------+   +------+

※この検証環境では、管理ノードはSQL1, NDB1と同居してます。

before_one_node

1) アップグレード前の事前動作確認

mysql> select @@hostname;
+--------------+
| @@hostname   |
+--------------+
| cluster74_01 |
+--------------+
1 row in set (0.00 sec)

mysql> select * from T20150319;
+----+---------------------------------------------+
| id | memo                                        |
+----+---------------------------------------------+
|  3 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  6 | SQL Connection 2015-03-24                   |
|  5 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  1 | This is MySQL Cluster 7.4.4 検証            |
|  2 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  4 | This is MySQL Cluster 7.4.4 検証 Restored   |
+----+---------------------------------------------+
6 rows in set (0.01 sec)

mysql> insert into T20150319(memo) values('rolling upgrade cluster step by step');
Query OK, 1 row affected (0.01 sec)

mysql> select * from T20150319 order by id;
+----+---------------------------------------------+
| id | memo                                        |
+----+---------------------------------------------+
|  1 | This is MySQL Cluster 7.4.4 検証            |
|  2 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  3 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  4 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  5 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  6 | SQL Connection 2015-03-24                   |
|  7 | rolling upgrade cluster step by step        |
+----+---------------------------------------------+
7 rows in set (0.00 sec)

mysql> explain select * from T20150319 where id = 1;
+----+-------------+-----------+--------+---------------+---------+---------+-------+------+-------+
| id | select_type | table     | type   | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-----------+--------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | T20150319 | eq_ref | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-----------+--------+---------------+---------+---------+-------+------+-------+
1 row in set (0.01 sec)

mysql> explain select * from T20150319 where memo like 'This is MySQL%';
+----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra                             |
+----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------------+
|  1 | SIMPLE      | T20150319 | ALL  | NULL          | NULL | NULL    | NULL |    7 | Using where with pushed condition |
+----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------------+
1 row in set (0.00 sec)

mysql> 

2) Active/Active型のClusterなので、当然データは他のノードからも参照出来ます。

mysql> select @@hostname;
+--------------+
| @@hostname   |
+--------------+
| cluster74_02 |
+--------------+
1 row in set (0.00 sec)

mysql> select * from T20150319 order by id;
+----+---------------------------------------------+
| id | memo                                        |
+----+---------------------------------------------+
|  1 | This is MySQL Cluster 7.4.4 検証            |
|  2 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  3 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  4 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  5 | This is MySQL Cluster 7.4.4 検証 Restored   |
|  6 | SQL Connection 2015-03-24                   |
|  7 | rolling upgrade cluster step by step        |
+----+---------------------------------------------+
7 rows in set (0.00 sec)

mysql>

■ Rolling Upgradeの為、1/2のデータノードを停止しました。

[root@cluster74_01 cluster]# /usr/local/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.56.114:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2    @192.168.56.115  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.23 ndb-7.4.4)

ndb_mgm> 2 stop
Node 2: Node shutdown initiated
Node 2: Node shutdown completed.
Node 2 has shutdown.

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2 (not connected, accepting connect from 192.168.56.115)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.23 ndb-7.4.4)

—- Node 2で、SQLインスタンスも停止しました。

問題無く、アップグレード対象ノードが停止している事を確認。

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2 (not connected, accepting connect from 192.168.56.115)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51 (not connected, accepting connect from 192.168.56.115)

ndb_mgm> 

■1/2ノードにてバイナリーダウンロードと入れ替え

[root@cluster74_02 local]# tar zxvf /home/admin/mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64.tar.gz 

Snip

mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/include/plugin_audit.h
mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/include/mysql_com.h
mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/include/my_dir.h
[root@cluster74_02 local]# ls -l
合計 8
drwxr-xr-x.  2 root root     6  6月 10  2014 bin
drwxr-xr-x.  2 root root     6  6月 10  2014 etc
drwxr-xr-x.  2 root root     6  6月 10  2014 games
drwxr-xr-x.  2 root root     6  6月 10  2014 include
drwxr-xr-x.  2 root root     6  6月 10  2014 lib
drwxr-xr-x.  2 root root     6  6月 10  2014 lib64
drwxr-xr-x.  2 root root     6  6月 10  2014 libexec
lrwxrwxrwx.  1 root root    51  3月 17 12:28 mysql -> mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64/
drwxr-xr-x. 15 root mysql 4096  3月 20 18:13 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64
drwxr-xr-x. 13 root root  4096  5月 14 00:21 mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64
drwxr-xr-x.  2 root root     6  6月 10  2014 sbin
drwxr-xr-x.  5 root root    46  3月 17 11:29 share
drwxr-xr-x.  2 root root    70  3月 17 12:28 src
[root@cluster74_02 local]# 

[root@cluster74_02 local]# rm mysql
rm: シンボリックリンク `mysql' を削除しますか? y
[root@cluster74_02 local]# ln -s mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/ mysql
[root@cluster74_02 local]# ls -l
合計 8
drwxr-xr-x.  2 root root     6  6月 10  2014 bin
drwxr-xr-x.  2 root root     6  6月 10  2014 etc
drwxr-xr-x.  2 root root     6  6月 10  2014 games
drwxr-xr-x.  2 root root     6  6月 10  2014 include
drwxr-xr-x.  2 root root     6  6月 10  2014 lib
drwxr-xr-x.  2 root root     6  6月 10  2014 lib64
drwxr-xr-x.  2 root root     6  6月 10  2014 libexec
lrwxrwxrwx.  1 root root    51  5月 14 00:23 mysql -> mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/
drwxr-xr-x. 15 root mysql 4096  3月 20 18:13 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64
drwxr-xr-x. 13 root root  4096  5月 14 00:21 mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64
drwxr-xr-x.  2 root root     6  6月 10  2014 sbin
drwxr-xr-x.  5 root root    46  3月 17 11:29 share
drwxr-xr-x.  2 root root    70  3月 17 12:28 src
[root@cluster74_02 local]# chown -R mysql:mysql mysql/
[root@cluster74_02 local]# chmod -R 755 mysql/
[root@cluster74_02 local]# ls -l
合計 8
drwxr-xr-x.  2 root  root     6  6月 10  2014 bin
drwxr-xr-x.  2 root  root     6  6月 10  2014 etc
drwxr-xr-x.  2 root  root     6  6月 10  2014 games
drwxr-xr-x.  2 root  root     6  6月 10  2014 include
drwxr-xr-x.  2 root  root     6  6月 10  2014 lib
drwxr-xr-x.  2 root  root     6  6月 10  2014 lib64
drwxr-xr-x.  2 root  root     6  6月 10  2014 libexec
lrwxrwxrwx.  1 root  root    51  5月 14 00:23 mysql -> mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64/
drwxr-xr-x. 15 root  mysql 4096  3月 20 18:13 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64
drwxr-xr-x. 13 mysql mysql 4096  5月 14 00:21 mysql-cluster-advanced-7.4.6-linux-glibc2.5-x86_64
drwxr-xr-x.  2 root  root     6  6月 10  2014 sbin
drwxr-xr-x.  5 root  root    46  3月 17 11:29 share
drwxr-xr-x.  2 root  root    70  3月 17 12:28 src
[root@cluster74_02 local]# 

■旧バージョンからファイルのコピー
– DATAフォルダー
– MYSQL Cluster用フォルダー
– BACKUPフォルダー


[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# cp -rp mysql-cluster/ /usr/local/mysql/
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# ls -l /usr/local/mysql/
合計 140
-rwxr-xr-x.  1 mysql mysql 102986  4月  2 02:09 INSTALL-BINARY
-rwxr-xr-x.  1 mysql mysql   2730  4月  2 02:09 LICENSE.mysql
-rwxr-xr-x.  1 mysql mysql   1446  4月  2 02:09 README
drwxr-xr-x.  2 mysql mysql   4096  5月 14 00:21 bin
drwxr-xr-x.  3 mysql mysql     17  5月 14 00:21 data
drwxr-xr-x.  2 mysql mysql     69  5月 14 00:21 docs
drwxr-xr-x.  4 mysql mysql   4096  5月 14 00:21 include
drwxr-xr-x.  3 mysql mysql   4096  5月 14 00:21 lib
drwxr-xr-x.  4 mysql mysql     28  5月 14 00:21 man
drwxr-xr-x.  2 root  root      27  3月 18 10:31 mysql-cluster
drwxr-xr-x. 10 mysql mysql   4096  5月 14 00:21 mysql-test
drwxr-xr-x.  2 mysql mysql     29  5月 14 00:21 scripts
drwxr-xr-x. 32 mysql mysql   4096  5月 14 00:21 share
drwxr-xr-x.  4 mysql mysql   4096  5月 14 00:21 sql-bench
drwxr-xr-x.  2 mysql mysql   4096  5月 14 00:21 support-files
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# 


[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# cp -rp data/ /usr/local/mysql/
cp: `/usr/local/mysql/data/test/db.opt' を上書きしますか? y
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# ls -l /usr/local/mysql/data/
合計 111192
drwx------. 2 mysql mysql       59  3月 24 16:53 NDB01
-rw-rw----. 1 mysql mysql       56  3月 18 09:46 auto.cnf
-rw-r-----. 1 mysql root    156430  5月 13 22:23 cluster74_02.err
-rw-rw----. 1 mysql mysql 50331648  5月 13 22:23 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648  3月 18 09:45 ib_logfile1
-rw-rw----. 1 mysql mysql 12582912  5月 13 22:23 ibdata1
drwx------. 2 mysql mysql     4096  3月 20 22:13 mysql
-rw-r--r--. 1 root  root         4  5月 13 21:55 ndb_2.pid
drwxr-x---. 9 root  root        72  3月 19 23:26 ndb_2_fs
-rw-r--r--. 1 root  root    426545  5月 13 22:14 ndb_2_out.log
drwx------. 2 mysql mysql     4096  3月 20 22:13 ndbinfo
drwx------. 2 mysql mysql     4096  3月 19 23:45 ndbmemcache
drwx------. 2 mysql mysql     4096  3月 18 09:45 performance_schema
drwxr-xr-x. 2 mysql mysql       19  3月 17 12:26 test
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# 


[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# cp -rp BACKUP/ /usr/local/mysql/
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]# ls -l /usr/local/mysql/
合計 144
drwxr-x---.  3 root  root      19  3月 20 18:21 BACKUP
-rwxr-xr-x.  1 mysql mysql 102986  4月  2 02:09 INSTALL-BINARY
-rwxr-xr-x.  1 mysql mysql   2730  4月  2 02:09 LICENSE.mysql
-rwxr-xr-x.  1 mysql mysql   1446  4月  2 02:09 README
drwxr-xr-x.  2 mysql mysql   4096  5月 14 00:21 bin
drwxr-xr-x.  9 mysql mysql   4096  5月 13 22:23 data
drwxr-xr-x.  2 mysql mysql     69  5月 14 00:21 docs
drwxr-xr-x.  4 mysql mysql   4096  5月 14 00:21 include
drwxr-xr-x.  3 mysql mysql   4096  5月 14 00:21 lib
drwxr-xr-x.  4 mysql mysql     28  5月 14 00:21 man
drwxr-xr-x.  2 root  root      27  3月 18 10:31 mysql-cluster
drwxr-xr-x. 10 mysql mysql   4096  5月 14 00:21 mysql-test
drwxr-xr-x.  2 mysql mysql     29  5月 14 00:21 scripts
drwxr-xr-x. 32 mysql mysql   4096  5月 14 00:21 share
drwxr-xr-x.  4 mysql mysql   4096  5月 14 00:21 sql-bench
drwxr-xr-x.  2 mysql mysql   4096  5月 14 00:21 support-files
[root@cluster74_02 mysql-cluster-advanced-7.4.4-linux-glibc2.5-x86_64]#

■データノードとSQLノードを起動


[root@cluster74_02 mysql]# chown -R root .
[root@cluster74_02 mysql]# chown -R mysql data
[root@cluster74_02 mysql]# /usr/local/mysql/bin/ndbd --connect-string=192.168.56.114 --nostart
2015-05-14 00:34:31 [ndbd] INFO     -- Angel connected to '192.168.56.114:1186'
2015-05-14 00:34:32 [ndbd] INFO     -- Angel allocated nodeid: 2
[root@cluster74_02 mysql]# /usr/local/mysql/bin/mysqld_safe &
[1] 3801
[root@cluster74_02 mysql]# 150514 00:34:50 mysqld_safe Logging to '/usr/local/mysql/data/cluster74_02.err'.
150514 00:34:50 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

[root@cluster74_02 mysql]# 



[root@cluster74_02 mysql]# ./bin/mysql_upgrade -u root -p
Enter password: 
Looking for 'mysql' as: ./bin/mysql
Looking for 'mysqlcheck' as: ./bin/mysqlcheck
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_apply_status                             OK
mysql.ndb_binlog_index                             OK
mysql.ndb_index_stat_head                          OK
mysql.ndb_index_stat_sample                        OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Running 'mysql_fix_privilege_tables'...
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
NDB01.T20150319                                    OK
ndbinfo.blocks                                     OK
ndbinfo.config_params                              OK
ndbinfo.dict_obj_types                             OK
ndbmemcache.cache_policies                         OK
ndbmemcache.containers                             OK
ndbmemcache.demo_table                             OK
ndbmemcache.demo_table_large                       OK
ndbmemcache.demo_table_tabs                        OK
ndbmemcache.external_values                        OK
ndbmemcache.key_prefixes                           OK
ndbmemcache.last_memcached_signon                  OK
ndbmemcache.memcache_server_roles                  OK
ndbmemcache.meta                                   OK
ndbmemcache.ndb_clusters                           OK
OK
[root@cluster74_02 mysql]# 

After_one_node

■MySQL Cluster管理ノードにて確認してみる
– バージョンが混在している状態


ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, not started)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> ndb_mgm> 2 start 
Node 2: Start initiated (version 7.4.6)
Database node 2 is being started.

ndb_mgm> Node 2: Started (version 7.4.6)

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 

Version
mysql

Data操作
insert_diff_version

■ アップグレード中
管理ノードをarbitratorに設定しているので、こちらは特に変更が無い事を確認。


mysql> select * from arbitrator_validity_detail;
+---------+------------+------------------+---------------+-----------+
| node_id | arbitrator | arb_ticket       | arb_connected | arb_state |
+---------+------------+------------------+---------------+-----------+
|       1 |        100 | 08320002001a414c | Yes           | ARBIT_RUN |
|       2 |        100 | 08320002001a414c | Yes           | ARBIT_RUN |
+---------+------------+------------------+---------------+-----------+
2 rows in set (0.01 sec)

mysql> select * from  arbitrator_validity_summary ;
+------------+------------------+---------------+-----------------+
| arbitrator | arb_ticket       | arb_connected | consensus_count |
+------------+------------------+---------------+-----------------+
|        100 | 08320002001a414c | Yes           |               2 |
+------------+------------------+---------------+-----------------+
1 row in set (0.01 sec)

mysql> 

■ 2/2のノードをアップグレード開始
– 対象ノードをSTOPコマンドで停止


ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.23 ndb-7.4.4, Nodegroup: 0, *)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 1 stop
Node 1: Node shutdown initiated
Node 1 has shutdown.

ndb_mgm> Node 1: Node shutdown completed.

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1 (not connected, accepting connect from 192.168.56.114)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.23 ndb-7.4.4)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 100 stop
Node 100 has shutdown.
Disconnecting to allow Management Server to shutdown

ndb_mgm> 

arbitorator_shutdown1

その他の作業は、最初のノードと同様の手順でバイナリーの入れ替え
コマンドで管理ノード、データノード、SQLノードを起動します。


[root@cluster74_01 mysql]# /usr/local/mysql/bin/ndb_mgmd -f /usr/local/mysql/mysql-cluster/ndb-config.ini
MySQL Cluster Management Server mysql-5.6.24 ndb-7.4.6
[root@cluster74_01 mysql]# /usr/local/mysql/bin/ndbd --connect-string=192.168.56.114 --nostart
2015-05-14 02:19:06 [ndbd] INFO     -- Angel connected to '192.168.56.114:1186'
2015-05-14 02:19:06 [ndbd] INFO     -- Angel allocated nodeid: 1
[root@cluster74_01 mysql]# /usr/local/mysql/bin/mysqld_safe &
[1] 5066
[root@cluster74_01 mysql]# 150514 02:19:17 mysqld_safe Logging to '/usr/local/mysql/data/cluster74_01.err'.
150514 02:19:17 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

[root@cluster74_01 mysql]# 

全ノードのMySQLのバイナリーが同じバージョンになっている事を確認
– STOPしているノードをSTARTコマンドで開始


[root@cluster74_01 mysql]# /usr/local/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.56.114:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.24 ndb-7.4.6, not started)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=50 (not connected, accepting connect from 192.168.56.114)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 1 start
Node 1: Start initiated (version 7.4.6)
Database node 1 is being started.

ndb_mgm> Node 1: Started (version 7.4.6)

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.24 ndb-7.4.6)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 

after_upgrade_fin


[root@cluster74_01 mysql]# ./bin/mysql_upgrade -u root -p
Enter password: 
Looking for 'mysql' as: ./bin/mysql
Looking for 'mysqlcheck' as: ./bin/mysqlcheck
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_apply_status                             OK
mysql.ndb_binlog_index                             OK
mysql.ndb_index_stat_head                          OK
mysql.ndb_index_stat_sample                        OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Running 'mysql_fix_privilege_tables'...
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
Running 'mysqlcheck with default connection arguments
Warning: Using a password on the command line interface can be insecure.
NDB01.T20150319                                    OK
ndbinfo.blocks                                     OK
ndbinfo.config_params                              OK
ndbinfo.dict_obj_types                             OK
ndbmemcache.cache_policies                         OK
ndbmemcache.containers                             OK
ndbmemcache.demo_table                             OK
ndbmemcache.demo_table_large                       OK
ndbmemcache.demo_table_tabs                        OK
ndbmemcache.external_values                        OK
ndbmemcache.key_prefixes                           OK
ndbmemcache.last_memcached_signon                  OK
ndbmemcache.memcache_server_roles                  OK
ndbmemcache.meta                                   OK
ndbmemcache.ndb_clusters                           OK
OK
[root@cluster74_01 mysql]# 

アップグレード最終確認


ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @192.168.56.114  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
id=2    @192.168.56.115  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)

[ndb_mgmd(MGM)] 1 node(s)
id=100  @192.168.56.114  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=50   @192.168.56.114  (mysql-5.6.24 ndb-7.4.6)
id=51   @192.168.56.115  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm> 

基本動作確認し、ログを見てエラーが無い事を確認して終了
confirmSQLfinal

メモ: 本番では、arbitratorの設定をもう少し明確に設定しておく。

参照: 18.5.5 Performing a Rolling Restart of a MySQL Cluster


先日、ご紹介させて頂いた、MySQL Enterprise Firewallを利用する事により、
White ListベースのDBアクセス制御(ステートメントベース)をUserアカウントとSQLステートメントの
組み合わせで実装する事が出来ますが、Publicクラウドを含む環境でWebサイトを運用されている場合は、Replication機能と組み合わせてご利用される場合もあるかと思います。

MySQL Enterprise Firewallには、全部で4つのテーブルがありますが、
(Information_Schemaに2つMySQLに2つテーブルが準備されています)
information_schemaにあるテーブルに関しては、レプリケーション対象外なので実際にSlaveに同期されるのは以下の2つのテーブルという事になります。

firewall-diag

root@localhost [information_schema]> show tables from mysql like '%fire%';
+--------------------------+
| Tables_in_mysql (%fire%) |
+--------------------------+
| firewall_users           |
| firewall_whitelist       |
+--------------------------+

また、MySQL Enterprise FirewallのWhite Listはメモリー上にCacheされているので、
スレーブに同期された段階では直ぐにスレーブ側では有効にならないので、
以下のマニュアルに記載されているように、コマンドでメモリーに反映する必要があります。

6.3.15.4 MySQL Enterprise Firewall Reference

実際のMySQL Enterprise FirewallとReplicationの動作をこちらでご紹介します。

既存、White Listに定義を追加してSlave側で確認してみます。

MASTER


root@localhost [mysql]> select * from firewall_whitelist;
+-------------------+------------------------------------------------------------------------------+
| USERHOST          | RULE                                                                         |
+-------------------+------------------------------------------------------------------------------+
| fw_user@localhost | SELECT `id` , `fname` , `lname` , `cnumber` FROM `card_info` WHERE `id` = ?  |
+-------------------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

root@localhost [mysql]> CALL sp_set_firewall_mode('fw_user@localhost','RECORDING');
+-----------------------------------------------+
| read_firewall_whitelist(arg_userhost,FW.rule) |
+-----------------------------------------------+
| Imported users: 0  Imported rules: 0       |
+-----------------------------------------------+
1 row in set (0.00 sec)

+-------------------------------------------+
| set_firewall_mode(arg_userhost, arg_mode) |
+-------------------------------------------+
| OK                                        |
+-------------------------------------------+
1 row in set (0.00 sec)

Query OK, 1 row affected (0.00 sec)

root@localhost [mysql]> CALL sp_set_firewall_mode('fw_user@localhost','PROTECTING');
+-------------------------------------------+
| set_firewall_mode(arg_userhost, arg_mode) |
+-------------------------------------------+
| OK                                        |
+-------------------------------------------+
1 row in set (0.01 sec)

Query OK, 3 rows affected (0.01 sec)

root@localhost [mysql]> select * from firewall_whitelist;
+-------------------+------------------------------------------------------------------------------+
| USERHOST          | RULE                                                                         |
+-------------------+------------------------------------------------------------------------------+
| fw_user@localhost | SELECT `id` , `fname` , `lname` , `cnumber` FROM `card_info` WHERE `id` = ?  |
| fw_user@localhost | SELECT * FROM `card_info` WHERE `id` = ?                                     |
| fw_user@localhost | SELECT SYSTEM_USER ( )                                                       |
+-------------------+------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

root@localhost [mysql]> 

White List追加前の状態
master_slave

White List対象ユーザーでMasterにアクセスしてWhite ListにSQLステートメントを追加
※ マスター側でRECORDING状態の段階で実行

fw_user@localhost [test]> SELECT * FROM card_info WHERE id = 1;
+----+--------+-----------+---------------------+
| id | fname  | lname     | cnumber             |
+----+--------+-----------+---------------------+
|  1 | 佐藤   | さとう    | 1234-5678-9999-0123 |
+----+--------+-----------+---------------------+
1 row in set (0.00 sec)

SLAVE
White ListはReplicationの機能を使い、同期されているがまだメモリーに反映されていない為、
Master側で追加したSQLステートメントはブロックされる。


fw_user@localhost [test]> SELECT id,fname,lname,cnumber FROM card_info WHERE id = 1;
+----+--------+-----------+---------------------+
| id | fname  | lname     | cnumber             |
+----+--------+-----------+---------------------+
|  1 | 佐藤   | さとう    | 1234-5678-9999-0123 |
+----+--------+-----------+---------------------+
1 row in set (0.00 sec)

fw_user@localhost [test]> SELECT * FROM card_info WHERE id = 1;
ERROR 1045 (28000): Statement was blocked by Firewall
fw_user@localhost [test]> 

レプリケーションによるデータ同期
finish

White List Tableには反映されているが、Slave側ではメモリーに無い為まだBlockされる。
master

スレーブ側にて以下のコマンドを実施して、最新のWhite Listをメモリーに反映させる。
※ 権限のある、管理ユーザーで実行してください。
※ ここの処理は、マスターのWhite Listを追加する段階でバッチ処理として追加しておいた方が漏れが無くて良さそうです。


root@localhost [mysql]>  select * from firewall_whitelist;
+-------------------+------------------------------------------------------------------------------+
| USERHOST          | RULE                                                                         |
+-------------------+------------------------------------------------------------------------------+
| fw_user@localhost | SELECT SYSTEM_USER ( )                                                       |
| fw_user@localhost | SELECT `id` , `fname` , `lname` , `cnumber` FROM `card_info` WHERE `id` = ?  |
| fw_user@localhost | SELECT * FROM `card_info` WHERE `id` = ?                                     |
+-------------------+------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

root@localhost [mysql]> SELECT read_firewall_whitelist('fw_user@localhost', 'RECORDING') FROM mysql.firewall_whitelist;
+-----------------------------------------------------------+
| read_firewall_whitelist('fw_user@localhost', 'RECORDING') |
+-----------------------------------------------------------+
| Imported users: 0   Imported rules: 1                     |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

root@localhost [mysql]> SELECT read_firewall_users('fw_user@localhost', 'RECORDING') FROM mysql.firewall_users;
+-------------------------------------------------------+
| read_firewall_users('fw_user@localhost', 'RECORDING') |
+-------------------------------------------------------+
| Imported users: 0   Updated users:  1                 |
+-------------------------------------------------------+
1 row in set (0.01 sec)

root@localhost [mysql]>

メモ:以下のいずれかの方法でもMemoryに反映されます。
※ fw_user@localhostは検証用アカウントです、ご利用時は適宜書き換えて下さい。
■ Pattern1
CALL sp_set_firewall_mode(‘fw_user@localhost’,’RECORDING’);
CALL sp_set_firewall_mode(‘fw_user@localhost’,’PROTECTING’);

■ Pattern2
SELECT read_firewall_users(userhost, mode) from mysql.firewall_users;
SELECT read_firewall_whitelist(userhost, rule) from mysql.firewall_whitelist;

■ Pattern3
SELECT read_firewall_users(‘fw_user@localhost’, ‘RECORDING’) FROM mysql.firewall_users;
SELECT read_firewall_whitelist(‘fw_user@localhost’, ‘RECORDING’) FROM mysql.firewall_whitelist;

上記コマンドでSLAVE側に同期れた定義をメモリーにロードする事でSLAVE側でも実行する事が可能になりました。
※再起動でも反映されますが、殆どのケースで、オンラインで実施するのが現実的かと思います。


fw_user@localhost [test]> SELECT * FROM card_info WHERE id = 1;
ERROR 1045 (28000): Statement was blocked by Firewall
fw_user@localhost [test]> SELECT * FROM card_info WHERE id = 1;
+----+--------+-----------+---------------------+
| id | fname  | lname     | cnumber             |
+----+--------+-----------+---------------------+
|  1 | 佐藤   | さとう    | 1234-5678-9999-0123 |
+----+--------+-----------+---------------------+
1 row in set (0.00 sec)

fw_user@localhost [test]> 

master1

30日間 トライアル
MySQL Enterprise Edition トライアル
※ Publicクラウド環境などを使われている場合は,IDSやIPSを導入する事が難しく、
WAFを導入したりしている方もいらっしゃると思いますが、MySQLをご利用の場合は、
こちらのEnterprise Firewallを実装する事で、SQL Injectionの対策などがコストを抑えて対応する事が可能になります。

参照:
6.3.15.4 MySQL Enterprise Firewall Reference
MySQL Enterprise Firewall


MySQL5.7.7RCでは、列の値を定義によって自動生成可能なGenerated Columunsという機能が追加されています。
MS SQLやDB2でも同じような機能があって、頻度は多く無いですが、以前データベースの運用していた時にTAXの自動計算などで利用していました。
以下のブログには、XMLとの連携を行った例が書かれているので参考にしてみて頂ければと思います。

Generated Columns in MySQL 5.7.5
http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/

例) Generated Columinを利用して合計金額を持つ列を生成


CREATE TABLE `T_Generated_Column` (
  `pid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pname` varchar(1024) DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  `qty` int(10) DEFAULT NULL,
  `total` decimal(10,2) GENERATED ALWAYS AS (price * qty) STORED,
  PRIMARY KEY (`pid`),
  KEY `IDX_TOTAL` (`total`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

データをINSERTしてINDEX利用の有無の確認

GENERATED COLUMNSの種類
– VIRTUAL(default) : 読み込み時に計算され, データ保存されず,インデックスの作成不可
– STORED: inserted/updated時に計算され,データは保存され,インデックス作成可能

generated

generated_index


root@localhost [USER01]> desc T_Generated_Column;
+-------+------------------+------+-----+---------+------------------+
| Field | Type             | Null | Key | Default | Extra            |
+-------+------------------+------+-----+---------+------------------+
| pid   | int(10) unsigned | NO   | PRI | NULL    | auto_increment   |
| pname | varchar(1024)    | YES  |     | NULL    |                  |
| price | decimal(10,2)    | YES  |     | NULL    |                  |
| qty   | int(10)          | YES  |     | NULL    |                  |
| total | decimal(10,2)    | YES  | MUL | NULL    | STORED GENERATED |
+-------+------------------+------+-----+---------+------------------+
5 rows in set (0.15 sec)


root@localhost [USER01]> select * from T_Generated_Column;
+-----+-----------+----------+------+-----------+
| pid | pname     | price    | qty  | total     |
+-----+-----------+----------+------+-----------+
|   1 | 自転車    | 10000.00 |    3 |  30000.00 |
|   2 | TV        | 30000.00 |    5 | 150000.00 |
|   3 | 冷蔵庫    | 50000.00 |    1 |  50000.00 |
+-----+-----------+----------+------+-----------+
3 rows in set (0.00 sec)

root@localhost [USER01]> insert into T_Generated_Column(pname,price,qty) values('電池',100,5);
Query OK, 1 row affected (0.01 sec)

root@localhost [USER01]> select * from T_Generated_Column;
+-----+-----------+----------+------+-----------+
| pid | pname     | price    | qty  | total     |
+-----+-----------+----------+------+-----------+
|   1 | 自転車    | 10000.00 |    3 |  30000.00 |
|   2 | TV        | 30000.00 |    5 | 150000.00 |
|   3 | 冷蔵庫    | 50000.00 |    1 |  50000.00 |
|   4 | 電池      |   100.00 |    5 |    500.00 |
+-----+-----------+----------+------+-----------+
4 rows in set (0.00 sec)

root@localhost [USER01]> explain select * from T_Generated_Column where total = 500;
+----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table              | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | T_Generated_Column | NULL       | ref  | IDX_TOTAL     | IDX_TOTAL | 6       | const |    1 |   100.00 | NULL  |
+----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

root@localhost [USER01]> select * from T_Generated_Column where total = 500;
+-----+--------+--------+------+--------+
| pid | pname  | price  | qty  | total  |
+-----+--------+--------+------+--------+
|   4 | 電池   | 100.00 |    5 | 500.00 |
+-----+--------+--------+------+--------+
1 row in set (0.00 sec)

root@localhost [USER01]> 

Index_ok

アプリ側の変更しないでもDB側でまとめて対応出来るという意味で、簡易的にデータの値を変更出来るので、
使い方によっては、データ運用の選択肢として使えるソリューションの一つかと思います。
まだ、RC版ですが検証環境にて試してみて頂ければと思います。

Download
http://dev.mysql.com/downloads/mysql/5.7.html