Mencegah penulisan non-replikasi ke MySQL slave?

12

Kami memiliki beberapa server database MySQL yang diatur dengan replikasi berbasis baris, untuk kinerja. Perangkat lunak menulis ke master, dan membaca dari master atau slave. Semuanya bekerja dengan baik, sebagian besar.

Ini pemahaman saya bahwa MySQL akan mengizinkan penulisan ke slave, meskipun ia tahu itu adalah slave MySQL. Idealnya, saya ingin menutup ini, jadi bahkan jika seseorang menulis beberapa kode buruk yang mendapat koneksi-baca dan melakukan UPDATE, itu akan menimbulkan kesalahan daripada menaruh data pada slave.

Apakah ada cara untuk melakukan ini di MySQL? Jelas kami ingin membuat ini tidak mungkin dari perangkat lunak kami, juga, tetapi seperti firewall di server kami, saya ingin menjadi defensif mungkin.

Terima kasih!


sumber

Jawaban:

13

Aktifkan read-onlyopsi di my.cnf. Itu juga dapat ditentukan sebagai flag pada baris perintah menggunakan --read-onlydengan mysqld.

Warner
sumber
5
Perhatikan bahwa ini tidak akan berfungsi untuk pengguna super (yaitu: pengguna root di MySQL) karena tidak mematuhi read-only.
vmfarms
5

Sebagai alternatif untuk pengaturan read_only=1(misalnya ketika ada basis data scratchpad / pelaporan / pengembangan lain pada contoh slave), saya terkadang menghapus semua hak istimewa selain SELECT dari semua pengguna ke DB yang saya replikasi.

Yaitu, setelah menjalankan perintah GRANT pada master, saya menjalankan perintah REVOKE pada slave.

Riedsio
sumber
2

Pada MySQL 5.7.8 , sekarang ada super_read_onlyopsi, yang mencegah bahkan pengguna SUPER melakukan pembaruan klien. Itu tidak mengganggu proses replikasi. Seperti pengaturan lainnya, dapat diatur:

  • dalam format baris perintah ( --super_read_only=ON),
  • sebagai variabel di my.cnf ( super_read_only=1), atau
  • dari prompt klien ( SET GLOBAL super_read_only = 1;).

Perhatikan bahwa:

  • Mengaktifkan super_read_onlysecara implisit memungkinkanread_only
  • Menonaktifkan read_onlysecara implisit menonaktifkansuper_read_only

Beberapa peringatan:

  • Juga read_onlytidak super_read_onlyakan mencegah operasi pada tabel sementara.
  • Mereka tidak akan mencegah operasi metadata seperti ANALYZE TABLE dan OPTIMIZE TABLE.
  • Bug untuk kueri tertentu dengan yang super_read_onlydiaktifkan telah dilaporkan.

Referensi: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/

billyw
sumber
1

Seperti yang disarankan oleh posting pertama, Anda melakukannya dengan izin. Opsi baca-saja tidak berfungsi untuk pengguna super sebagai FYI dan juga bukan solusi yang bisa diterapkan untuk budak di mana Anda ingin mencegah penulisan. Anda perlu mencegah penulisan dengan izin pengguna / database / tabel. Untuk satu, pengguna replikasi masih harus bisa menulis ke budak untuk tetap sinkron dengan master. Cara yang lebih baik untuk mengontrol penulisan adalah Anda perlu mencabut opsi yang memungkinkan penulisan (yaitu menyisipkan, membuat, dll.) Untuk pengguna yang bersangkutan yang seharusnya hanya melakukan membaca pada slave.

Jeff
sumber
0

Hanya memberikan hak terkait replikasi kepada pengguna di slave. Anda masih memiliki masalah hak pengguna root, tetapi Anda dapat menghapus akses root jarak jauh ke server DB.

Craig
sumber