এমএস এসকিউএল সার্ভারে একটি বিশৃঙ্খলা প্রতিলিপি কীভাবে ঠিক করবেন


11

আমি একটি ব্যাকআপ থেকে একটি ডাটাবেস পুনরুদ্ধার। ডাটাবেসটি অন্য একটি সার্ভারে প্রকাশ করতে প্রতিলিপি ব্যবহার করে। ডাটাবেসটি পুনরুদ্ধার করে প্রতিলিপিটি ভাঙ্গবে বলে ধরে নিয়েছি, আমি অনুলিপিটি মুছে ফেলার চেষ্টা করেছি এবং এটি পুনরায় তৈরি করার চেষ্টা করেছি (এটি স্ক্র্যাচ থেকে পুনরায় তৈরি করার জন্য আমাদের কাছে একটি স্ক্রিপ্ট রয়েছে)। আমি ঠিক কী করেছি তা নিশ্চিত নই, তবে এখন এটি সম্পূর্ণ জগাখিচু অবস্থায় রয়েছে এবং আমি এটি ঠিক করতে পারছি না।

প্রথমত, আমি সাবস্ক্রিপশনটি (প্রকাশক সার্ভারে) ছাড়ানোর চেষ্টা করি:

EXEC sp_dropsubscription @publication = 'PublicationName', @article = N'all', @subscriber = 'SubscriberServerName'

