Mengapa sid diperlukan di 'KILL SESSION' (Oracle SQL)?

Saya punya pertanyaan ujian dan tidak dapat menemukan jawabannya. Mengapa sid wajib diperlukan untuk menjalankan perintah KILL SESSION?
KILL SESSION sintaksis: ALTER SYSTEM KILL SESSION 'sid,session#[@inst_id]' [IMMEDIATE];
Dimana sid adalah pengidentifikasi sesi 'unik'. Unik dalam tanda kutip karena unik pada momen saat ini, server Oracle dapat memiliki, misalnya, sesi beberapa sid, namun setelah sesi ini selesai, sid ini dapat digunakan untuk sesi lainnya. Sid adalah analogi pid di OS.
Sesi# adalah nomor sesi seri; itu adalah penghitung sesi. Server menghapus penghitung saat startup DB. Jadi, session# benar-benar pengidentifikasi unik untuk sesi.

Saya tidak mengerti mengapa sid wajib untuk perintah KILL SESSION. Menurut saya, session# saja dapat digunakan.

Terima kasih.


person Jury    schedule 19.05.2012    source sumber
comment
Saya selalu menggunakan SERIAL# daripada SESSION#. yaitu ALTER SYSTEM KILL SESSION 'sid,serial#'; seperti yang diturunkan dari V$SESSION   -  person Glenn    schedule 19.05.2012
comment
Ya, @inst_id bersifat opsional dan hanya digunakan di server RAC. IMMEDIATE juga opsional; itu digunakan untuk sesi mematikan dengan baik. Saya tidak mengerti mengapa sid wajib?   -  person Jury    schedule 19.05.2012


Jawaban (3)


Anda memerlukan SID dan SERIAL#. referensi Oracle menyatakan hal ini :

SID Pengidentifikasi sesi

SERIAL# Nomor seri sesi. Digunakan untuk mengidentifikasi objek sesi secara unik. Menjamin bahwa perintah tingkat sesi diterapkan ke objek sesi yang benar jika sesi berakhir dan sesi lain dimulai dengan ID sesi yang sama

Jadi meskipun SID unik, SID dapat digunakan kembali. Jadi saya kira penambahan SERIAL# akan memastikan Anda tidak mematikan sesi yang baru terhubung yang kebetulan menggunakan SID yang sama dengan apa yang Anda coba bunuh (jika sesi tersebut sudah terputus sebelum Anda menjalankan perintah).

UPDATE sebagai tanggapan atas komentar Juri:

Saya tidak bisa mengatakan mengapa ini diterapkan seperti ini, hanya pemahaman saya tentang implementasi sesuai dokumentasi: SID dapat digunakan kembali, SERIAL# dalam SID tidak. Jadi, sebagai contoh:

  • [1,1] JOE terhubung dan diberi SID 1, SERIAL# 1
  • JOE terputus
  • [1,2] TOM terhubung dan diberi SID 1 (digunakan kembali), tetapi SERIAL# bertambah menjadi 2
  • [2,1] SUSAN terhubung dan diberi SID 2, SERIAL#1

Mengapa penerapan ini? Mungkin menjaga ukuran numerik tetap terkendali? Minimalkan perselisihan? Penggunaan kembali sumber daya yang sudah dialokasikan (diwakili oleh SID)? Aku tidak tahu.

person Glenn    schedule 19.05.2012
comment
aku sudah mengetahuinya. Kamu benar. Serial# lebih unik dari sid. Seunik sid tidak diperlukan untuk mengidentifikasi sesi....tetapi diperlukan untuk KILL SESSION. Mengapa? - person Jury; 19.05.2012
comment
@Jury Bisakah Anda menautkan ke beberapa dokumentasi Oracle yang menunjukkan bahwa SERIAL# unik di semua SID? - person Glenn; 19.05.2012
comment
Pertanyaan bagus...karena saya sudah mendengarnya dari guru :) Saya menemukan Setelah 2.000.000.000 (2 miliar) login -- nomor tersebut akan digunakan kembali - person Jury; 20.05.2012
comment
Jadi, setelah 2^31 - 1 login, sesi# akan mendapatkan nilai awal (0 atau 1). Jika benar, pasangan sid,session# nampaknya benar-benar unik. Menarik... - person Jury; 20.05.2012

Aku menemukannya! Urutan untuk serial# bersifat siklik. Nomor akan digunakan kembali setelah 2 miliar login jika int digunakan, atau setelah 32k jika short digunakan. Jadi, menggunakan serial# tanpa hal lain tidak memberikan enumerasi yang benar-benar unik.
Namun sid saat ini unik. Jadi, pasangan sid,serial# sangat unik.
Anda tidak dapat menggunakan serial# atau sid untuk mengelola sesi, Anda harus menggunakannya secara berpasangan.

Terima kasih atas waktu Anda!

person Jury    schedule 20.05.2012

Saya tahu ini adalah topik lama, tetapi saya ingin menunjukkan bahwa serial# dengan sendirinya bahkan tidak mendekati pengidentifikasi unik, bahkan pada titik waktu tertentu.

SQL> select serial#, count(*) from v$session group by serial#;

   SERIAL#   COUNT(*)
---------- ----------
         1         15
       983          1
         2          1
       505          1
         5          2
      7076          1
         7          2
        58          1
         3          3
         9          1
     22160          1

11 rows selected.

Dari 29 sesi yang saya miliki di database saya saat ini, hanya ada 11 serial# yang berbeda.

EDIT: Dan ini adalah database contoh tunggal. Dalam lingkungan RAC, Anda perlu memasukkan ID instance untuk mendapatkan sesi yang benar-benar unik, dari apa yang saya pahami (saya pribadi belum pernah bekerja dengan database RAC).

person BimmerM3    schedule 27.06.2013