Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में रोलबैक ट्रंकेट करें

क्या आपने कभी गलती से TRUNCATE . को क्रियान्वित किया है? गलत टेबल पर कमांड? इससे सभी डेटा हानि होगी। सबसे बुरी बात यह है कि आपको अपना डेटा वापस पाने का मौका नहीं मिलेगा। इस लेख में, हम देखेंगे कि ऐसी स्थितियों से कैसे बचा जाए और रोलबैक ट्रंकेट का मौका दिया जाए। ।

आप TRUNCATE को रोलबैक नहीं कर सकते

सीधे शब्दों में, यदि लेन-देन पहले से ही प्रतिबद्ध है, तो आप उसे रोलबैक नहीं कर सकते हैं, लेकिन आप डेटा वापस पाने के लिए कुछ और कर सकते हैं (या कम से कम इसके कुछ हिस्से)।

जब आप TRUNCATE . निष्पादित करते हैं विवरण, आपका डेटा अभी भी एमडीएफ फ़ाइल में है। हालांकि, यह दिखाई नहीं दे रहा है क्योंकि SQL सर्वर इसे खाली स्थान के रूप में मान रहा है (TRUNCATE SQL सर्वर को डेटा पृष्ठों को हटाने के लिए कह रहा है)।

डेटा वापस पाने का एक ही तरीका है कि किसी भी तरह से हटाए गए डेटा पेजों को पढ़ा जाए और उन्हें पढ़ने योग्य डेटा में बदल दिया जाए।

आपको तेजी से कार्य करना चाहिए क्योंकि यदि पहले से नहीं तो खाली स्थान को नए डेटा के साथ अधिलेखित कर दिया जाएगा। यदि आप अपने SQL सर्वर इंस्टेंस को रोक सकते हैं और MDF और LDF फ़ाइलों की एक प्रति बना सकते हैं जो आपको अधिक समय देगी।

कुछ उपकरण हैं जो इस प्रकार की पुनर्स्थापना कर सकते हैं।

आप ट्रंकेट को रोलबैक कर सकते हैं

छंटनी एक लॉग ऑपरेशन है, लेकिन SQL सर्वर हर एक पंक्ति को लॉग नहीं करता है क्योंकि यह तालिका को TRUNCATE करता है। SQL सर्वर केवल इस तथ्य को लॉग करता है कि TRUNCATE ऑपरेशन हुआ। यह उन पृष्ठों और विस्तारों के बारे में जानकारी भी लॉग करता है जिन्हें हटा दिया गया था। हालांकि, केवल उन पृष्ठों को पुन:आवंटित करके, वापस रोल करने के लिए पर्याप्त जानकारी है। लॉग बैकअप के लिए केवल उस जानकारी की आवश्यकता होती है जो TRUNCATE TABLE हुआ। TRUNCATE TABLE को पुनर्स्थापित करने के लिए , ऑपरेशन अभी फिर से लागू किया गया है। RESTORE के दौरान शामिल डेटा की आवश्यकता नहीं होती है (जैसे कि यह बल्क इंसर्ट जैसे वास्तविक 'न्यूनतम लॉग' ऑपरेशन के लिए होगा) )।

SQL सर्वर जानता है कि कौन से पृष्ठ तालिका से संबंधित हैं, जहाँ तक वे एक विशेष लॉक के साथ बंद हैं, और सभी X तालों की तरह, वे लेन-देन के अंत तक आयोजित किए जाते हैं। यही कारण है कि पृष्ठों या विस्तारों को हटाया नहीं जा सकता है, और निश्चित रूप से, उनका पुन:उपयोग नहीं किया जा सकता है।

यहां एक उदाहरण दिया गया है:

हमें 504 पंक्तियों और कई पृष्ठों की गिनती मिली। अब हम पंक्तियों की संख्या और तालिका से संबंधित पृष्ठों को देखेंगे।

BEGIN TRAN
TRUNCATE TABLE dbo.Products;
SELECT COUNT(*) FROM dbo.Products;
 
DBCC IND('AdventureWorks', 'Products', -1);
DBCC EXTENTINFO('AdventureWorks', 'Products', -1);
 
SELECT resource_type, resource_description,
        request_mode FROM sys.dm_tran_locks
WHERE  resource_type IN ('EXTENT', 'PAGE')
AND   resource_database_id = DB_ID('AdventureWorks');

आपको DBCC IND . से कोई पंक्ति नहीं दिखाई देगी , और गिनती (*) से 0 पंक्तियाँ। ताले की जानकारी निम्नलिखित लौटाती है:

संसाधन_प्रकार संसाधन_विवरण अनुरोध_मोड
———————————————
विस्तार 1:33352 X
पृष्ठ 1:42486 X
EXTENT 1:42488 X
पेज 1:42487 X
पेज 1:42488 X
पेज 1:42489 X
पेज 1:23027 X
पेज 1:23030 X
पेज 1:23029 X
पेज 1:26992 X
पेज 1:26993 X

सीमा और पृष्ठ लॉक में वे सभी पृष्ठ शामिल हैं जिन्हें हमने DBCC IND . में देखा था आउटपुट आपके बाद ही रोलबैक लेन-देन के ताले जारी हो जाएंगे, और आपको सभी पंक्तियों और पृष्ठों को फिर से टेबल पर देखना चाहिए।

ROLLBACK TRAN;
GO
SELECT COUNT(*) FROM dbo.Products;
DBCC IND('AdventureWorks', 'Products', -1);
GO

सावधान रहें और ट्रांजेक्शन में हमेशा TRUNCATE टेबल स्टेटमेंट को रैप करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर डेटाबेस को एक उदाहरण से दूसरे में कैसे कॉपी करें

  2. SQL सर्वर में DML ट्रिगर बनाएं

  3. समतल प्रतिच्छेदन समय अवधि

  4. SQL सर्वर में UTC मिलीसेकंड को DATETIME में कनवर्ट करें

  5. SQL सर्वर DIFFERENCE () फ़ंक्शन कैसे काम करता है