এটি কাজ করে বলে মনে হচ্ছে। SELECT * FROM syssubscriptionsকোনও ফলাফল দেখায় না। সাবস্ক্রাইবার সার্ভারটি দেখে এসএসএমএস> {সাবস্ক্রাইবার সার্ভার Rep> প্রতিলিপি> স্থানীয় সাবস্ক্রিপশন - সাবস্ক্রিপশনটি নেই।

তাই আমি প্রকাশটি মুছে ফেলার চেষ্টা করি। এসএসএমএস> {সার্ভার}> প্রতিলিপি> স্থানীয় প্রকাশনা> {প্রকাশনা নাম N> মুছুন। এটি নিম্নলিখিত ত্রুটি বার্তা দেয়:

Could not delete publication 'PublicationName'.
Could not drop article. A subscription exists on it.
Changed database context to 'DatabaseName'. (Microsoft SQL Server, Error: 14046)

ঠিক আছে, তাই আমি নিবন্ধগুলি ফেলে দেওয়ার চেষ্টা করি:

EXEC sp_droparticle @publication = 'PublicationName', @article = N'all'

এবং এই ত্রুটিটি পান:

Invalidated the existing snapshot of the publication. Run the Snapshot Agent again to generate a new snapshot.
Msg 14046, Level 16, State 1, Procedure sp_MSdrop_article, Line 75
Could not drop article. A subscription exists on it.

ঠিক আছে, তাই আমি স্ন্যাপশট এজেন্ট শুরু করার চেষ্টা করব এবং আমি এই অভ্যন্তরীণ এসকিউএল ব্যতিক্রম পাই:

The SQL command 'sp_MSactivate_auto_sub' had returned fewer rows than expected by the replication agent.

সুতরাং আমি নিবন্ধটি মোছার বিকল্প পদ্ধতির চেষ্টা করেছি DELETE FROM sysarticles,। এটি কার্যকর হয়েছে বলে মনে হয় - আমি এখন নিবন্ধগুলি থেকে মুক্তি পেয়েছি তবে আমি এখনও একই 'প্রকাশনাটি ফেলে দিতে পারি না কারণ এই প্রকাশনাটির জন্য কমপক্ষে একটি সাবস্ক্রিপশন উপস্থিত রয়েছে' ত্রুটি যখন আমি প্রকাশটি মোছার চেষ্টা করি তখন error

আমি এসকিউএল সার্ভারটিও পুনরায় চালু করেছি - সাহায্য করে নি।

আমি জানি না যে এখানে কী চলছে এবং আমি কীভাবে এটি ঠিক করব?

বিটিডব্লিউ এমন হয় যখন আপনি কোনও সফ্টওয়্যার বিকাশকারীকে দেন যিনি ডাটাবেসের কী কী বিপজ্জনক হতে পারে তা যথেষ্ট জানেন। ভাগ্যক্রমে, এটি কোনও উত্পাদন পরিবেশ নয় ...

উত্তর:


10

TLDR:

দেখা যাচ্ছে যে প্রতিলিপি অক্ষম করা এবং পুনরায় সক্ষম করা সম্ভবত সমস্যাটি স্থির করেছে:

exec sp_replicationdboption @dbname = N'DatabaseName', @optname = N'publish', @value = N'false'
exec sp_replicationdboption @dbname = N'DatabaseName', @optname = N'publish', @value = N'true'

আমি অনুমান করি এটি এটি বন্ধ করার সমতুল্য এবং তারপরে আবার ফিরে ...

দীর্ঘ সংস্করণ:

সহকর্মী এটি ঠিক করার চেষ্টা করতে গিয়েছিল। সে কয়েকটি জিনিস চেষ্টা করেও খুব একটা পায়নি। হাল ছেড়ে দেওয়ার আগে তিনি যে একটি পরিবর্তন করেছিলেন তা হ'ল প্রতিলিপিটি অক্ষম করা।

আমি তখন কোডির পরামর্শটি চেষ্টা করেছিলাম । স্প_ড্রপস সাবস্ক্রিপশন কমান্ড অভিযোগ করেছে যে কোনও সাবস্ক্রিপশন নেই। সুতরাং আমি স্প_ড্রোপাব্লিকেশন কমান্ড চেষ্টা করেছিলাম। এটি অভিযোগ করেছে যে ডাটাবেসে প্রতিলিপি সক্ষম করা হয়নি। সুতরাং আমি এটি সক্ষম করেছি এবং কমান্ডটি পুনরায় চালিত করেছি। এবার এটি অভিযোগ করে যে প্রকাশনাটির অস্তিত্ব নেই। আমি এসএসএমএসে স্থানীয় প্রকাশনা নোডকে রিফ্রেশ করেছি এবং নিশ্চিত হয়ে গেছে যে এটি যথেষ্ট পরিমাণে গেছে। আমি প্রতিলিপি সেট আপ স্ক্রিপ্ট চালিয়েছি, একটি নতুন স্ন্যাপশট উত্পন্ন এবং প্রতিটি জিনিস এখন সঠিকভাবে কাজ করছে। আনন্দ!

আমি ১০০% নিশ্চিত নই যে প্রতিলিপিটি নিষ্ক্রিয় করা এবং সক্ষম করা আসলে সমস্যাটি স্থির করেছে, তবে প্রতিলিপিটি যদি গণ্ডগোলিত হয় তবে তা অবশ্যই চেষ্টা করার মতো।


Newbies জন্য দুর্দান্ত পড়া। ডেটাবেস পুনরুদ্ধার করার আগে আপনার প্রতিলিপিটি প্রথমে অক্ষম করা উচিত তা কি নিরাপদ?
কীথ রিভেরা

আমি অবশ্যই পরের বার চেষ্টা করে যাচ্ছি - যা আমি প্রতিলিপিটি পড়েছি তা থেকে সম্পূর্ণরূপে উড়িয়ে দেওয়া এবং পুনরায় তৈরি করা উচিত নয় (যেমন আমি প্রথমে ভেবেছিলাম এটি হবে)। প্রতিলিপি অক্ষম করুন, ডাটাবেস পুনরুদ্ধার করুন, প্রতিলিপি সক্ষম করুন, একটি নতুন স্ন্যাপশট টিপুন। যতক্ষণ নিবন্ধগুলি বৈধ, ততক্ষণ ভাল হওয়া উচিত। যাইহোক চেষ্টা করার জন্য মূল্যবান ...
টালগ্যুই

মোট প্রতিলিপি এখানে নবাগত, কিন্তু টিএলডিআর অনুসরণ করে; নির্দেশাবলী এসএসএমএস থেকে আমার প্রকাশনাগুলি অন্তর্ধানের দিকে পরিচালিত করেছে। অনুসন্ধান MSPublicationsমধ্যে distributionডাটাবেসের জানায় যে প্রকাশনার প্রকৃতপক্ষে সর্বস্বান্ত হয়। এটি কি প্রত্যাশিত?
পিম্বারউবার্স

5

আমি প্রতিলিপি একটি গোলযোগ ছিল এবং এটি দিয়ে এটি সমাধান

DECLARE @subscriptionDB AS sysname
SET @subscriptionDB = N'DBName'

-- Remove replication objects from a subscription database (if necessary).
USE master
EXEC sp_removedbreplication @subscriptionDB
GO 

যে এবং:

exec sp_cleanupdbreplication

বিশৃঙ্খলাযুক্ত প্রতিলিপিগুলি পরিষ্কার করার সময় উদ্ধারকারীরা কি।


1
আমি বিশ্বাস করি যে আপনার পোষ্টটি আমাকে আমার পরীক্ষার পরিবেশ পুনরায় সেট আপ করা থেকে বাঁচিয়েছে। উপরের কোন আদেশটি এটি করেছে তা নিশ্চিত নয় তবে আমি এখন সূচকগুলি প্রতিরূপের জন্য প্রকাশিত হওয়ার বিষয়ে ত্রুটি ছাড়াই মুছে ফেলতে পারি। আপনাকে অনেক ধন্যবাদ।
এমএইচএসকিউএলডিবিএ

2

ডাটাবেস পুনরুদ্ধার করা প্রতিলিপি ভাঙ্গবে, তাই সাধারণ। এছাড়াও অন্যান্য ত্রুটি বার্তাগুলির বেশিরভাগই কেবল অনুসরণ করুন কারণ আপনি সমস্ত সাবস্ক্রিপশন মুছে ফেলতে পারবেন না (বা কমপক্ষে এসকিউএল এটি মনে করে)।

আপনি জানেন যে আপনার প্রকাশক (উত্স ডাটাবেস), এবং কমপক্ষে একজন গ্রাহক (গন্তব্য ডাটাবেস) এবং এটি দুটি পৃথক সার্ভার। আমি কেবল উল্লেখ করতে চাই যে এখানে একটি পরিবেশকও রয়েছে যা এই সার্ভার বা অন্য কোনও একটিতে রয়েছে এবং সম্ভবত বিতরণ নামক একটি ডাটাবেসে রয়েছে। কখনও কখনও এটিতে কিছু দরকারী তথ্য থাকে এবং কখনও কখনও জিনিসগুলি পড়ে যায় কারণ তিনজনের মধ্যে তথ্যের সাথে মেলে না।

যাইহোক, আপনি যখন গ্রাহকদের চেক করেছেন, তখন কি আপনি প্রকাশক সার্ভারে section বিভাগটি পরীক্ষা করে দেখেছেন যে অন্য কিছু তালিকাভুক্ত ছিল না তা নিশ্চিত করে? আপনি যদি কিছু খুঁজে পান তবে আপনি নিজেই এটি মুছে ফেলার চেষ্টা করতে পারেন:

exec sp_dropsubscription @publication = N'xxx', @subscriber = N'xxx', @destination_db = N'xxx', @article = N'all'
-- And if that doesn't work
exec sp_dropsubscription @publication = N'xxx', @subscriber = N'xxx', @destination_db = N'xxx', @article = N'all', @Ignore_Distributor = 1

তবে ধরে নিবেন যে তারা সত্যিই সমস্ত চলে গেছে, এটি প্রকাশক ডাটাবেসে চেষ্টা করে দেখুন:

exec sp_droppublication @publication = N'xxx'
-- And if that doesn't work
exec sp_droppublication @publication = N'xxx', @Ignore_Distributor = 1

এটি কীভাবে চলুন তা আমাদের জানান। প্রতিস্থাপনের যখন এটি এই অবস্থায় আসে তখন আমাকে এবং অন্যান্য ভাল ডিবিএকে বিভ্রান্ত করে কিছুতেই বিকাশকারী হওয়ার সাথে কিছুই করতে হয় না :-)


পরামর্শের জন্য ধন্যবাদ. স্প_ড্রপস সাবস্ক্রিপশন কমান্ড অভিযোগ করেছে যে কোনও সাবস্ক্রিপশন নেই। স্প_ড্রোপব্লিকেশন কমান্ড অভিযোগ করেছে যে প্রতিলিপি সক্ষম করা হয়নি - যা আমাকে সমাধান হিসাবে উপস্থিত হতে দেখায়।
টালগুই

আমার জন্য, sp_removedbreplication কমান্ড বেশিরভাগ সময় কাজ করেছিল যখনই আমাকে জোর করে প্রতিলিপিটি মুছে ফেলতে হয়েছিল।
এসকিউএলপিআরডিডিবিএ

0

আমি একমাত্র উপায়ে প্রতিলিপি নিদর্শনগুলি থেকে মুক্তি পেতে সক্ষম হয়েছি সাবস্ক্রিপশন, নিবন্ধগুলি, প্রকাশনাগুলি বাদ দেওয়া। যদি এখনও ফ্যান্টম সাবস্ক্রিপশন থাকে তবে ফ্যান্টম গ্রাহক সহ প্রকাশনার পুনরায় তৈরি করুন। এটি বিশেষত পুরানো সংস্করণগুলির সাথে কাজ করে বলে মনে হচ্ছে।


0

আমার যখন কোনও প্রকাশনা জড়িত হয় তখন আমি সাধারণত এটি করি।

এটি কিছুটা কুরুচিপূর্ণ তবে এটি বিভিন্ন পরিবেশে আমার জন্য অনেক সময় কাজ করেছে। এর কারণ কী? যে কখনও কখনও এটা চিন্তা করা কঠিন, সেরা মাঝে মাঝে গোড়া থেকে শুরু করার জন্য, কিন্তু এমনকি আপনি পরিষ্কার করা প্রয়োজন যে জন্য বর্তমান প্রকাশন যে ত্রুটিপূর্ণ থেকে।allresiduals

এটি কেবল প্রসঙ্গে রাখার জন্য:

এটি আমি প্রতিলিপি মনিটর থেকে দেখছি:

এখানে চিত্র বর্ণনা লিখুন

এবং যখন আমি টি-এসকিউএল ব্যবহার করে আমার নিজস্ব প্রতিলিপি মনিটর ব্যবহার করি :

DECLARE @cmd NVARCHAR(max)
DECLARE @publisher SYSNAME, @publisher_db SYSNAME, @publication SYSNAME, @pubtype INT
DECLARE @subscriber SYSNAME, @subscriber_db SYSNAME, @subtype INT
DECLARE @cmdcount INT, @processtime INT
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @JobName SYSNAME
DECLARE @minutes INT, @threshold INT, @maxCommands INT, @mail CHAR(1) = 'N'
SET @minutes = 60 --> Define how many minutes latency before you would like to be notified
SET @maxCommands = 80000  --->  change this to represent the max number of outstanding commands to be proceduresed before notification
SET @threshold = @minutes * 60

IF OBJECT_ID ('TEMPDB..#Replication_Qu_History')  IS NOT NULL
   DROP TABLE #Replication_Qu_History

IF OBJECT_ID ('TEMPDB..##PublicationInfo')  IS NOT NULL
   DROP TABLE  ##PublicationInfo

IF OBJECT_ID ('TEMPDB..#PublisherInfo')  IS NOT NULL
   DROP TABLE  #PublisherInfo

IF OBJECT_ID ('TEMPDB..##SubscriptionInfo')  IS NOT NULL
   DROP TABLE  ##SubscriptionInfo

SELECT * INTO #PublisherInfo
FROM OPENROWSET('SQLOLEDB', 'SERVER=(LOCAL);TRUSTED_CONNECTION=YES;'
, 'SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelppublisher')

SELECT @publisher = publisher FROM #PublisherInfo     

SET @cmd = 'SELECT * INTO ##PublicationInfo FROM OPENROWSET(''SQLOLEDB'',''SERVER=(LOCAL);TRUSTED_CONNECTION=YES''
,''SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelppublication @publisher='
+ @publisher + ''')'
--select @cmd
EXEC sp_executesql @cmd

SELECT @publisher_db=publisher_db, @publication=publication, @pubtype=publication_type  FROM ##PublicationInfo

SET @cmd = 'SELECT * INTO ##SubscriptionInfo FROM OPENROWSET(''SQLOLEDB'',''SERVER=(LOCAL);TRUSTED_CONNECTION=YES''
,''SET FMTONLY OFF EXEC distribution.dbo.sp_replmonitorhelpsubscription @publisher='
+ @publisher + ',@publication_type=' + CONVERT(CHAR(1),@pubtype) + ''')'
--select @cmd
EXEC sp_executesql @cmd


