私が最初にマスターからマスターへのレプリケーションを設定したとき、私は次のものを使用しました:
binlog-ignore-db=mysql
ユーザーアカウントと権限を手動で同期しています。これは、当時 ハウツーが使用していた で単純に行われた方法です。しかし、この行を削除してmysql
データベース自体も複製できるようにする理由はありますか?
その場合:変更を加える前に、すべての許可が両方で同じであることを確認する(または、より正確に言えば、mysqlデータベース全体が同一であることを確認する)以外に、再確認または注意する必要があるものはありますか?
SQL GRANTコマンド を知らなくても、mysql権限を自分に与えることは完全に可能です。
例:ここでは、パスワードがClarkKentであるsuperdbaという場所からSQL GRANTを使用して、完全な特権を持つ独自のユーザーを作成します。
GRANT ALL PRIVILEGES ON *.* TO superdba@'%' IDENTIFIED BY 'ClarkKent' WITH GRANT OPTION;
GRANTコマンドを使用せずにこれを行う方法を次に示します。
まず、MySQL 5.1.51のmysql.userです。
mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)
次のSQLコマンドを実行するだけです。
INSERT INTO mysql.user SET
Host='%',User='superdba',Password=PASSWORD('ClarkKent'),
Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',
Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',
Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',
Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',
Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',
Repl_slave_priv='Y',Repl_client_priv='Y',Create_view_priv='Y',
Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y',
Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y';
FLUSH PRIVILEGES;
そのINSERTは、バイナリログに記録される可能性のある正当なSQLステートメントです。誰かにこれを実行させて、目に見えるパスワードをネットワーク上で移動させたいですか?マスターのバイナリログに座るには?スレーブのリレーログに座るには?
このディレクティブを持つ
binlog-ignore-db=mysql
そのようなSQLを使用してmysql権限を与えることを防ぎます。ただし、この方法でGRANTを停止することはできません。したがって、必ず次のような付与を実行してください。
SET SQL_LOG_BIN=0;
GRANT ...
gRANTがマスターからスレーブに移動しないようにします。
私はmysqlデータベースの複製に問題はありませんでしたが、私のインフラストラクチャは、ファイアウォールやプロキシアプライアンスを使用して、MySQLが使用するポートのいずれかに接続することさえ不可能である追加のセキュリティレベルに役立ちます。 。これにより、アクセス許可を1回だけ付与して複製する必要があることがわかって、利便性がさらに高まります。それが煮詰めたとき、意図した以外の人(あなた、スレーブなど)にそれを公開しないようにホストを適切に設定している限り、問題はありません。
途中で傍受している人に過度に関心がある場合は、常に SSL経由のレプリケーション を送信するオプションがあります。