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

2014年3月31日月曜日

MySQL5.6でのレプリケーション設定 (複数のデータベース)

今回は、MySQL5.6がインストールされた環境で、複数のデータベースを指定したレプリケーション設定を行いました。
構成はマスター&スレーブの2台となります。
MySQL5.6からリリースされたGTID機能を試してみたかったのですが、今回は都合により通常のレプリケーション設定になりました。
通常のレプリケーション設定なので今更感がハンパないですが、一応ブログに残しました。

サーバーにインストールされているOSは、Centos5.8(x86_64)となります。
ここでは、マスター側のサーバーIPアドレスを192.168.1.40とし、スレーブ側のサーバIPアドレスを192.168.1.50としています。
(レプリケーション設定を行う際は、対象のMySQLサーバーでの作業は全て停止してください。)



マスター側の設定 (192.168.1.40)

マスター側のMySQL設定ファイル(/etc/my.cnf)の[mysqld]項目に設定を追加しました。
log_bin設定:バイナリログの出力先を指定します。
server-id設定:サーバーを識別するための一意な値を指定します。
    (ここでは、IPアドレスのホスト部をserver-idとして指定しました)

[root@192.168.1.40 ~]# vi /etc/my.cnf

[mysqld]

~中略~

# バイナリログの出力先設定
log_bin = /var/lib/mysql/mysql-bin

# レプリケーションサーバーIDの指定
server-id = 40


マスター側の設定が完了したらMySQLを再起動。

[root@192.168.1.40 ~]# /etc/init.d/mysqld restart


続いて、mysqldumpを使って現在のDBのスナップショットを作成。
(スレーブ側に作成したスナップショットのファイルを転送しておいて下さい)

[root@192.168.1.40 ~]# mkdir /home/tanaka/mysqldump/

[root@192.168.1.40 ~]# mysqldump -u root -p --lock-all-tables target_database_name_1 > /home/tanaka/mysqldump/target_database_name_1.sql

[root@192.168.1.40 ~]# mysqldump -u root -p --lock-all-tables target_database_name_2 > /home/tanaka/mysqldump/target_database_name_2.sql

スレーブ側からアクセスするためのユーザーを作成します。
(障害に備え、スレーブ側にも同様のユーザーを作成しています)
ユーザー名はrepl。 パスワードはpasswordに設定しました。
また、アクセスを許可するネットワークも192.168.1.0/24(192.168.1.%)で指定しています。

[root@192.168.1.40 ~]# mysql -u root -p -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@192.168.1.% IDENTIFIED BY 'password';"


重要:最後に、SHOW MASTER STATUSを実行し、ファイル名と現在のポジションを取得しておきます。

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 1234
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)


[PR] MySQL関連書籍の紹介


スレーブ側の設定 (192.168.1.50)

スレーブ側のMySQL設定ファイル(/etc/my.cnf)の[mysqld]項目に設定を追加しました。
log_bin設定:バイナリログの出力先を指定します。
server-id設定:サーバーを識別するための一意な値を指定します。
    (ここでは、IPアドレスのホスト部をserver-idとして指定しました) ・relay-log設定:リレーログの出力先設定。名称を固定にするため、指定しておきます。
・他、log_slave_updates, read_only, replicate-do-db, replicate-ignore-db

[root@192.168.1.50 ~]# vi /etc/my.cnf

[mysqld]

~中略~

# バイナリログの出力先設定
log_bin = /var/lib/mysql/mysql-bin

# レプリケーションサーバーIDの指定
server-id = 50

# リレーログの出力先設定
relay-log=/var/lib/mysql/mysql-relay-bin

# レプリケーションサーバをチェーン状に構成する
#log_slave_updates=1

# レプリケーション スレーブ サーバで、この値を ON に設定すると、サーバが SUPER 権限を持つユーザ以外からの更新が出来ません。
# スレーブサーバは、マスタ サーバからの更新だけを許可し、クライアントからの更新を拒否します。
# この動作は TEMPORARY テーブルには使えません。 
#read_only=1

# レプリケーション対象データベース
replicate-do-db='target_database_name_1'
# レプリケーション対象データベース
replicate-do-db='target_database_name_2'
# レプリケーション対象外データベース
replicate-ignore-db='target_database_name_3'


