20200409のMySQLに関する記事は7件です。

db インデックスについて

インデックスについて

インデックスとは

インデックスとは、テーブルの情報を探すときに、検索しやすいようにしておいたもの。
テーブルに格納されたデータは、順番に並んでいるわけではないので、検索していくときは上から順に調べていくのは、非常に効率が悪い。
このようなときに、インデックスを作成すると効率よく検索できる場合がある。例えば、idカラムとnameカラムがあった場合、インデックスをnameカラムを対象に作成すると、nameカラムを昇順に並び変え、nameカラムを検索するときに高速で検索することができる。

デメリット

インデックスはテーブルとは別にデータを保持するので、テーブルにデータを追加するとインデックスにもデータが追加される。そのため、再度並び替えなどを行うと、データを追加する時の処理が遅くなる。なので、格納されているデータが少ないテーブルではインデックスを作成しても効果は期待されない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLとmariaDBにおけるJSON関連の差異

mariaDBでJSON型のカラムを扱ってはまったのでメモ

環境

Mysql : 5.7.29
mariaDB : 10.5.2

データ準備

create table sample (id int,item json);
insert into sample values(1,'{"kanagawa":"yokohama"}');
insert into sample values(2,'{"yamanashi":"kofu"}');

itemはkey:県名、value:県庁所在地のJSON。

単純な抽出

まずは単純にselect。差は全くない。

MySQL
select * from sample;
+------+--------------------------+
| id   | item                     |
+------+--------------------------+
|    1 | {"kanagawa": "yokohama"} |
|    2 | {"yamanashi": "kofu"}    |
+------+--------------------------+
MariaDB
select * from sample;
+------+--------------------------+
| id   | item                     |
+------+--------------------------+
|    1 | {"kanagawa": "yokohama"} |
|    2 | {"yamanashi": "kofu"}    |
+------+--------------------------+

集約

 1.GROUP_CONCAT

区切り文字を指定しなければいずれも,(カンマ)で結合される。

MySQL
select GROUP_CONCAT(item) from sample;
+------------------------------------------------+
| GROUP_CONCAT(item)                             |
+------------------------------------------------+
| {"kanagawa": "yokohama"},{"yamanashi": "kofu"} |
+------------------------------------------------+
MariaDB
select GROUP_CONCAT(item) from sample;
+----------------------------------------------+
| GROUP_CONCAT(item)                           |
+----------------------------------------------+
| {"kanagawa":"yokohama"},{"yamanashi":"kofu"} |
+----------------------------------------------+

 2.JSON_ARRAYAGG

ここがハマったポイント。MySQLはJSON型のカラムをそのまま配列として返すが、MariaDBはエスケープシーケンスされた文字列の配列として返す。
原因は推測だがMariaDB上では「JSON型はLONGTEXT型のエイリアス」1であることと思われる。

MySQL
select JSON_ARRAYAGG(item) from sample;
+---------------------------------------------------+
| JSON_ARRAYAGG(item)                               |
+---------------------------------------------------+
| [{"kanagawa": "yokohama"}, {"yamanashi": "kofu"}] |
+---------------------------------------------------+
MariaDB
select JSON_ARRAYAGG(item) from sample;
+------------------------------------------------------------+
| JSON_ARRAYAGG(item)                                        |
+------------------------------------------------------------+
| ["{\"kanagawa\":\"yokohama\"}","{\"yamanashi\":\"kofu\"}"] |
+------------------------------------------------------------+

 3.JSON_OBJECTAGG

JSON_OBJECTAGGもJSON_ARRAYAGGと同様

MySQL
select json_objectagg(id,item) from sample;
+-------------------------------------------------------------+
| json_objectagg(id,item)                                     |
+-------------------------------------------------------------+
| {"1": {"kanagawa": "yokohama"}, "2": {"yamanashi": "kofu"}} |
+-------------------------------------------------------------+
MariaDB
select json_objectagg(id,item) from sample;
+---------------------------------------------------------------------+
| json_objectagg(id,item)                                             |
+---------------------------------------------------------------------+
| {"1":"{\"kanagawa\":\"yokohama\"}", "2":"{\"yamanashi\":\"kofu\"}"} |
+---------------------------------------------------------------------+

