`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 권한을 부여하는 것은 전적으로 가능 합니다 .

예 : 다음은 암호가 Clarkd 인 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가 마스터에서 슬레이브로 순회하는 것을 방지합니다.


오, 잠깐만 ... 혼란스러워 : binlog-ignore-db conf의 말에 상관없이 GRANT 문이 복제된다고 말하는가? 한 서버에서 새 사용자를 만들면 해당 사용자가 다른 서버에 나타나지 않습니다. GRANT가 전송되고 저장되었지만 단순히 슬레이브에 적용되지 않는다는 의미 입니까?
dlo

GRANTS는 도로 블록없이 적용됩니다. 따라서 SET SQL_LOG_BIN = 0을 실행해야합니다. GRANT 명령이 바이너리 로그를 입력하지 못하도록 mysql 세션에서.
RolandoMySQLDBA

GRANTS는 마스터 및 슬레이브의로드 블록없이 적용됩니다. 따라서 SET SQL_LOG_BIN = 0을 실행해야합니다. GRANT 명령이 바이너리 로그를 입력하고 슬레이브의 릴레이 로그를 통과하지 못하도록 mysql 세션에서.
RolandoMySQLDBA

1
확인. 다른 사람들에게 분명히하기 위해, 나는 당신이 전송 중에 암호를 노출시키는 GRANTS (Scott의 SSL 제안으로 해결할 수 있음)에 대해 경고하고 binlog에 일반 텍스트로 저장한다고 생각합니다. 저에게 관심이 있다면 binlog-ignore-db = mysql SET SQL_LOG_BIN = 0;을 모두 사용해야한다고 제안합니다 . 그러나 이러한 조건에 문제가 없으면 binlog-ignore-db 줄을 제거하여 GRANT를 복제하는 데 특별한 문제가 없습니다. 이것이 부정확 한 요약 인 경우 수정하십시오.
dlo September

@dlo-긍정 !!!
RolandoMySQLDBA

4

나는 mysql 데이터베이스를 복제하는 데 아무런 문제가 없었지만 인프라가 아닌 다른 사람들은 MySQL이 사용하는 포트 중 하나라도 연결할 수없는 방화벽 및 프록시 어플라이언스를 사용하여 추가적인 수준의 보안을 제공합니다. . 한 번만 권한을 부여하고 복제해야한다는 것을 알기 때문에 편의성이 향상됩니다. 호스트가 의도 한 것 이외의 다른 사람 (예 : 사용자, 슬레이브 등)에 노출되지 않도록 호스트를 올바르게 설정 한 경우 문제가 해결 될 수 있습니다.

중간 가로 채기에서 man에 지나치게 관심이 있다면 SSL을 통해 복제를 보내는 옵션이 항상 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.