Berbagi teknologi

Deskripsi penelusuran server status sesi klien di MySQL

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Server MySQL mengimplementasikan beberapa pelacak status sesi. Klien dapat mengaktifkan pelacak ini untuk menerima pemberitahuan perubahan status sesi.

1 Tujuan Pelacak Status Sesi

Pelacak status sesi memiliki tujuan berikut:

  • untuk memfasilitasi migrasi sesi.
  • Memfasilitasi peralihan transaksi.

Mekanisme pelacak menyediakan cara bagi konektor MySQL dan aplikasi klien untuk menentukan apakah konteks sesi tersedia untuk memungkinkan migrasi sesi dari satu server ke server lainnya. (Untuk mengubah sesi dalam lingkungan dengan beban seimbang, penting untuk mendeteksi apakah ada status sesi yang perlu diperhitungkan saat memutuskan apakah peralihan dapat dilakukan.)

Mekanisme pelacak memungkinkan aplikasi mengetahui kapan transaksi dapat dipindahkan dari satu sesi ke sesi lainnya. Pelacakan status transaksi memungkinkan hal ini, yang berguna untuk aplikasi yang ingin memindahkan transaksi dari server yang sibuk ke server yang lebih sedikit muatannya. Misalnya, konektor penyeimbang beban yang mengelola kumpulan koneksi klien dapat memindahkan transaksi antar sesi yang tersedia di kumpulan tersebut.

Namun, peralihan sesi tidak dapat terjadi kapan pun. Jika sesi berada di tengah-tengah transaksi yang telah menyelesaikan baca atau tulis, beralih ke sesi lain berarti transaksi pada sesi asli dibatalkan. Peralihan sesi hanya dapat terjadi ketika tidak ada operasi baca atau tulis yang dilakukan dalam transaksi.

Contoh transaksi yang mungkin berubah secara wajar:

Selain memahami status transaksi, Anda juga dapat memahami karakteristik transaksi sehingga Anda dapat menggunakan karakteristik yang sama ketika transaksi dipindahkan ke sesi berbeda. Ciri-ciri berikut ini terkait dengan hal ini:

  1. READ ONLY
  2. READ WRITE
  3. ISOLATION LEVEL
  4. WITH CONSISTENT SNAPSHOT

2 Pelacak status sesi yang tersedia

Untuk mendukung aktivitas pelacakan sesi, notifikasi dapat diberikan untuk jenis informasi status sesi klien berikut:

(1) Perubahan pada properti status sesi klien berikut:

  • Skema default (database).
  • Nilai khusus sesi untuk variabel sistem.
  • Variabel yang ditentukan pengguna.
  • Bentuk sementara.
  • Pidato yang sudah disiapkan.

Variabel sistem session_track_state_change mengontrol pelacak ini.

(2) Ubah ke nama skema default. Variabel sistem session_track_schema mengontrol pelacak ini.

(3) Ubah nilai sesi variabel sistem. Variabel sistem session_track_system_variables mengontrol pelacak ini. Izin SENSITIVE_VARIABLES_OBSERVER diperlukan untuk melacak perubahan nilai variabel sistem sensitif.

(4) GTID yang tersedia. Variabel sistem session_track_gtids mengontrol pelacak ini.

(5) Informasi mengenai status dan karakteristik transaksi. Variabel sistem session_track_transaction_info mengontrol pelacak ini.

Variabel sistem ini memungkinkan kontrol atas pemberitahuan perubahan mana yang terjadi, namun tidak menyediakan cara untuk mengakses informasi pemberitahuan. Pemberitahuan terjadi dalam protokol klien/server MySQL, yang mencakup informasi pelacak dalam paket OK untuk mendeteksi perubahan status sesi.

Dukungan pelacak status sesi 3 C API

Untuk memungkinkan aplikasi klien mengekstrak informasi perubahan status dari paket OK yang dikembalikan oleh server, MySQL C API menyediakan sepasang fungsi:

  • mysql_session_track_get_first() mendapat bagian pertama dari informasi perubahan status yang diterima dari server.
  • mysql_session_track_get_next() mendapatkan informasi perubahan status yang tersisa yang diterima dari server. Setelah panggilan ke mysql_session_track_get_first() berhasil, fungsi ini dipanggil berulang kali selama berhasil.