MariaDBでMySQL同等の結果を取得するためには

一応、SQLを工夫すればMariaDBでもMySQL同等の結果が取得できる。但し、項目値によってはkeyが重複するなどするため、JSONとしての正しさは保証されない。

JSON_ARRAYAGG

MariaDB
select CONCAT('[',GROUP_CONCAT(item),']') from yukisaki_database.sample;
+------------------------------------------------+
| CONCAT('[',GROUP_CONCAT(item),']')             |
+------------------------------------------------+
| [{"kanagawa":"yokohama"},{"yamanashi":"kofu"}] |
+------------------------------------------------+

JSON_OBJECTAGG

MariaDB
select CONCAT('{',GROUP_CONCAT(CONCAT('"',id,'":',item)),'}') from sample;
+--------------------------------------------------------+
| CONCAT('{',GROUP_CONCAT(CONCAT('"',id,'":',item)),'}') |
+--------------------------------------------------------+
| {"1":{"kanagawa":"yokohama"},"2":{"yamanashi":"kofu"}} |
+--------------------------------------------------------+
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL基本

はじめに

こちらではMySQLの基本操作を書いていきます。
複雑だったりレベルの高い操作を書くよりも今日インストールしたばっかりで何すればいいの?
みたいな人を対象にしようと思っております。

環境

VirtualBox
Vagrant
Cent0S7
MySQL(Ver 8.0.19)

こちらで構築の紹介をさせていただいてます参考にどうぞ
MySQL版

データベースって?

データベースとは・・・
ベースとなるデータの集合体・・・・といえば雑ですが・・・
つまりは情報の集まりですね。
なんの情報を扱うかは何をしたいかそれぞれちがいますが・・・

例:hogeさんhugaという人の情報があったとします

名前:hoge  
年齢:16歳   
出身:東京   

名前:huga
年齢:27歳
出身:大阪

とします

 id   名前     年齢      出身  
1  hoge     16       東京  
2  huga     27       大阪  
3  piyo     38       愛知  

こういった情報の集まりがデータベースとなります

この情報を元に説明していきます。

基本的な操作ですが
CRUDを中心に説明したいと思います。

CRUD(クラッド)って?

C -> Create(製作)
R -> Read(閲覧)
U -> Update(更新)
D -> Delete(削除)

の頭をとったものです。

MySQLの操作

DB内容を操作するのはいいですがまずはDBそのものの操作を確認してみましょう。
書いて確認して〜みたいな流れでもいいですが読み返す時にまとまっている方が楽だと思うので。
さらっと要点だけ書いていきたいと思います。

ユーザの作成

create user [ユーザ名]@[ホスト名] identified by '[パスワード]';

権限付与

mysql> grant [権限] on [データベース名].* to [ユーザ名]@[ホスト名];
mysql> drop user [ユーザ名]@[ホスト名]

DBの確認

mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

DBの作成

mysql> create database [任意のDB名];

名前変更

mysql> rename [変更したいデータベース名] to [新データベース名] ;

削除

mysql> drop database [削除したいデータベース名];

使用するデータベース選択

mysql> use [データベース名];

外部ファイルの読み込み

mysql> \. [ファイルパス]/[ファイル名].sql

DBデーブル操作

こちらではDBの操作をみてみましょう
ここからはカラムとレコードを用意するの出会うがappdb.sqlというファイルを自分で作って操作しながら説明していきたいと思います。

appdb.sql
--テーブルの削除
drop table if exists db01;

--テーブルの作成
create table db01 (
 id int unsigned primary key auto_increment,
  name varchar(20),
  age int unsigned,
  from_ja varchar(20)
);

--レコードの追加
insert into db01(name,age,from_ja)values('hoge',18,'東京');

--レコードの追加(まとめて)
insert into db01(name,age,from_ja)values
 ('fuga',27,'大阪'),
 ('piyo',38,'愛知');

--テーブル内容表示
select * from db01;

実行結果

+-------+------+------+---------+
|  id  | name | age  | from_ja |
+-------+------+------+---------+
|     1 | hoge |   18 | 東京    |
|     2 | fuga |   27 | 大阪    |
|     3 | piyo |   38 | 愛知    |
+-------+------+------+---------+