read_only値については、(テンポラリ)テーブルを作成するようなアプリケーションでは使用出来ないとの事。
セキュリティ的にはONにしたい値ですが、今回のアプリケーションではテーブル作成処理も発生するので未指定にします。(´・ω・`)


設定ファイルの準備が出来たら、スレーブ側のMySQLサーバーにレプリケーション対象となるデータベースを作成して下さい。
先程、マスター側で生成したmysqldumpのファイルを流し込みます。
(マスター側で生成したファイルをスレーブ側に転送しておいて下さい)

[root@192.168.1.50 ~]# mysql -u root -p

mysql> CREATE DATABASE `target_database_name_1`;

mysql> CREATE DATABASE `target_database_name_2`;


mysql> exit

[root@192.168.1.50 ~]# mysql -u root -p target_database_name_1 < /home/tanaka/mysqldump/target_database_name_1.sql

[root@192.168.1.50 ~]# mysql -u root -p target_database_name_2 < /home/tanaka/mysqldump/target_database_name_2.sql


スレーブ側の設定が完了したら、こちらもMySQLを再起動。

[root@192.168.1.50 ~]# /etc/init.d/mysqld restart


障害時に、このスレーブがマスターに昇格した際、新たなスレーブ側からアクセスされるためのユーザーを作成しておきます。

[root@192.168.1.50 ~]# mysql -u root -p -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@192.168.1.% IDENTIFIED BY 'password';"


準備が出来たら、レプリケーション設定を完了させます。
スレーブ側のMySQLにログインをし、次の項目を指定しました。
MASTER_HOST 接続先(マスター)サーバーのIPアドレス(またはホスト名)
MASTER_PORT 接続先(マスター)サーバーの接続ポート番号
MASTER_USER, MASTER_PASSWORD マスター側に作成したアクセス用ユーザーの名前とパスワード
MASTER_LOG_FILE 接続先(マスター)サーバーで生成されたバイナリファイルのファイル名を指定します。
MASTER_LOG_POSには、マスター側でSHOW MASTER STATUSを実行した際に確認したポジション値を入力します。(ここでは1234としています)

設定が完了したら、START SLAVEを実行してレプリケーションを開始させて下さい。

[root@192.168.1.50 ~]# mysql -u root -p
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.1.40',
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=1234;


mysql> START SLAVE;



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

レプリケーションが正常に動作しているかは、マスター側のデータを更新することで確認出来ます。
(SHOW MASTER STATUSSHOW SLAVE STATUSを実行することによって得られるポジションの同期が取られているかなど)


お役に立てましたら幸いです c(・ω・´c⌒っ


Master

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 35854
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:



mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 3
   User: repl
   Host: 192.168.1.40:36811
     db: NULL
Command: Binlog Dump
   Time: 1277
  State: Master has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL


Slave

mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.40
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 35854
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 36017
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: target_database_name_1,target_database_name_2
          Replicate_Ignore_DB: target_database_name_3

~略~


mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 1
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 1327
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 2
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 41
  State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL


2013年12月24日火曜日

CentOS 5.8に、MySQL 5.6をインストールする。

MySQL 5.6 をrpmでインストールする

MySQLの公式からMySQL 5.6rpmのパッケージファイルをダウンロードしてきました。
(MySQL 5.6をインストールする前に、古いMySQLは削除してあります)

[root@centos5 ~]# ls -l MySQL-*
-rw-r--r-- 1 root root 23090275  9月 11 12:24 MySQL-client-5.6.14-1.rhel5.x86_64.rpm
-rw-r--r-- 1 root root  4563085  9月 11 12:24 MySQL-devel-5.6.14-1.rhel5.x86_64.rpm
-rw-r--r-- 1 root root 89839312  9月 11 12:26 MySQL-server-5.6.14-1.rhel5.x86_64.rpm
-rw-r--r-- 1 root root  5106177  9月 11 12:26 MySQL-shared-compat-5.6.14-1.rhel5.x86_64.rpm

[root@centos5 ~]# rpm -ivh ./MySQL-*
準備中...                ########################################### [100%]
   1:MySQL-shared-compat    ########################################### [ 25%]
   2:MySQL-client           ########################################### [ 50%]
   3:MySQL-devel            ########################################### [ 75%]
   4:MySQL-server           ########################################### [100%]

すんなりインストールも終わったので、早速起動してみました。

[root@centos5 ~]# /etc/init.d/mysqld start
2013-12-24 23:59:59 5770 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

rootで起動するなー!って言われてる……。
mysqlユーザーで起動します。

[root@centos5 ~]# su - mysql
-bash-3.2$ /etc/init.d/mysqld start
...
2013-12-24 23:59:59 5728 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

という謎エラーを吐いて死んでしまった。 (・_・;)
...
そもそも、mysql-serverを起動出来ていないのにmysql_upgradeとか実行出来ない。

その後も試行錯誤を続けるも謎エラーの嵐に嵌められて……

30分後

サクッと諦めました (´・ω・`)

