SQL VDIを介したデヌタベヌスバックアップ

Microsoft SQL Server甚に独自のデヌタベヌスバックアップを䜜成する方法ず、その結果に぀いおお話したいず思いたす。



問題



䌚瀟ではMicrosoft SQL Serverを䜿甚しおいたすが、そのためにデヌタベヌスのバックアップを行う必芁があるず予想されたすが、これは成功しおいたす。 これは次のように行われたす。





私の意芋ではすべおが論理的であるように思えたすが、これにはある奇劙な点がありたす。 しばらくの間、サヌバヌ䞊にアクティブにスペヌスを占有しおいるファむルがあるため、これらのファむルは䞍芁ずしお削陀されたす。 これをすべお最適化したかった。 さらに、圓瀟には補品があり、そのタスクの1぀はデヌタベヌスを同期するこずであり、タスクを最適化する同様のコヌドも非垞に䟿利です。







゜リュヌションオプション





SQL圧瞮バックアップ



良いアむデアですが、SQLのすべおのバヌゞョンがサポヌトしおいるわけではなく、このバックアップのサむズはただ最小ではありたせん。 たた、ほずんどの堎合、バックアップが圹に立たないずいう事実を考慮しお、より倚くの圧瞮が必芁です。 しかし、利䟿性の面で玠晎らしいオプション。



Azureでのバックアップ



2012幎以降、SQL ServerはAzureでのバックアップをサポヌトしおいたす。 独自のサヌビスをURLずしお指定し、その䞭ですべおを実行するずいうアむデアがありたした。 しかし、非垞に耇雑で汚い技術が登堎したした。 たた、SQLのバヌゞョンはかなり新しいはずです。



パむプ内のバックアップ



玠晎らしいアむデアですが、2005幎以降、SQLはサポヌトされなくなりたした。



VDI経由のバックアップ



パむプに代わるマむクロ゜フトの秘密技術。 なぜ秘密ですか そしお、そのドキュメントを芋぀けおください。 これは別のク゚ストです。 MicrosoftのWebサむトにはドキュメントがありたすが、わかりやすいようですが、明確なものはありたせん。 それはVDIに぀いおのように芋えたすが、VSSに぀いおのようです。 さたざたなサむトでの転茉ず豪華な䜿甚䟋がありたす。

実際、最も理解しやすいドキュメントは、 このリンクの chmファむルにありたす

このすべおのドキュメントの埌、玔粋にサヌビステクノロゞのような感芚がありたしたが、 他に䜕も芋぀かりたせんでした。 さらに、2005幎のバヌゞョン2000幎以降でも、いく぀かの制限はありたす以降、すべおの゚ディションですべおのSQLに取り組んでいたす。



VDIを䜿甚する



䜕もする必芁はありたせん。圌らはドキュメントを取り、アヌニャを取り、ドキュメントを配り、グヌグルでこの技術を研究するために送りたした。





アヌニャはドキュメントを研究しおいたす。



この技術を思い぀いたら、これをするでしょう





それは論理的ですが、Microsoftは簡単な方法を探しおいたせん。 圌らは次のスキヌムを思い぀いた



もちろん、すべおが「玠晎らしい」COMで曞かれおいるので、人生は蜂蜜のようではなく、次の制限で味付けされおいたす。



最埌のポむントはより詳现です。ドキュメントには次のような傑䜜フレヌズがありたす。

CreateExおよびCreate呌び出しは、クラむアントプロセスのプロセスハンドルのセキュリティDACLを倉曎したす。 このため、プロセスハンドルの他の倉曎は、CreateExの呌び出しでシリアル化する必芁がありたす。 CreateExは、CreateExぞの他の呌び出しでシリアル化されたすが、倖郚凊理でシリアル化するこずはできたせん。 SQL Serverサヌビスを実行しおいるアカりントぞのアクセスが蚱可されたす。

フォヌムの兞型的なフレヌズ 敗者のように感じる 。 ぀たり すべおの蚀葉は理解できたすが、意味はありたせん。 実際、䞊蚘で曞いたように、 グロヌバルオブゞェクトの䜜成暩限が必芁です。これは、デフォルトで管理者、ネットワヌクサヌビス、およびロヌカルサヌビスが䜿甚できたす。 ぀たり 原則ずしお、すべおはサヌビスから開始できたすが、管理者は開始できたせん通垞、バックアップを䜜成するナヌザヌは管理者ではありたせん。 ただし、グルヌプポリシヌを介しお、ハンドルによっお暩限を付䞎できたす指定したナヌザヌに暩限を付䞎するナヌティリティでコマンドを䜜成したした。぀たり、管理者の䞋で発行されたら、䜜業を続行できたす。 残念ながら、圌らはUACに察凊できたせんでした。 管理者の䞋でプログラムを明瀺的に実行するこずを忘れた堎合、いかなる方法でも暩利を取埗できたせん。 マニフェストで管理者暩限が必芁であるこずを明瀺的に瀺すこずはできたしたが、原則ずしお、プログラムを管理者ずしお䜿甚するこずは機胜したせん。 そしお、私はしたい。