ここからはSQL上で説明していきます
テーブル情報の確認

mysql> desc [テーブル名]

抽出

mysql> select * from [テーブル名] where [抽出したい内容]

レコードの追加

mysql> insert into [テーブル名]([カラム名])values([データ]);

レコード更新

mysql> update [テーブル名] set [カラム名] = [データ] where [カラム名] = [データ];

レコードの削除

mysql> delete from [テーブル名] where [カラム名] = [データ];

カラムの追加

mysql> alter table [テーブル名] add column [カラム名] [型] after [カラム名];

カラムの更新

mysql> alter table [テーブル名] change [旧カラム名] [新カラム名] [型] 

カラムの削除

mysql> alter table [テーブル名] drop column [カラム名];

そのた

DBでバックアップを取る事もあると思います。

$ mysqldump -u [ユーザ名]@[ホスト名] -p [DB名] > [ファイル名].sql

まとめ

いかがだったでしょうかDBは奥が深いですが簡単にでも理解できていただいたら幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL構築

はじめに

こちらではMySQLの構築について紹介させていただきます。
まぁどこにでもある普通の内容でQiita使ってる皆様には食傷気味かもしれませんが。なるべくわかりやすくを心掛けて書いていきたいと思います。

環境

VirtualBox
Vagrant
Cent0S7

こちらで構築の紹介をさせていただいてます参考にどうぞ

手順

不要なものを削除(入っていれば)

まず最初にCentOS7にはMariaDBがデフォルトで入っているらしいのでそれを確認(残っていると競合してしまいインストールできないらしい)

$ yum list installed | grep maria

ある場合は削除します。

$ sudo yum remove -y mariadb-libs.x86_64

データディレクトリも削除(ある場合)

$ rm -rf /var/lib/mysql/

MySQL導入

まずMySQLがあるかどうか調べます。

$ yum list | grep mysql       
akonadi-mysql.x86_64                        1.9.2-4.el7                base     
apr-util-mysql.x86_64                       1.5.2-6.el7                base     
dovecot-mysql.x86_64                        1:2.2.36-3.el7_7.1         updates  
freeradius-mysql.x86_64                     3.0.13-10.el7_6            base     
libdbi-dbd-mysql.x86_64                     0.8.3-16.el7               base     
mysql-connector-java.noarch                 1:5.1.25-3.el7             base     
mysql-connector-odbc.x86_64                 5.2.5-8.el7                base     
pcp-pmda-mysql.x86_64                       4.3.2-5.el7_7              updates  
php-mysql.x86_64                            5.4.16-46.1.el7_7          updates  
php-mysqlnd.x86_64                          5.4.16-46.1.el7_7          updates  
qt-mysql.i686                               1:4.8.7-3.el7_6            base     
qt-mysql.x86_64                             1:4.8.7-3.el7_6            base     
qt5-qtbase-mysql.i686                       5.9.7-2.el7                base     
qt5-qtbase-mysql.x86_64                     5.9.7-2.el7                base     
redland-mysql.x86_64                        1.0.16-6.el7               base     
rsyslog-mysql.x86_64                        8.24.0-41.el7_7.4          updates  

MySQLサーバをインストールしたいですがないようです。
CentOS7には公式のyumリポジトリにはないようなので公式からrpmファイルをインストールすることになります。

SQL公式からインストールのやり方を書いてくださっているのでそちらを参考に構築していきます。

$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

正常にインストールできているか確認

$ yum repolist enabled | grep "mysql.*-community.*"

インストール

$ sudo yum install mysql-community-server

バージョンの確認

$ mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

起動

$ sudo service mysqld start

起動確認

$ sudo service mysqld status

active (running)
と表示されていたら起動されています。

設定

この状態だとOS起動する度にSQLを起動しなおさないといけないので
自動起動するように設定します。

$ systemctl start mysqld

再起動して確認してみましょう。
起動していたら成功です。

続いてパスワードの設定
初期パスワードはmysqld.logのなかに書かれています。

確認

$ sudo cat /var/log/mysqld.log | grep root
2020-04-09T01:15:32.727302Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [初期パスワード]

起動してログイン