4 dukungan pelacak status sesi suite pengujian

Program mysqltest memiliki perintahdisable_session_track_info danenable_sessionutrack_ininfo untuk mengontrol apakah pemberitahuan pelacak sesi terjadi. Anda dapat menggunakan perintah ini untuk melihat notifikasi yang dihasilkan oleh pernyataan SQL dari baris perintah. Misalkan file testscript berisi skrip mysqltest berikut:

  1. DROP TABLE IF EXISTS test.t1;
  2. CREATE TABLE test.t1 (i INT, f FLOAT);
  3. --enable_session_track_info
  4. SET @@SESSION.session_track_schema=ON;
  5. SET @@SESSION.session_track_system_variables='*';
  6. SET @@SESSION.session_track_state_change=ON;
  7. USE information_schema;
  8. SET NAMES 'utf8mb4';
  9. SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
  10. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  11. SET TRANSACTION READ WRITE;
  12. START TRANSACTION;
  13. SELECT 1;
  14. INSERT INTO test.t1 () VALUES();
  15. INSERT INTO test.t1 () VALUES(1, RAND());
  16. COMMIT;

Jalankan skrip sebagai berikut untuk melihat informasi yang disediakan oleh pelacak yang diaktifkan. .

  1. $> mysqltest < testscript
  2. DROP TABLE IF EXISTS test.t1;
  3. CREATE TABLE test.t1 (i INT, f FLOAT);
  4. SET @@SESSION.session_track_schema=ON;
  5. SET @@SESSION.session_track_system_variables='*';
  6. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  7. -- session_track_system_variables
  8. -- *
  9. SET @@SESSION.session_track_state_change=ON;
  10. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  11. -- session_track_state_change
  12. -- ON
  13. USE information_schema;
  14. -- Tracker : SESSION_TRACK_SCHEMA
  15. -- information_schema
  16. -- Tracker : SESSION_TRACK_STATE_CHANGE
  17. -- 1
  18. SET NAMES 'utf8mb4';
  19. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  20. -- character_set_client
  21. -- utf8mb4
  22. -- character_set_connection
  23. -- utf8mb4
  24. -- character_set_results
  25. -- utf8mb4
  26. -- Tracker : SESSION_TRACK_STATE_CHANGE
  27. -- 1
  28. SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
  29. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  30. -- session_track_transaction_info
  31. -- CHARACTERISTICS
  32. -- Tracker : SESSION_TRACK_STATE_CHANGE
  33. -- 1
  34. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  35. --
  36. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  37. -- ________
  38. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  39. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  40. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  41. SET TRANSACTION READ WRITE;
  42. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  43. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION READ WRITE;
  44. START TRANSACTION;
  45. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  46. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION READ WRITE;
  47. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  48. -- T_______
  49. SELECT 1;
  50. 1
  51. 1
  52. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  53. -- T_____S_
  54. INSERT INTO test.t1 () VALUES();
  55. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  56. -- T___W_S_
  57. INSERT INTO test.t1 () VALUES(1, RAND());
  58. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  59. -- T___WsS_
  60. COMMIT;
  61. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  62. --
  63. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  64. -- ________
  65. ok

Sebelum pernyataan START TRANSACTION, jalankan dua pernyataan SET TRANSACTION untuk mengatur tingkat isolasi dan karakteristik mode akses untuk transaksi berikutnya. Nilai SESSION_TRACK_TRANSACTION_CHARACTERISTICS menunjukkan nilai transaksi selanjutnya yang telah ditetapkan.

Setelah pernyataan COMMIT yang mengakhiri transaksi, nilai SESSION_TRACK_transaction_CHARACTERISTICS dilaporkan sebagai kosong. Ini berarti properti transaksi berikutnya yang ditetapkan sebelum transaksi dimulai telah diatur ulang dan default sesi diterapkan. Untuk melacak perubahan pada default sesi ini, lacak nilai sesi variabel sistem Transaction_inisolation dan Transaction_read_only.

Untuk melihat informasi tentang GTID, aktifkan pelacak SESSION_TRACK_GTIDs menggunakan variabel sistem SESSION_TRACK_GTIDs.