[root@centos5 ~]# rpm -qa | grep 'MySQL' | xargs rpm --erase

削除、削除……っと。


という事で

MySQL 5.6 をyumでインストールする

にしました(`・ω・´)

[root@centos5 ~]# rpm -ivh http://repo.mysql.com/mysql-community-release-el5-5.noarch.rpm
http://repo.mysql.com/mysql-community-release-el5-5.noarch.rpm を取得中
準備中...                ########################################### [100%]
   1:mysql-community-release########################################### [100%]

[root@centos5 ~]# vi /etc/yum.repos.d/mysql-community.repo
enabled=1     ← 変更前
enabled=0     ← 変更後

[root@centos5 ~]# yum install --enablerepo=mysql56-community mysql-community-client.x86_64 mysql-community-common.x86_64 mysql-community-server.x86_64 mysql-community-libs.x86_64
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile

~中略~

Installed:
  mysql-community-client.x86_64 0:5.6.15-3.el5              mysql-community-common.x86_64 0:5.6.15-3.el5
  mysql-community-server.x86_64 0:5.6.15-3.el5              mysql-community-libs.x86_64

Complete!

古いmysqlのパッケージを綺麗に削除していない場合、conflicts with file from packageと怒られる場合があるようです!
わたしは怒られました(;´∀`)

インストールが終わったら起動を確認して、msyql_upgradeをして完了ですね。

[root@centos5 ~]# /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

[root@centos5 ~]# mysql_upgrade
Looking for 'mysql' as: mysql
...
OK

