`mysql`データベースを複製しても大丈夫ですか?


15

最初にマスターツーマスターレプリケーションをセットアップしたときに、次を使用しました。

binlog-ignore-db=mysql

ユーザーアカウントと付与を手動で同期しています。これは、単に私が当時使用していたハウツーで行われた方法です。しかし、この行を削除して、mysqlデータベース自体も複製することを許可しない理由はありますか?

もしそうなら:私が変更を行う前に、すべての許可が両方で同じであることを確認することに加えて(または、より正確に言うと、mysqlデータベース全体が同一である)、他に何かを再確認する必要があるか、または注意する必要がありますか?


過去4.5年間、mysqlをアップグレードするとき、マイナーアップグレードであっても、レプリケーションの問題に常に苦労していました。その理由はapt-get upgrade(実際には、mysql-server .deb postinstスクリプトが)ALTER TABLE user複製できないステートメントを実行するためです。私は、作業溶液投稿serverfault.com/questions/686025/...を
DLO

回答:


12

SQL GRANTコマンドを知らなくても、自分にmysqlパーミッションを付与することは完全に可能です。

例:これは、superDbaと呼ばれる場所からSQL GRANTを使用して、パスワードClarkKentを使用して、完全な特権を持つ独自のユーザーを作成することです。

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がマスターからスレーブに移動するのを防ぎます。


ちょっと待ってください。混乱しています。binlog-ignore-dbconfの内容に関係なく、GRANTステートメントが複製されると言っていますか?一方のサーバーで新しいユーザーを作成した場合、そのユーザーはもう一方のサーバーには表示されません。それでは、GRANTが送信されて保存されるが、スレーブには適用さないということでしょうか?
11

GRANTSはロードブロックなしで適用されます。そのため、SET SQL_LOG_BIN = 0を実行する必要があります。mysqlセッションでGRANTコマンドがバイナリログを入力しないようにします。
RolandoMySQLDBA

GRANTSは、マスターとスレーブにロードブロックなしで適用されます。そのため、SET SQL_LOG_BIN = 0を実行する必要があります。mysqlセッションで、GRANTコマンドがバイナリログを入力し、スレーブのリレーログに移動するのを防ぎます。
-RolandoMySQLDBA

1
OK。他の人にわかりやすいように、GRANTSが送信中のパスワードを公開し(これはScottのSSL提案で対処できます)、binlogにクリアテキストとして保存されることについて警告していると思います。それらが私にとって懸念がある場合は、binlog-ignore-db = mysql SET SQL_LOG_BIN = 0;の両方を使用する必要があることを示唆しています。しかし、これらの条件に問題がなければ、binlog-ignore-db行を削除してGRANTを複製しても特に問題はありません。これが不正確な要約である場合は修正してください。
dlo

@dlo-肯定!!!
RolandoMySQLDBA

4

mysqlデータベースの複製に問題はありませんでしたが、再度、インフラストラクチャはファイアウォールとプロキシアプライアンスを使用して追加レベルのセキュリティを提供します。 。許可を1回付与するだけで複製できるので、利便性がさらに向上します。目的のホスト(たとえば、あなた、スレーブなど)以外にホストを公開しないように適切に設定していれば、問題が解決するはずです。

中間傍受の人に過度に関心がある場合は、常にSSL経由でレプリケーションを送信するオプションがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.