$ mysql -u root -p
Enter password:[初期パスワードを入力]

パスワードの変更
方法はいくつかありますが公式のセキュリティ改善で紹介されているのでこちらで紹介いたします

$ sudo mysql_secure_installation

最初にパスワードを聞かれるので初期パスワードを入力して新しいパスワードを入力してください

$ mysql -u root -p
Enter password:[新しく設定したパスワードを入力]

ログインできたら成功です。

パスワードポリシー

新しいパスワードを設定する際にパスワードポリシーを知る必要があります。
こちらではMySQLに保存されているパスワードポリシーを確認してみましょう。

公式にやり方が載っているので参考に

mysql> SHOW VARIABLES LIKE 'validate_password.%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

参考程度に一例

mysql> set global validate_password.length=9; 

確認

mysql> SHOW VARIABLES LIKE 'validate_password.%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 9      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

変わったのがわかると思います。

試しに新しく作ってみましょう

mysql> create user 'user@localhost' identified by '<?lz*V6?';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

8文字でエラーが出ているのがわかると思います。

まとめ

いかがだったでしょうか今回はCentOSでMySQLのインストールとパスワードの初期設定について紹介いたしました。
参考になれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL SQL文で自動インクリメントなどの機能を備えたusersテーブルを作る

目的

  • idの自動インクリメントやNot NULL制約、データの不一致制約などの機能が盛り込まれたベーシックなusersテーブルの作成を行う

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
PC機種 MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提環境

作成目標テーブルの確認

  • testという名前のデータベースを作成し、その中にusersテーブルを作成する。
  • 下記に作成するusersテーブルのイメージを記載する。

    id name email create_at update_at
    1 山田 太郎 yamada.tarou@mail.com YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS
  • usersテーブルの全てのカラムに共通する詳細情報を記載する。

    • NULLを許容しない。
  • usersテーブルの各カラムの詳細情報を記載する。

    • idカラム: integer型おカラムとしてレコードが追加される際に自動インクリメントされた数値が格納される。このカラムを主キーとする。
    • nameカラム: varchar型のカラムとして文字数上限を30文字とする。
    • emailカラム: varchar型のカラムとして文字数上限を256文字とする。(Simple Mail Transfer Protocolでのアドレス文字数を根拠に決定)
    • create_atカラム: datetime型のカラムとして初回データ格納時に自動で日時を格納する。
    • update_atカラム: datatime型のカラムとして初回データ格納時にはcreate_atカラムと同じ値を格納し、当該レコードのデータに更新があった時の日時を格納する。

実施方法概要

  1. ログイン
  2. データベースの作成
  3. テーブルの作成
  4. 確認

