2009-04-16 10 views
6

कॉपी करने के लिए प्रोग्रामेटिक रूप से SQL सर्वर डेटाबेस को अलग करें मेरे पास एक छोटा SQL सर्वर डेटाबेस है जिसे मुझे कमांड पर कॉपी करने की आवश्यकता है - मुझे किसी भी पल में mfd और ldf फ़ाइलों को लेने में सक्षम होना चाहिए, उन्हें कॉपी करें, उन्हें ज़िप करें , और उन्हें अंतिम उपयोगकर्ता के लिए उपलब्ध कराएं।एमडीएफ फ़ाइल

इस मैन्युअल रूप से संभव है:

1) दूरस्थ डेस्कटॉप

2) एसक्यूएल प्रबंधन स्टूडियो के माध्यम से डेटाबेस Detaching के माध्यम से एसक्यूएल सर्वर पर लॉगिंग। मुझे डेटाबेस को सिंगल_यूसर में सेट करने और/या सेवा को पुनरारंभ करने के संयोजन के साथ चारों ओर झुकाव करना है, इसलिए मैं इसे अलग करने के लिए प्राप्त कर सकता हूं क्योंकि ऐप सर्वर सामान्य रूप से लॉग इन होता है।

3) अलग होने पर मैं फ़ाइल सिस्टम से गुजरता हूं और एमडीएफ और एलडीएफ फाइलों की प्रतिलिपि बनाता हूं।

4) मैं डेटाबेस फिर से संलग्न एसक्यूएल प्रबंधन स्टूडियो

5) के माध्यम से मैं की नकल की फ़ाइलें ज़िप, और मैं उन्हें एक FTP सर्वर पर ले जाने के इतने लोग हैं, जो उन्हें जरूरत के लिए उन्हें मिल सकता है।

यह एक भयानक, अक्षम प्रक्रिया है। यह सिर्फ स्कीमा की आवश्यकता नहीं है, बल्कि लोगों को विनाशकारी प्रयोग के उद्देश्य से अपनी स्थानीय मशीनों पर वास्तविक, उत्पादन डेटा के स्नैपशॉट के साथ काम करने की आवश्यकता है। सौभाग्य से ज़िपित डेटाबेस बहुत छोटा है - शायद लॉग के साथ 30 मेगापिक्सल।

तो आदर्श रूप में, मैं एएसपी .NET वेब एप्लिकेशन में एक पृष्ठ बनाना चाहता हूं जिसमें एक बटन है जिसे उपयोगकर्ता वर्तमान डेटाबेस की पैकेजिंग को ज़िप फ़ाइल में शुरू करने के लिए दबा सकता है, और फिर मैं बस प्रदान करूंगा फ़ाइल डाउनलोड के लिए लिंक।

उत्तर

9

क्यों एक साधारण बैकअप (SqlCommand के साथ क्या करने के लिए आसान) नहीं बनाने के लिए और उपयोगकर्ताओं के लिए आसान बहाल करने के लिए एक सुविधा जोड़ने बटन पर क्लिक के साथ बैकअपफाइल?

  • आप कर सकते हैं बैकअप एसक्यूएल-आदेशों के साथ डेटाबेस
  • आप बाहर शेल और एसक्यूएल-आदेशों के साथ backupfile
  • तुम भी बाहर शेल और एक वेब सर्वर पर पूर्ण रूप से अपने backupfile एफ़टीपी अगर आप चाहते हैं कर सकते हैं ज़िप कर सकते हैं।

आपके डीबी का उपभोग करने के लिए अंतिम उपयोगकर्ता क्या उपयोग कर रहे हैं? एक Winform- कार्यक्रम? फिर उपयोगकर्ता के लिए एक बटन क्लिक के साथ सबकुछ करना आसान हो गया।

यहाँ उस के लिए कुछ उदाहरण कोड हैं:

Declare @CustomerID int 
declare @FileName nvarchar(40) 
declare @ZipFileName nvarchar(40) 
declare @ZipComand nvarchar(255) 