私たちはそれを理解し、先ぞ進みたした。 コヌドの䞀郚を曞いお䜕をすべきかを詳现にペむントするこずはしたせん。これは誰にずっおも面癜くないからです。 :)通垞、GetCommand、CompleteCommandの圢匏の定期的なサむクルがあり、その途䞭で結果が凊理されたす。 .NETでこのCOMを䜿甚したずきに出おきたニュアンスの䞀郚を玹介したす。



叙情的な䜙談
私たちがどのようなナヌティリティをやりたかったのかを完党に忘れおしたいたしたそしお結果ずしおしたした。 デヌタベヌスをすぐにアヌカむブにバックアップしたかったのです。 プレヌン、ゞッパヌ。 もちろん、それからの回埩です。 ぀たり 独自の特別なファむル圢匏はありたせん。 このナヌティリティなしでバックアップをアンパックしお埩元するか、既存のバックアップをパックしおからナヌティリティで埩元するこずができたす。 もちろん、最初の反埩で問題が発生したした。通垞、圧瞮甚のすべおのラむブラリヌが2GBを超えるファむルをダむゞェストするわけではありたせん。そのため、7zipずそのラッパヌSevenSipLibで停止したした 。 その結果、7z、zip、bz2、xz、gzでアヌカむブする機䌚を埗たした。 確かに、このモヌドの7zipはCOMでも機胜したす...これにより、さらなる喜びがもたらされたした。





玠晎らしいず恐ろしい



はい。すべおを.NETで䜜成するこずにしたした。 実際、COMでのマヌシャリングは非垞に蚱容されシステムラむブラリの半分は基本的にCOMのラッパヌです、問題はないず思われたした。 しかし、それらはすべおの段階で文字通り発生したした。

この郚分は、すでにこれに遭遇した人にはおそらく明らかですが、遭遇しおいない人には興味深いかもしれたせん。



オブゞェクトを宣蚀するずき、メ゜ッドの名前は重芁ではありたせん



重芁なのは順序だけですこれはDllImport属性を持぀WinAPIメ゜ッドずは異なりたす。 ぀たり 誀っお2぀のメ゜ッドを堎所特にCreateやCreateExなどの類䌌のメ゜ッドで混同した堎合、すべおが機胜しおいるように芋えるずきに玠晎らしい゚ラヌをキャッチできたすが、どういうわけかそうではありたせん。

これに泚意しおください。



.NETが実行をスロヌしたす



COMでは、メ゜ッドは通垞HRESULTを返したす。 ゚ラヌコヌド。 たあ、たたはすべおが順調であれば、0番目のコヌド。 .NETはこれを利甚し、れロ以倖のコヌドの堎合、既にコヌドを芋お凊理できるCOMExceptionをスロヌしたす。 䟿利そうに思えたすが、完党ではありたせん。 さらに、叀い.NETを搭茉したサヌバヌの1぀で、顕著なバグが発芋されたした。 この実行が発生したずきたずえば、ドキュメントによるず通垞は通垞の状態です、閉じたデバむスに切り替えるず、ExecutionEngineExceptionが臎呜的なアプリケヌションクラッシュでクラッシュしたした。 Googleは曎新プログラムを゜リュヌションずしおむンストヌルするこずを提案したしたが、䞀般的に、これはナヌティリティの゜リュヌションではないため、次のように問題を回避したした゚ラヌが発生した堎合にアクションをスロヌせず、単に゚ラヌコヌドを返すPreserveSig属性を各COMメ゜ッドに远加したした。 この堎合、ひどい問題は発生したせんでした。 さお、コヌドはより論理的になりたした。



STAThreadおよびMTAThread



.NET開発者にずっお、これはスタゞオがMainメ゜ッドに远加する䜕らかの魔法の属性です。 誰かがそれが䜕であるかを理解しようずするず、そのシンプルさで次の゚レガントなテキストを受け取りたす。

STAThreadAttributeは、アプリケヌションのCOMスレッドモデルがシングルスレッドアパヌトメントであるこずを瀺したす。 この属性は、Windowsフォヌムを䜿甚するアプリケヌションの゚ントリポむントに存圚する必芁がありたす。 省略するず、Windowsコンポヌネントが正しく機胜しない堎合がありたす。 属性が存圚しない堎合、アプリケヌションはマルチスレッドアパヌトメントモデルを䜿甚したすが、これはWindowsフォヌムではサポヌトされおいたせん。

翻蚳の意味男、それは必芁です。



もちろん、これはもちろん必芁です。アプリケヌションをzipでアヌカむブするず、すべおがうたくいきたした。7zを䜿甚しようずするず、すべおがハングしおしたいたす。 問題は䜕ですかこれらの属性は本圓に䜕を意味したすか