ALTER TABLE ##SubscriptionInfo
ADD  PendingCmdCount INT NULL,
EstimatedProcessTime INT NULL


SELECT *
FROM #PublisherInfo

SELECT *
FROM ##SubscriptionInfo 

SELECT *
FROM ##PublicationInfo 

আপনি নীচের শেষ বাক্সে 2 টি লাইন দেখতে পারেন - এবং একটিতে সেগুলি থাকা উচিত নয়:

এখানে চিত্র বর্ণনা লিখুন

আমি এই স্ক্রিপ্টটি ব্যবহার করার সময় একই:

EXEC distribution.dbo.sp_replmonitorhelppublication @publisher='my publisher'

এখানে চিত্র বর্ণনা লিখুন

প্রথমে আপনি উপরের অন্যান্য উত্তরে যা দেখানো হয়েছে তা করুন , যদি এটি কাজ করে , যে ভাল হয়, এটি কখনও কখনও কাজ করে, সমস্যা সমাধান হয়।

এটি এর চেয়ে কম হবে:

exec master.dbo.sp_replicationdboption @dbname = 'my_PUBLICATION', @optname = N'publish', @value = N'false'
exec master.dbo.sp_replicationdboption @dbname = 'my_PUBLICATION', @optname = N'publish', @value = N'true'