バージョンアップによって使えなくなっているパラメータなどがあるかもしれません。
MySQL5.6の起動に失敗した場合は確認してみてください。 c(・ω・´c⌒っ

わたしはこちらのサイトを参考にさせて頂きました。

2013年12月12日木曜日

MySQL5.0から5.5への道 (そして起動に失敗しました。)

MySQLを5.0から5.5にアップデートした時のお話。

MySQLを5.0から5.5にアップデートする作業を頂いた時のお話です。
アップデート作業自体は問題無く終わったのですが・・・・・・。

早速スタートしてみると「失敗」。

はい。 マニュアルをちゃんと読んでませんでした。 my.cnfのパラメータも色々と使えなくなってました! (〃´ω`)エヘヘ
default-charactor-set とか。
詳しくはこちらを読んでください。

では以下、その時のエラーと対応の記録です。

[root@centos5.8 etc]# /etc/init.d/mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]
[root@centos5.8 etc]# vi /etc/my.cnf
[mysqld]
default-charactor-set=utf8削除します。
charactor-set-server=utf8追加します。

他 - 略
~~~~~~~~~~~~~~~~~~~

[root@centos5.8 etc]# /etc/init.d/mysqld start --skip-name-resolve
mysqld を起動中:                                           [  OK  ]

起動に成功しました( ´∀`) ホッ
では、おやすみ前にmysqld.logの方を確認してみましょう。

    ・・・・・・。

    ・・・。

    。


131212  0:00:00 [ERROR] Missing system table mysql.proxies_priv; please run mysql_upgrade to create it
131212  0:00:00 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_current' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_history' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_history_long' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'setup_consumers' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'setup_instruments' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'setup_timers' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'performance_timers' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'threads' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_summary_by_thread_by_event_name' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_summary_by_instance' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'events_waits_summary_global_by_event_name' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'file_summary_by_event_name' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'file_summary_by_instance' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'mutex_instances' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'rwlock_instances' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'cond_instances' has the wrong structure
131212  0:00:00 [ERROR] Native table 'performance_schema'.'file_instances' has the wrong structure
131212  0:00:00 [ERROR] Column count of mysql.db is wrong. Expected 22, found 20. Created with MySQL 50095, now running                                                                                                                                                        50535. Please use mysql_upgrade to fix this error.
131212  0:00:00 [ERROR] mysql.user has no `Event_priv` column at position 29
131212  0:00:00 [ERROR] Cannot open mysql.event
131212  0:00:00 [ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.

な、何じゃこりゃああああああああああああああああ! 

見事に謎エラー出てました。
取り敢えずplease run mysql_upgrade to create itと騒ぎ立てておられるので、ここは大人しく実行してやろうじゃないですかー。

[root@centos5.8 ~]# mysql_upgrade -u root -p
Enter password:

~中略~

mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_topic                                   OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.time_zone_name                               OK
Running 'mysql_fix_privilege_tables'...
OK

MySQLアップグレード(mysql_upgrade)でのテーブルチェック、勉強になりました。 公式にしっかり書いてありますね。
今まではDB名にハイフン(-)を使っていた箇所が#に書き換えられてたのを手動で直していたのですが、これで解決するんですね。 
( ´∀`)エヘヘ 無知でした。

mysql_upgradeが完了。
再起動でmysqld.logにエラーが吐かれていない事を確認して、無事に終えることが出来ました。
 ε=(´ー`*)フゥ~
最後に、MySQLサーバーへログインしてSTATUSコマンドを実行した結果を貼っておきます!

mysql> STATUS;

Connection id:          9999
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.35 MySQL Community Server (GPL) by Remi
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 18 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 12  Flush tables: 1  Open tables: 6  Queries per second avg: 0.222
--------------

mysql> Bye

今回、参考にさせて頂きましたサイト。

ありがとう御座いました。

2013年12月3日火曜日

MySQLのスロークエリログをローテートさせる。

MySQLでスロークエリログ(log-slow-queries)を出力させ、そのログをログローテート(logrotate)機能でローテーションさせます。


MySQLスロークエリログの出力設定

スロークエリのログを出力する設定をmy.cnfに追記します。
今回はlog_query_timeを5秒に設定しています。この値を超える時間を要したクエリがログに出力されます。
出力されるログファイルはlog-slow-queriesで指定して下さい。
下記の例では/var/log/mysqld/ディレクトリにslow_query.logというファイルに出力させるように設定しました。( ´∀`)

[root@centos5 ~]# vi /etc/my.cnf
[mysqld]
long_query_time=5
log-slow-queries=/var/log/mysqld/slow_query.log

ログローテーションの実行設定

ログローテーションが実行されるように、/etc/logrotate.d/ディレクトリ下にファイルを作成します。
例ではmysqldというローテーションの設定ファイルを作成しています。
(下記の設定例では、スロークエリログ出力で指定したディレクトリ内に存在する全ての.log拡張子を持つファイルを対象としています。)

[root@centos5 ~]# vi /etc/logrotate.d/mysqld
/var/log/mysqld/*.log {
        create 640 mysql mysql
        notifempty
        daily
        rotate 7
        missingok
     postrotate
       if test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin ping &>/dev/null
       then
          /usr/bin/mysqladmin -u anonymous flush-logs
       fi
    endscript
}

  • create : (新規に作成されるファイルの所有者と権限を指定出来ます。)
  • notifempty : (ローテート対象のファイルが空の場合はローテートを行わない。)
  • daily : (日毎に行う。)
  • rotate : (ローテート履歴上限数。)
  • missingok : (ローテート対象となるログファイルが存在しなかった場合も処理を継続する。)
  • postrotate : (ローテート実行後に実行するコマンドやスクリプト。)

ポイントとしては/usr/bin/mysqladminflush-logsを実行させる際、-u(ユーザー指定オプション)を用いてログインにパスワード入力の必要がないユーザーを指定しています。
このファイル内にMySQLアカウントのパスワードを直接書いても良いのであれば「--user=USERNAME --password=PASSWORD」でも構わないと思います。
今回は、anonymousという専用ユーザーを作成しました。このユーザーにはRELOADの権限が必要となります。(それ以外は必要ありません。)

ユーザー名を未指定で実行した場合はrootユーザーで実行されます。
その場合、rootがパスワード入力無しでログイン出来ない場合は、以下の様なエラーメッセージが出力されます。

running postrotate script
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
error: error running postrotate script for /var/log/mysqld/*.log

ログローテートの実行後、新しく作成されたログファイルにログを出力させるためにはMySQLを再読み込みさせる必要があるので、この対応が必要となります。詳しくはリンク先を参照して下さい。
4.10.6. ログ ファイルの保守(MySQL に新しいログ ファイルの使用を強制するには、mysqladmin flush-logs...)
ログローテートの設定を行ったら、必ずテスト実行(-dオプション)して下さい。(`・ω・´)

[root@centos5 ~]# logrotate -d /etc/logrotate.d/mysqld

エラーが無ければOKです。
(-fオプション[ログローテートの強制実行]を指定すれば、実際にログのローテーションが行われます。)


今日はここまでです! ⊂⌒(。・ω・)っ お役にたてましたら嬉しいです。