আপ অবচয় sqlserver.read_only_route_completeএক্সটেন্ডেড ইভেন্ট কিন এবং রেমাস উল্লেখ, এটি একটি চমৎকার ডিবাগ ঘটনা, কিন্তু তা সঙ্গে তথ্য একটি মহান চুক্তি বহন করে না - শুধু route_port(যেমন 1433) এবং route_server_name(যেমন sqlserver-0.contoso.com) ডিফল্টভাবে । এটি কেবলমাত্র কেবল পঠনযোগ্য অভিপ্রায় সংযোগটি সফল হয়েছিল তা নির্ধারণে সহায়তা করবে। একটি read_only_route_failইভেন্ট আছে তবে আমি এটিতে আগুন লাগাতে পারিনি, রাউটিং ইউআরএল নিয়ে যদি কোনও সমস্যা ছিল, তখন গৌণ উদাহরণটি অনুপলব্ধ / শাটডাউনটি যতদূর আমি বলতে পারব, তখন এটি আগুন লাগবে না।
sqlserver.loginএটিকে কাজে লাগানোর জন্য কিছু ক্রিয়াকলাপ (যেমন sqlserver.username) এর পাশাপাশি ইভেন্ট এবং কার্যকারিতা ট্র্যাকিং সক্ষম করার সাথে আমার এতে যোগ দেওয়ার কিছুটা সাফল্য ছিল ।
ধাপ পুনর্গঠন কর
প্রাসঙ্গিক ইভেন্টগুলি ট্র্যাক করতে বর্ধিত কার্য ক্রিয়াকলাপ এবং কার্যকারিতা ট্র্যাক করতে একটি বর্ধিত ইভেন্টস সেশন তৈরি করুন:
CREATE EVENT SESSION [xe_watchLoginIntent] ON SERVER
ADD EVENT sqlserver.login
( ACTION ( sqlserver.username ) ),
ADD EVENT sqlserver.read_only_route_complete
( ACTION (
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.username
) ),
ADD EVENT sqlserver.read_only_route_fail
( ACTION (
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.username
) )
ADD TARGET package0.event_file( SET filename = N'xe_watchLoginIntent' )
WITH (
MAX_MEMORY = 4096 KB,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 30 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = ON, --<-- relate events
STARTUP_STATE = ON --<-- ensure sessions starts after failover
)
এক্সই অধিবেশন চালান (এটি একটি ডিবাগ ইভেন্ট হিসাবে নমুনা বিবেচনা করুন) এবং কিছু লগইন সংগ্রহ করুন:

এখানে নোট করুন স্কেলসার্ভার -0 হ'ল আমার পঠনযোগ্য মাধ্যমিক এবং স্ক্যালসারভার -১ প্রাথমিক। এখানে আমি কেবল-পঠনযোগ্য অ্যাপ্লিকেশন অভিপ্রায় লগইন এবং কিছু এসকিউএল লগইন অনুকরণ করতে -Kস্যুইচ ব্যবহার করছি sqlcmd। কেবলমাত্র পঠনযোগ্য ইভেন্টটি সফলভাবে পঠনযোগ্য উদ্দেশ্য লগইনে আগুন ধরে।
অধিবেশন বিরতি বা থামানোর সময় আমি এটি জিজ্ঞাসা করতে পারি এবং দুটি ইভেন্টের লিঙ্ক করার চেষ্টা করতে পারি, যেমন:
DROP TABLE IF EXISTS #tmp
SELECT IDENTITY( INT, 1, 1 ) rowId, file_offset, CAST( event_data AS XML ) AS event_data
INTO #tmp
FROM sys.fn_xe_file_target_read_file( 'xe_watchLoginIntent*.xel', NULL, NULL, NULL )
ALTER TABLE #tmp ADD PRIMARY KEY ( rowId );
CREATE PRIMARY XML INDEX _pxmlidx_tmp ON #tmp ( event_data );
-- Pair up the login and read_only_route_complete events via xxx
DROP TABLE IF EXISTS #users
SELECT
rowId,
event_data.value('(event/@timestamp)[1]', 'DATETIME2' ) AS [timestamp],
event_data.value('(event/action[@name="username"]/value/text())[1]', 'VARCHAR(100)' ) AS username,
event_data.value('(event/action[@name="attach_activity_id_xfer"]/value/text())[1]', 'VARCHAR(100)' ) AS attach_activity_id_xfer,
event_data.value('(event/action[@name="attach_activity_id"]/value/text())[1]', 'VARCHAR(100)' ) AS attach_activity_id
INTO #users
FROM #tmp l
WHERE l.event_data.exist('event[@name="login"]') = 1
AND l.event_data.exist('(event/action[@name="username"]/value/text())[. = "SqlUserShouldBeReadOnly"]') = 1
DROP TABLE IF EXISTS #readonly
SELECT *,
event_data.value('(event/@timestamp)[1]', 'DATETIME2' ) AS [timestamp],
event_data.value('(event/data[@name="route_port"]/value/text())[1]', 'INT' ) AS route_port,
event_data.value('(event/data[@name="route_server_name"]/value/text())[1]', 'VARCHAR(100)' ) AS route_server_name,
event_data.value('(event/action[@name="username"]/value/text())[1]', 'VARCHAR(100)' ) AS username,
event_data.value('(event/action[@name="client_app_name"]/value/text())[1]', 'VARCHAR(100)' ) AS client_app_name,
event_data.value('(event/action[@name="attach_activity_id_xfer"]/value/text())[1]', 'VARCHAR(100)' ) AS attach_activity_id_xfer,
event_data.value('(event/action[@name="attach_activity_id"]/value/text())[1]', 'VARCHAR(100)' ) AS attach_activity_id
INTO #readonly
FROM #tmp
WHERE event_data.exist('event[@name="read_only_route_complete"]') = 1
SELECT *
FROM #users u
LEFT JOIN #readonly r ON u.attach_activity_id_xfer = r.attach_activity_id_xfer
SELECT u.username, COUNT(*) AS logins, COUNT( DISTINCT r.rowId ) AS records
FROM #users u
LEFT JOIN #readonly r ON u.attach_activity_id_xfer = r.attach_activity_id_xfer
GROUP BY u.username
কোয়েরিতে অ্যাপ্লিকেশন কেবল পঠনযোগ্য অভিপ্রায় ছাড়াই এবং লগইনগুলি প্রদর্শন করা উচিত:

read_only_route_completeএকটি ডিবাগ ইভেন্ট তাই অল্প পরিমাণে ব্যবহার করুন। উদাহরণস্বরূপ নমুনা বিবেচনা করুন।
- দুটি ইভেন্ট ট্র্যাক কার্যকারিতা সহ একসাথে আপনার প্রয়োজনীয়তা পূরণের সম্ভাবনা সরবরাহ করে - এই সাধারণ অনালিকা সম্পর্কে আরও পরীক্ষার প্রয়োজন
- আমি লক্ষ্য করেছি যে সংযোগে ডাটাবেসের নাম নির্দিষ্ট না করা থাকলে, জিনিসগুলি কাজ করে বলে মনে হচ্ছে না
আমি pair_matchingকাজ করার লক্ষ্য অর্জনের চেষ্টা করেছি কিন্তু সময়ের বাইরে গিয়েছি । এখানে উন্নয়নের কিছু সম্ভাবনা রয়েছে, এরকম কিছু:
ALTER EVENT SESSION [xe_watchLoginIntent] ON SERVER
ADD TARGET package0.pair_matching (
SET begin_event = N'sqlserver.login',
begin_matching_actions = N'sqlserver.username',
end_event = N'sqlserver.read_only_route_complete',
end_matching_actions = N'sqlserver.username'
)