sp_droppublication @publication='my_PUBLICATION'

-- Remove replication objects from a subscription database (if necessary).
exec master.dbo.sp_removedbreplication 'my_PUBLICATION'

exec master.dbo.sp_removedbreplication 'my_PUBLICATION'

use my_PUBLICATION

sp_removedbreplication @type='both'


USE [master]
EXEC sp_replicationdboption 
  @dbname = N'my_PUBLICATION', 
  @optname = N'publish', 
  @value = N'false';
GO


EXEC distribution.dbo.sp_replmonitorhelppublication @publisher='PUBLISHER_SERVER'

sp_replmonitorhelppublisher @publisher='PUBLISHER_SERVER'

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
SET @publicationDB = N'my_PUBLICATION'; 
SET @publication = N'my_PUBLICATION'; 

-- Remove a transactional publication.
USE my_PUBLICATION
EXEC sp_droppublication @publication = @publication;

-- Remove replication objects from the database.
USE [master]
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish', 
  @value = N'false';
GO

এখন এই প্রকাশনার সম্পূর্ণরূপে মুক্তি পাওয়ার জন্য আমরা বাসক্রবার এবং তারপরে প্রকাশক এবং তারপরে নীচের স্ক্রিপ্ট অনুসারে বিতরণকারীর সংযোগ দিয়ে শুরু করব:

-- Connect Subscriber
:connect [SUBSCRIBER_SERVER]
use [master]
exec sp_helpreplicationdboption @dbname = N'SUBSCRIBER_DATABASE'
go
use [SUBSCRIBER_DATABASE]
exec sp_subscription_cleanup @publisher = N'PUBLISHER_SERVER', @publisher_db = N'my_PUBLICATION_DB', 
@publication = N'my_PUBLICATION'
go


-- Connect Publisher Server
:connect [PUBLISHER_SERVER]
-- Drop Subscription
use [my_PUBLICATION]
exec sp_dropsubscription @publication = N'my_PUBLICATION', @subscriber = N'all', 
@destination_db = N'SUBSCRIBER_DATABASE', @article = N'all'
go
-- Drop publication
exec sp_droppublication @publication = N'my_PUBLICATION'
-- Disable replication db option
exec sp_replicationdboption @dbname = N'my_PUBLICATION_db', @optname = N'publish', @value = N'false'
GO

-- Connect Distributor
:CONNECT [PUBLISHER_SERVER]
go

exec Distribution.dbo.sp_MSremove_published_jobs @server = 'PUBLISHER_SERVER', 
@database = N'my_PUBLICATION'
go

--===========================================================================================
--THAT DOES NOT GENERALLY GET RID OF THE JOBS FOR YOU
-- so you need to find them using these selects, and get rid of them manually yourself:

