ラベル Mysql jp の投稿を表示しています。 すべての投稿を表示
ラベル Mysql jp の投稿を表示しています。 すべての投稿を表示

2017年4月15日土曜日

トランザクション分離レベルREPEATABLE READについて

トランザクション分離レベルREPEATABLE READについて、
REPEATABLE READとは同じトランザクション内では必ず同じ値を表す設定です。
MySQLはこのレベルをDefaultに使用しています。
REPEATABLE READがどのように動作するか確認しましょう。


左をトランザクションt1と言います。
右をトランザクションt2と言います。

t1とt2でお互いにbeginを起こしてt1にてInsert, commitをしてt2にて見えるかを確認しました。実行時間を見てください。
t2ではbeginをしてからはselect * from test;をしてもt1で入力した値が見えません。t2 beginを完了した後にselectしたら値が見えました。
updateも同じトランザクションでは同じ値が見えます。
一活性読み取り専用です。これを REPEATABLE READと言います。

PostgreSQLとOracleをREAD COMMITTEDを使用していますので異なるトランザクションでcommitすると他のトランザクションでは見えます。
なぜ、MySQLはREPEATABLE READをDefaultに利用しているし、これはいつ使うものでしょうか?
僕もなぜMySQLはREPEATABLE READをDefaultにしているかわかりません。
しかし、いつ使うかはわかります。
例) トランザクション(t1)が時間テーブルの値が1秒ことに変更します。
   時間テーブルの値を見て8時00分00秒に動くスケジュールを5件組みました。
   トランザクション(t2)がを1件処理するのに1秒かかります。
   スケジュールを読みながら1件ずつ実行したら
   1件処理後1秒かかりましたので時間テーブルの値を見ると8時00分01秒になります
   ので次のスケジュールは実行できません。
   このとき使うトランザクション分離レベルREPEATABLE READです。
   トランザクション(t2)がcommitしてないと全部同じ8時00分00秒で実行ができます。

システムを作るときに仕様を理解したうえでトランザクション分離レベルを設定するとよいシステムができると思います。アーキテクチャー、データモデラーなどは必ずシステムの特性を理解して上で設計をしましょう。

以上です。



2017年4月11日火曜日

MySQLのDBLINK

Server version: 10.1.21-MariaDB MariaDB Serverを基準にします。

DBLinkを入れるdatabaseを作成します。
MariaDB [mysql]> create database parkdb;

parkdbにZabbixにあるtableをDBLinkします。
enginesを確認します。
MariaDB [mysql]> show engines;
+--------------------+---------+-
| Engine             | Support |
+--------------------+---------+-
| MRG_MyISAM         | YES     |
| CSV                | YES     |
| Aria               | YES     |
| MyISAM             | YES     |
| MEMORY             | YES     |
| InnoDB             | DEFAULT |
| SEQUENCE           | YES     |
| PERFORMANCE_SCHEMA | YES     |
+--------------------+---------+-
8 rows in set (0.00 sec)

MariaDB [mysql]>

FEDERATEDは Defaultではないです。
ですのでインストールが必要です。

①FEDERATED インストール

MariaDB [mysql]> install plugin federated soname 'ha_federated.so';
Query OK, 0 rows affected (0.03 sec)
MariaDB [mysql]> show engines;
+--------------------+---------+
| Engine             | Support |
+--------------------+---------+
| MRG_MyISAM         | YES     |
| CSV                | YES     |
| Aria               | YES     |
| MyISAM             | YES     |
| MEMORY             | YES     |
| InnoDB             | DEFAULT |
| SEQUENCE           | YES     |
| FEDERATED          | YES     |
| PERFORMANCE_SCHEMA | YES     |
+--------------------+---------+
9 rows in set (0.00 sec)

②DBLink作成

MariaDB [mysql]> CREATE SERVER dblink
    -> FOREIGN DATA WRAPPER mysql
    -> OPTIONS (USER 'zabbix', PASSWORD 'zabbix' , HOST '127.0.0.1', PORT 3306, DATABASE 'zabbix');
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> 

Database zabbixへ接続ができるユーザーを書きます。