実施方法詳細

  1. ログイン

    1. 下記コマンドを実行してMySQLのターミナルを起動する。(MySQLのルートユーザのパスワードを忘れてしまった方はこちら→MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法)

      $ mysql -u root -p
      
    2. MySQLにターミナルからログインできる事を確認する。(ターミナルにmysql>と表示されていればOK)

  2. データベースの作成

    1. MySQLのにターミナルでログイン後、下記を実行してtestデータベースを作成する。

      mysql> create database test;
      
    2. 下記を実行してデータベースを指定する。

      mysql> use test;
      Database changed
      
  3. テーブル作成

    1. 下記を実行してusersテーブルを作成する。

      mysql> create table users (
          -> id integer primary key auto_increment,
          -> name varchar(30) not null default 'user',
          -> email varchar(256) not null default 'example@email.com' unique,
          -> created_at datetime not null default current_timestamp,
          -> updated_at datetime not null default current_timestamp on update current_timestamp
          -> );
      
  4. 確認

    1. 下記を実行して正常にテーブルが作成されている事を確認する。

      mysql> show columns from users;
      
    2. 下記のように出力される事を確認する。

      mysql> show columns from users;
      | Field      | Type         | Null | Key | Default           | Extra                                         |
      +------------+--------------+------+-----+-------------------+-----------------------------------------------+
      | id         | int          | NO   | PRI | NULL              | auto_increment                                |
      | name       | varchar(30)  | NO   |     | user              |                                               |
      | email      | varchar(256) | NO   | UNI | example@email.com |                                               |
      | created_at | datetime     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED                             |
      | updated_at | datetime     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
      +------------+--------------+------+-----+-------------------+-----------------------------------------------+
      
    3. 下記を実行してダミーデータを格納する。

      mysql> insert into users
          -> (id, name)
          -> value (1, 'test_user');
      
    4. 下記を実行してダミーデータが正常に格納されている事を確認する。

      mysql> select *
          -> from users;
      
    5. 下記のように表示される事を確認する。

      mysql> select *
          -> from users;
      +----+-----------+-------------------+---------------------+---------------------+
      | id | name      | email             | created_at          | updated_at          |
      +----+-----------+-------------------+---------------------+---------------------+
      |  1 | test_user | example@email.com | YYYY-MM-DD HH:MM:SS | YYYY-MM-DD HH:MM:SS |
      +----+-----------+-------------------+---------------------+---------------------+
      
    6. 下記を実行してダミーデータのnameを書き換える。

      mysql> update users
          -> set name = 'test_user_1'
          -> where id = 1;
      
    7. 下記を実行してダミーデータのnameが書き換わっている事を確認する。

      mysql> select *
          -> from users;
      
    8. 下記のように表示される事を確認する。(update_atも更新されている)

      mysql> select *
          -> from users;
      +----+-------------+-------------------+---------------------+---------------------+
      | id | name        | email             | created_at          | updated_at          |
      +----+-------------+-------------------+---------------------+---------------------+
      |  1 | test_user_1 | example@email.com | YYYY-MM-DD HH:MM:SS | YYYY-MM-DD HH:MM:SS |
      +----+-------------+-------------------+---------------------+---------------------+
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ZABBIXのデータベースをデータベースレプリケーションでバックアップする

ZABBIXのデータベースをバックアップする手段として、レプリケーションを使って見ることにしました。
そのときの手順をまとめました。

OS データベース IPアドレス
ZABBIXサーバー Raspbian Buster MariaDB 192.168.1.11
DBサーバー Ubuntu 18.04 MariaDB 192.168.3.22

ZABBIXサーバー側の設定

ZABBIXサーバーのデータベースがレプリケーションのマスターサーバーになる。

cnfファイルの設定

  • bind設定をコメント化して、サーバーIDとバイナリログの設定をアンコメントして修正
cd /etc/mysql/mariadb.conf.d
vi 50-server.cnf
50-server.cnf
[mysqld]
・
・
# bind-address          = 127.0.0.1
・
・
server-id               = 101
log_bin                 = /var/log/mysql/mysql-bin.log
  • 設定内容を反映させるためにMySQLを再起動
systemctl restart mysql.service

スレーブサーバー用のアカウントを作成

mysqlコマンドに入る

mysql -u root -p
create user 'repl'@'192.168.3.22' identified by 'P@ssw0rd';
grant replication slave on *.* to 'repl'@'192.168.3.22';

zabbixデーターベースのスナップショットを取得

zabbixデーターベースの内容をスレーブサーバーにコピーするためスナップショットを取得します。

  • スナップショット取得中にDBが更新されないようにテーブルの書き込みをロック
flush tables with read lock;
  • バイナリログの状態を確認する
show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |   123628 |              |                  |
+------------------+----------+--------------+------------------+

mysqlコマンドを抜ける

\q
  • zabbixテーブルのスナップショットを取得
mysqldump --single-transaction -u root -p zabbix > zabbix.dump
  • テーブルの書き込みをロックを解除

mysqlコマンドに入る

mysql -u root -p
unlock tables;

mysqlコマンドを抜ける

\q
  • zabbixテーブルのスナップショットをscpでスレーブサーバーに転送
scp zabbix.dump ubuntu@192.168.3.22:/home/ubuntu

ここまでで、ZABBIXサーバー側の設定は完了

バックアップ用サーバー側の設定

cnfファイルの設定

  • サーバーIDの設定をアンコメントして修正
cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf
mysqld.cnf
[mysqld]
・
・
server-id               = 102
  • 設定内容を反映させるためにMySQLを再起動
systemctl restart mysql.service

zabbixデーターベースのスナップショットを反映

mysqlコマンドに入る