--select * from Distribution.dbo.MSpublications
--select * from Distribution.dbo.MSpublications
--===========================================================================================


select * from Distribution.[dbo].[MSlogreader_agents]
where publisher_db = N'my_PUBLICATION'

--found 1 job:
--PUBLISHER_SERVER-my_PUBLICATION-11

--script the job
--script the job delete script - and run that - keeping the job creation script just in case
exec msdb.dbo.sp_help_job @job_id=0x93C63D34E357704B818312B93FCA02FB
exec msdb.dbo.sp_delete_job @job_id=0x93C63D34E357704B818312B93FCA02FB



select * from Distribution.[dbo].[MSdistribution_agents]
where publisher_db = N'my_PUBLICATION'

--here found 2 jobs:

--PUBLISHER_SERVER-my_PUBLICATION-my_PUBLICATION--67
--PUBLISHER_SERVER-my_PUBLICATION-my_PUBLICATION--68


--here is the problem - it cannot find the jobs, the jobs are not even there anymore, one of those things
exec msdb.dbo.sp_delete_job @job_id=0x0F1564BAACD5464C988DE8957C25C411
exec msdb.dbo.sp_delete_job @job_id=0x6215C40F999CE248A30EE735E2C0E59D

--Msg 14262, Level 16, State 1, Procedure sp_verify_job_identifiers, Line 41 [Batch Start Line 52]
--The specified @job_id ('BA64150F-D5AC-4C46-988D-E8957C25C411') does not exist.


--Msg 14262, Level 16, State 1, Procedure sp_verify_job_identifiers, Line 41 [Batch Start Line 53]
--The specified @job_id ('0FC41562-9C99-48E2-A30E-E735E2C0E59D') does not exist.

exec msdb.dbo.sp_delete_job @job_name='PUBLISHER_SERVER-my_PUBLICATION-my_PUBLICATION'
PUBLISHER_SERVER-my_PUBLICATION-my_PUBLICATION--68

এই মুহুর্তে আপনি সাধারণত হিসাবে প্রকাশনা পুনরায় তৈরি করুন

তারপর স্ন্যাপশট চালানোর জন্য রাখুন

এটি স্ন্যাপশট উত্পন্ন করার জন্য অপেক্ষা করুন

MAYBE YOU DONT NEED TO RUN THE SNAP- withoutপ্রথমে এটি চালানোর চেষ্টা করুন , বেশিরভাগ সময় এটি কাজ করে, আপনি smallপ্রকাশনায় মাত্র 1-2 টি নিবন্ধ যুক্ত করতে পারেন যাতে স্ন্যাপটি দ্রুত চলে

তবে আপনি যদি স্ন্যাপশটটি চালান তবে পরবর্তী পদক্ষেপে যাওয়ার আগে আপনার এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে - drop the publication

এখানে চিত্র বর্ণনা লিখুন

এর পরে আপনি drop that publicationনীচের ছবি অনুসারে স্ক্রিপ্টগুলি তৈরি করুন : এখানে চিত্র বর্ণনা লিখুন

তারপরে আশা করি, আপনি যখন আমাদের মূল স্ক্রিপ্টগুলি উপরের দিকে চালাবেন , বা প্রতিরীক্ষণ মনিটরের দিকে নজর রাখবেন তখন আপনি ত্রুটিযুক্ত প্রকাশনা দেখতে পাবেন না, কেবলমাত্র ভাল, আমার ক্ষেত্রে কেবল একটি:

এখানে চিত্র বর্ণনা লিখুন


-1

আমার পূর্ব-প্রযোজনা বক্স, কমান্ডেও আমার একই সমস্যা ছিল

exec sp_cleanupdbreplication

মনে হয় বোগাস সাবস্ক্রিপশন এন্ট্রি পরিষ্কার করার কাজ করেছে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.