আপ অবচয় 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'
)