set @CustomerID=20 --Get from database instead in real life application 
SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak' 
SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip' 

--Backup database northwind 
backup database northwind to [email protected] 

--Zip the file, I got a commanddriven zip.exe from the net somewhere. 
set @ZipComand= 'zip.exe -r '[email protected]+' '[email protected] 
EXEC xp_cmdshell @zipcomand,NO_output 

--Execute the batfile that ftp:s the file to the server 
exec xp_cmdshell 'c:\movetoftp.bat',no_output 

--Done! 

आप एक movetoftp.bat (अपने को बदलने के एफ़टीपी सर्वर) इस जिसमें करना होगा:
एफ़टीपी -s: ftpcommands.txt एफ़टीपी। myftp।शुद्ध

और आप एक ftpcommands.txt मौजूद हैं, जो करना होगा (आप इस फ़ाइल को सिर्फ सही sqlcommands द्वारा भी ज़िप फ़ाइल के साथ dnamically बनाया हो सकता है, लेकिन मैं आपको लगता है कि अपने आप को करते हैं):

ftpusername
ftppassword
द्विआधारी
शीघ्र n
mput c:। \ बैकअप \ * जिप
, छोड़ने संवादों आप एसक्यूएल प्रबंधन स्टूडियो में उपयोग में

2

आसान - एसक्यूएल सर्वर के साथ आने वाले "एसक्यूएल प्रबंधन ऑब्जेक्ट्स" एसएमओ में जांचें - अच्छा सी #/वीबी.नेट कक्षाएं और यह सब करने के तरीके।

देखें: SMO - manage your SQL Server!

या:

SQL Server 2005 Database Backup and Restore using C# and .NET 2.0

मार्क

8

देखो प्रत्येक के शीर्ष के निकट है एक बटन जो कार्रवाई करने के लिए एक स्क्रिप उत्पन्न करेगा। एसक्यूएल में ऐसा करने का तरीका यह जानने का एक त्वरित तरीका है जिसे डेटाबेस कनेक्शन से निष्पादित किया जा सकता है।

उदा। डेटाबेस DB1 अलग करने:

EXEC master.dbo.sp_detach_db @dbname = N'db1' 
+1

स्क्रिप्ट बटन के अस्तित्व बाहर ओर इशारा करते हुए अत्यंत उपयोगी था। +1 –

0

व्यक्तिगत तौर पर मैं डेटाबेस का बैकअप पैदा करते हैं और उन ज़िप और उन्हें उपयोगकर्ताओं को भेजना चाहते हैं। शायद आप बहाल करने के लिए एक छोटी लिपि लिख सकते हैं।

डेटाबेस को अलग करने का कारण यह दूसरों के लिए अनुपलब्ध बनाता है।

0

मैं SQL Dumper कंसोल संस्करण का उपयोग करता हूं और एसक्यूएल डंप को संपीड़ित करता हूं।

IMHO बाइनरी फ़ाइल के बजाय एक सादे पाठ प्रतिलिपि रखना हमेशा बेहतर होता है। अगर कुछ गलत हो जाता है, कम से कम आप अपने डेटा को हाथ से फिर से लिख सकते हैं, क्योंकि आप इसे पढ़ सकते हैं।

0

किसी भी डीबी फ़ाइल को संलग्न करने के साथ पहले SQL सर्वर से कनेक्ट करें और डेटाबेस नाम का उपयोग न करें।

ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30"; 

नोट: XXX =। या। \ SQLEXPRESS OR। \ MSSQLSERVER या (स्थानीय) \ SQLEXPRESS या (localdb) \ v11.0 & ...

फिर क्वेरी के तहत अपनी डीबी फ़ाइल को अलग करें।

"ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]"; 

ठीक है।

मेरे नमूना कोड:

sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30"; 
sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]"; 
        sql_command.Connection = sql_connect1; 
        sql_connect1.Open(); 
        sql_command.ExecuteNonQuery(); 
        sql_connect1.Close(); 
संबंधित मुद्दे