mysql -u root -p
create database zabbix;
use zabbix;
source /home/ubuntu/zabbix.dump

スレーブデーターベースの設定

  • スレーブデーターベースからマスターデータベースへ接続するためのパラメータを設定

※見やすさのために改行していますが実際には1行で入力

change master to 
master_host='192.168.1.11',
master_user='repl',
master_password='P@assw0rd',
master_log_file='mysql-bin.000001',
master_log_pos=123628;
  • レプリケーション対象にzabbixデータベースを設定
change replication filter replicate_do_db = (zabbix);
  • レプリケーションを開始
start slave;
  • スレーブサーバーの状態を確認

特にエラーが出力されていなければ問題なくレプリケーションの設定が行われています。
エラーの内容は、Last_IO_Error:、Last_SQL_Error:に表示されます。
Slave_SQL_Running_State:に状態が表示されます。

show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1693614
               Relay_Log_File: mysql-slave2-relay-bin.000002
                Relay_Log_Pos: 1570431
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: zabbix
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1693614
              Relay_Log_Space: 1570645
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 101
                  Master_UUID:
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

レプリケーションの動作確認

最後に、zabbixサーバのzabbixデーターベースにhogeテーブルを追加したときに正常にレプリケーションが行われるか確認します。

バックアップ用サーバーに、hogeテーブルがないことを確認します。

mysql -u root -p

use zabbix;
show tables;

Empty set (0.00 sec)

ZABBIXサーバーのzabbixデータベースにhogeテーブルを追加します。

mysql -u root -p

use zabbix;
create table hoge ( id INT not null );
show tables;

+-------------------+
| Tables_in_example |
+-------------------+
| hoge              |
+-------------------+

・バックアップ用サーバーのzabbixデータベースを確認し、hogeテーブルが追加されていれば、正常にレプリケーションが行われています。

mysql -u root -p

show tables;

+-------------------+
| Tables_in_example |
+-------------------+
| hoge              |
+-------------------+

以上で、設定は完了です。

レプリケーションの状態をZABBIXで監視する

下記のサイトを参考に設定する。

Zabbix MySQLスレーブサーバ(レプリケーション)の監視設定メモ

エラーで止まっているレプリケーションを再開する

エラーの状況をエラーログや「SHOW SLAVE STATUS」などで確認する。
スレーブ側でSQLがエラーになっていて無視してよいものであれば、スキップして次に進ませる。

STOP SLAVE
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE

参考情報

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境変数に空文字``を設定する

コンバンワ、今日も相変わらずembulkのお世話になっていたプレイライフの合原です。

ちょびっと気づきがあったので、tips的な記事を。

※話をスコープしたいので、embulkで自体の説明は割愛します。

embulkでは環境変数が使える

みんな大好きバルクデータローダembulkでは、環境変数を使って、(例えば環境に応じて等)値を設定することができます。
Rails環境下でembulkを使って快適に数十万件のデータを取り込むとか読んでいただけますと雰囲気がわかるかと思います。

例えば、

export DB_HOST=127.0.0.1
export DB_NAME='db'
export DB_USER=db_user
export DB_PASSWORD="hogehoge"

とあると、これを、

#
out:
  type: mysql
  host: {{ env.DB_HOST }}
  database: {{ env.DB_NAME }}
  user: {{ env.DB_USER }}
  password: {{ env.DB_PASSWORD }}
  table: target_table
   :

と言った具合に参照できるようになります。

環境変数に''を設定するには?

ローカル環境で開発する際など、よくDBのパスワードを''にしているケースはあるかと思います。

export DB_PASSWORD=""

export DB_PASSWORD=''

上記の二つは、いずれも未定義状態になってしまいます。
答えは、

export DB_PASSWORD="''"

一応、確かめてみると...

$ HOGE=""                                                                                   
$ echo $HOGE

$ HOGE=''"
$ echo $HOGE

$ HOGE="''" 
$ echo $HOGE                                                                               
''       

... というわけで、

  password: {% if env.RAILS_ENV == 'development' %} '' {% else %}{{ env.DB_PASSWORD }}{% endif %}

というようなことをする必要はなく、

  password: {{ env.DB_PASSWORD }}

で済みます。

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む