Czy można replikować bazę danych `mysql`?

15

Kiedy pierwotnie konfigurowałem replikację master-to-master, użyłem:

binlog-ignore-db=mysql

i synchronizowałam konta użytkowników i dotacje ręcznie. Tak to po prostu zrobiono w poradniku, z którego korzystałem w tym czasie. Ale czy jest jakiś powód, dla którego nie powinienem usuwać tego wiersza i pozwolić na mysqlreplikację samej bazy danych?

Jeśli tak: zanim dokonam zmiany, oprócz upewnienia się, że wszystkie granty są takie same w obu (lub lepiej mówiąc, że cała baza danych mysql jest identyczna), czy jest coś jeszcze, co powinienem dokładnie sprawdzić lub być świadomym?

dlo
źródło
W ciągu ostatnich 4,5 lat ciągle zmagałem się z problemami z replikacją podczas aktualizacji mysql, nawet przy drobnych aktualizacjach. Powodem jest to, że apt-get upgrade(tak naprawdę skrypt postinst serwera .deb serwera mysql) wykonuje ALTER TABLE userinstrukcje, których nie można replikować. Opublikowałem działające rozwiązanie na serverfault.com/questions/686025/…
dlo

Odpowiedzi:

12

Całkowicie możliwe jest nadanie sobie uprawnień mysql bez znajomości poleceń SQL GRANT .

Przykład: oto, aby utworzyć własnego użytkownika z pełnymi uprawnieniami za pomocą SQL GRANT z dowolnego miejsca o nazwie superdba z hasłem ClarkKent:

GRANT ALL PRIVILEGES ON *.* TO superdba@'%' IDENTIFIED BY 'ClarkKent' WITH GRANT OPTION; 

Oto, jak możesz to zrobić bez polecenia GRANT:

Po pierwsze, oto mysql.user dla MySQL 5.1.51

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)

Wystarczy wykonać następujące polecenia 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 to legalna instrukcja SQL, która może wylądować w dzienniku binarnym. Czy chcesz, aby ktoś to uruchomił i aby widoczne hasło podróżowało wzdłuż sieci? siedzieć w dzienniku binarnym na komputerze głównym? siedzieć w dzienniku przekaźników na slave?

Posiadanie tej dyrektywy

binlog-ignore-db=mysql       

zapobiega rozdawaniu uprawnień MySQL przy użyciu takiego SQL. GRANTÓW nie można jednak zatrzymać w ten sposób. Dlatego upewnij się, że wykonujesz takie granty:

SET SQL_LOG_BIN=0;
GRANT ...

aby uniemożliwić GRANTom przechodzenie od mistrza do niewolnika.

RolandoMySQLDBA
źródło
Och, czekaj ... Jestem zdezorientowany: Czy mówisz, że instrukcje GRANT replikują się bez względu na to, co mówi binlog-ignore-db conf? Wiem, że jeśli utworzę nowego użytkownika na jednym serwerze, ten użytkownik nie pojawia się na drugim. Więc może masz na myśli, że DOTACJA zostaje przesłana i zapisana, ale po prostu nie jest stosowana na niewolniku?
dlo
DOTACJE są stosowane bez żadnych blokad drogowych. Dlatego musisz uruchomić SET SQL_LOG_BIN = 0; w sesji mysql, aby zapobiec wprowadzaniu komend GRANT do dzienników binarnych.
RolandoMySQLDBA
DOTACJE są stosowane bez żadnych blokad drogowych na master i slave. Dlatego musisz uruchomić SET SQL_LOG_BIN = 0; w sesji mysql, aby zapobiec wprowadzaniu komend GRANT do dzienników binarnych i przechodzeniu do dzienników przekaźników urządzenia slave.
RolandoMySQLDBA
1
Dobrze. Dla jasności dla innych, uważam, że ostrzegasz mnie przed ujawnieniem przez GRANTS haseł w drodze (które może być rozwiązane za pomocą sugestii SSL przez Scotta) i zapisaniem czystego tekstu w binlog. Sugerujesz, że jeśli dotyczą mnie to, powinienem użyć zarówno binlog-ignore-db = mysql, jak i SET SQL_LOG_BIN = 0 ;. Ale jeśli zgadzam się na te warunki, nie ma szczególnego problemu z replikacją GRANTów przez usunięcie wiersza binlog-ignore-db. Popraw mnie, jeśli jest to niedokładne podsumowanie.
dlo
@ dlo - twierdząco !!!
RolandoMySQLDBA
4

Nie miałem problemów z replikacją bazy danych mysql, ale z drugiej strony moja infrastruktura zapewnia dodatkowy poziom bezpieczeństwa dzięki zaporom ogniowym i urządzeniom proxy, gdzie nikt inny niż infrastruktura nie może nawet połączyć się z żadnym portem, z którego korzysta MySQL . Dodaje to dodatkowy poziom wygody, wiedząc, że wystarczy przyznać uprawnienia tylko raz i przeprowadzić replikację. Kiedy wszystko sprowadza się do tego, o ile prawidłowo ustawiłeś hosta, aby nie wystawiał go nikomu poza zamierzonym (np. Ty, niewolnik itp.), Powinieneś czuć się dobrze.

Jeśli nadmiernie martwisz się o człowieka w trakcie przechwytywania, zawsze istnieje możliwość wysłania replikacji przez SSL .

Scott
źródło