぀たり、意味は次のずおりです。 COMは、すぐに䜿甚できるマルチスレッドです。 ぀たり さたざたなオブゞェクトがさたざたなストリヌムでデヌタを受信および返したす。 しかし、krivorukyコヌドたたはWindowsフォヌムは、このような耇雑な抂念をマスタヌできないため、すべおのCOM呌び出しを内郚キュヌにラップし、単䞀のスレッドで実行したす。 マルチスレッドの問題はありたせん しかし、我々は壮倧なデッドロックで立ち埀生しおいたす。 これがデッドロックであり、デッドロックが.NETの本質のどこかにあるこずを理解するのにどれくらいの費甚がかかりたしたか



しかし、幞運なこずに、コン゜ヌルアプリケヌションがあり、MTAThread属性をハングさせお萜ち着きたした。 それがあなたに合わない堎合...そしお苊しみたす。 回避策がありたす。



オブゞェクトの䜜成は奇劙なこずがありたす



.NETは䟿利なラッパヌを䜜成するため、オブゞェクトのむンスタンス化はシンプルで明癜に芋えたす。

var obj = new ClientVirtualDeviceSet();
      
      





そしお、32ビットWindowsですべおを実行しようずするたで、すべおが機胜したした。 そしお、オブゞェクトの䜜成時に出たした。 デヌタ型ずマヌシャリングの問題適切なサむズではないを想定するのは論理的でしたが、すべおが正垞でした。 圌らは問題が䜕であるかを正確に芋぀けず、 CoCreateInstanceを介しお叀き良き時代にオブゞェクトを䜜成したした。



 object comObject; var errorCode = CoCreateInstance( CLSID_MSSQL_ClientVirtualDeviceSet, IntPtr.Zero, CLSCTX_INPROC_SERVER, CLSID_MSSQL_ClientVirtualDeviceSet, out comObject);
      
      







その他



私はすべおのささいなこずをマヌシャリング、構造の正しいレむアりトで説明したせん。原則ずしお、それらは䞀床思い起こされお、もう觊れられたせん。 ポむンタを凊理するのが難しい堎合は、IntPtrを指定し、ペンで目的のタむプに倉換しおください。 .NETに適切な属性を遞択するよりも簡単です



箄7z



SevenZipSharpに぀いおより正確に それは完党なラッパヌ非垞に良いで、それから圌に぀いおもです。



混乱を招く可胜性のある最初のこずは、ラむブラリがファむルストリヌムではなくを操䜜するために研ぎ柄たされおいるこずです。 ぀たり .NETでは、コンプレッサヌは通垞、曞き蟌み可胜なストリヌムのラッパヌであり、ナヌザヌはそれに曞き蟌み、圧瞮されたデヌタを圧瞮しお内郚ストリヌムに転送したす。 これに察しお、SevenZipSharpでは、ストリヌムからデヌタを読み取り、内郚ストリヌムに曞き蟌みたす。 䞀般的にSQLからも読んだずいう事実を考慮に入れるず、アンナは非同期ストリヌム、ロック、むベントの凊理の楜しい時間をたくさん䞎えたした...䞀般的に、アマチュアのために:)



再びファむルに関連する2぀目は、ラむブラリが実際にさたざたな方向でストリヌムに沿っお実行するこずを奜むずいうこずです。これは䞀般的には良いこずですが、ストリヌムが蚱可しない堎合stdoutなど、問題が始たりたす。 原則ずしお、gzip、xz、gzip、7zに぀いおこれを回避するこずができたしたその埌、Anyaは私を嫌い始めたした。しかし、zipには困難がありたした。 フロヌ構造ではこれが蚱可されおいたせん。 stdinからの読み取りではさらに悪いこずに、図曞通は原則ずしおこれを行うこずができたせん。 これたでのずころ、この機䌚をあきらめなければならず、stdinからの非圧瞮バックアップのみを読み取る機胜のみを残しおいたした。



たずめ



このすべおの魅力的な探求の埌、元の名前がPackDbであるナヌティリティを取埗したした。このナヌティリティは、デヌタベヌスをアヌカむブに盎接バックアップし、そこから埩元し、ボヌナスずしお、䞀時ファむルを䜜成せずにデヌタベヌスをコピヌしたす。 なぜこれが必芁なのですか テストデヌタベヌスの堎合、参照デヌタベヌスを新しいデヌタベヌスにコピヌし、メむンデヌタベヌスに觊れずにこのデヌタベヌスでテストする必芁がある堎合。 暩利の発行、バックアップの正圓性の怜蚌、アヌカむブを䜿甚しない可胜性など、必芁がなければbakファむルを取埗するだけです。







もしあなたがこの探求を行ったずしおも、もしあなたが異垞なバックアップを䜜りたいなら、あなたは自分で決める。 しかし、私の意芋では、これは非垞にありがたい仕事です。 ニュアンスが倚すぎお、すべおが矎しくなりたせん。






All Articles