③dblink対象のテーブル作成

[root@localhost ~]# mysql -uzabbix zabbix -pzabbix
MariaDB [zabbix]> CREATE TABLE test_table (
    ->     id     INT(20) NOT NULL AUTO_INCREMENT,
    ->     name   VARCHAR(32) NOT NULL DEFAULT '',
    ->     other  INT(20) NOT NULL DEFAULT '0',
    ->     PRIMARY KEY  (id),
    ->     INDEX name (name),
    ->     INDEX other_key (other)
    -> );
Query OK, 0 rows affected (0.04 sec)

④DBLinkテーブル作成

[root@localhost ~]# mysql -uzabbix parkdb -pzabbix
MariaDB [parkdb]> CREATE TABLE test_table (
    ->     id     INT(20) NOT NULL AUTO_INCREMENT,
    ->     name   VARCHAR(32) NOT NULL DEFAULT '',
    ->     other  INT(20) NOT NULL DEFAULT '0',
    ->     PRIMARY KEY  (id),
    ->     INDEX name (name),
    ->     INDEX other_key (other)
    -> )
    -> ENGINE=FEDERATED
    -> DEFAULT CHARSET=utf8
    -> CONNECTION='dblink/test_table';
Query OK, 0 rows affected (0.00 sec)

MariaDB [parkdb]> 

⑤確認

Zabbix DATABASEへInsertする。
MariaDB [zabbix]> insert into test_table values (1,'park',0);
Query OK, 1 row affected (0.01 sec)

MariaDB [zabbix]> 

parkd DATABASEからselectする。
MariaDB [parkdb]> select * from test_table;
+----+------+-------+
| id | name | other |
+----+------+-------+
|  1 | park |     0 |
+----+------+-------+
1 row in set (0.01 sec)
parkd DATABASEへInsertする。
MariaDB [parkdb]> insert into test_table values (2,'uri',0);
Query OK, 1 row affected (0.00 sec)

MariaDB [parkdb]> 

Zabbix DATABASEからSelectする。
MariaDB [zabbix]> select * from test_table;
+----+------+-------+
| id | name | other |
+----+------+-------+
|  1 | park |     0 |
|  2 | uri  |     0 |
+----+------+-------+
2 rows in set (0.00 sec)

MariaDB [zabbix]> 


以上です。

2017年3月22日水曜日

Zabbix Housekeeper 手動実行

Zabbix Housekeeper に関して
http://naiggy.blogspot.com/2017/03/zabbixhousekeeper.html
参考ください。

手動実行は
僕の場合は60日以前のデータを削除するスクリプトです。
60のところだけを修正して必要な数字を入れてください。

Mysql

delete from history where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from history_str where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from history_log where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from history_uint where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from history_text where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from trends where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from trends_uint where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from service_alarms where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from auditlog where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from events where clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));
delete from sessions where lastaccess < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 day));

PostgreSQL

delete from history where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from history_str where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from history_log where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from history_uint where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from history_text where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from trends where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from trends_uint where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from service_alarms where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from auditlog where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from events where clock < extract('epoch' from current_timestamp - interval'60 days') ;
delete from sessions where lastaccess < extract('epoch' from current_timestamp - interval'60 days') ;

2017年3月2日木曜日

MySQL ODBC Install Error

「Error 1918.Error installing ODBC driver My SQL ODBC
  5.3 ANSI Driver, ODBC error 13:システムエラー コード126:
  指定されたモジュールが見つかりません。…\myodbc55.dll)のために、
  MySQL ODBC 5.3 ANSI Driver ODBC ドライバーのセットアッププログラムを読み…」

「Error 1918. Error installing ODBC driver MySQL ODBC
 5.3 ANSI Driver, ODBC error 13: The setup routines for
 the MySQL ODBC 5.3 ANSI Driver ODBC driver could
 not be loaded due to system error code 126: The
 specified module could not be found. ...\myodbc5S.dll...」


参考にして
Microsoft Visual C++ 2013 をインストールしてください。
その後mysql-connector-odbc-5.3.7-winx64をインストールすると無事に
インストールされます。