Apakah boleh mereplikasi basis data `mysql`?

15

Ketika saya awalnya mengatur replikasi master-to-master saya, saya menggunakan:

binlog-ignore-db=mysql

dan telah menyinkronkan akun pengguna dan hibah secara manual. Ini hanya bagaimana hal itu dilakukan dalam bagaimana-saya gunakan pada saat itu. Tetapi apakah ada alasan mengapa saya tidak harus menghapus baris ini dan membiarkan mysqldatabase itu sendiri untuk mereplikasi juga?

Jika demikian: Sebelum saya melakukan perubahan, selain memastikan bahwa semua hibah sama pada keduanya (atau lebih baik dinyatakan, bahwa seluruh database mysql identik), apakah ada hal lain yang harus saya periksa atau sadari?

dlo
sumber
Selama 4,5 tahun terakhir saya selalu berjuang dengan masalah replikasi saat meningkatkan mysql, bahkan pada peningkatan kecil. Alasannya adalah apt-get upgrade(sebenarnya, skrip postinst mysql-server .deb) mengeksekusi ALTER TABLE userpernyataan yang tidak dapat direplikasi. Saya memposting solusi yang berfungsi di serverfault.com/questions/686025/…
dlo

Jawaban:

12

Sangat mungkin untuk memberikan izin mysql sendiri tanpa mengetahui perintah SQL GRANT .

Contoh: Di sini adalah untuk membuat pengguna Anda sendiri dengan hak penuh menggunakan SQL GRANT dari mana saja yang disebut superdba dengan kata sandi ClarkKent:

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

Inilah cara Anda dapat melakukan ini tanpa perintah GRANT:

Pertama-tama, di sini adalah mysql.user untuk 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)

Cukup jalankan perintah SQL ini:

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;

Itu INSERT adalah pernyataan SQL hukum yang dapat mendarat di log biner. Apakah Anda ingin seseorang menjalankan ini dan memiliki kata sandi yang terlihat berjalan di sepanjang jaringan? untuk duduk di log biner pada master? untuk duduk di log relay pada budak?

Memiliki arahan ini

binlog-ignore-db=mysql       

mencegah pemberian izin mysql menggunakan SQL tersebut. Namun, GRANT tidak dapat dihentikan dengan cara ini. Karena itu, pastikan Anda melakukan hibah seperti ini:

SET SQL_LOG_BIN=0;
GRANT ...

untuk mencegah GRANT dari melintasi dari master ke slave.

RolandoMySQLDBA
sumber
Oh, tunggu ... Saya bingung: Apakah Anda mengatakan bahwa pernyataan GRANT mereplikasi tidak peduli apa kata binlog-ign-db conf? Saya tahu jika saya membuat pengguna baru di satu server, pengguna itu tidak muncul di server lain. Jadi mungkin Anda maksud bahwa GRANT ditransmisikan dan disimpan tetapi tidak diterapkan pada budak?
dlo
HIBAH diterapkan tanpa blok jalan. Itu sebabnya Anda harus menjalankan SET SQL_LOG_BIN = 0; dalam sesi mysql untuk mencegah perintah GRANT memasuki log biner.
RolandoMySQLDBA
HIBAH diterapkan tanpa blok jalan pada master dan slave. Itu sebabnya Anda harus menjalankan SET SQL_LOG_BIN = 0; dalam sesi mysql untuk mencegah perintah GRANT dari memasukkan log biner dan melintasi ke log relai dari slave.
RolandoMySQLDBA
1
Baik. Supaya jelas bagi orang lain, saya yakin Anda memperingatkan saya tentang GRANTS yang mengekspos kata sandi dalam perjalanan (yang dapat diatasi dengan saran SSL oleh Scott) dan disimpan di teks-bersih dalam binlog. Anda menyarankan bahwa jika itu masalah bagi saya, maka saya harus menggunakan binlog- ign -db = mysql dan SET SQL_LOG_BIN = 0 ;. Tetapi jika saya setuju dengan kondisi tersebut, tidak ada masalah khusus dengan mereplikasi GRANT dengan menghapus baris binlog-ign-db. Perbaiki saya jika ini ringkasan yang tidak akurat.
dlo
@lo - Afirmatif !!!
RolandoMySQLDBA
4

Saya tidak punya masalah dengan mereplikasi database mysql, tetapi sekali lagi, infrastruktur saya memberikan tingkat keamanan tambahan dengan firewall dan peralatan proxy di mana tidak mungkin bagi siapa pun selain orang-orang infrastruktur untuk terhubung pada salah satu port yang digunakan MySQL . Itu menambah tingkat kenyamanan tambahan mengetahui bahwa Anda hanya perlu memberikan izin sekali dan memilikinya direplikasi. Ketika itu sampai pada itu, selama Anda telah mengatur host dengan benar untuk tidak mengeksposnya kepada orang lain selain yang dimaksud (misalnya Anda, budak, dll ...), Anda harus baik-baik saja.

Jika Anda terlalu khawatir dengan pria di intersepsi tengah, selalu ada opsi untuk mengirim replikasi melintasi SSL .

Scott
sumber