Wdrażanie baz danych SQL Server z testu na żywo




Zastanawiam się, jak wy zarządzać rozmieszczenie bazy danych między 2 serwerami SQL, w szczególności SQL Server 2005. Teraz jest rozwój i żywe jeden. Jak powinno to być częścią buildscript (partia standardowych okien, nawet zrobić z obecnym złożoności tych skryptów, mogę przejść do PowerShell lub dłużej), Enterprise Manager / Management Studio Express nie liczą.


Czy wystarczy skopiować plik .mdf i dołączyć go? Zawsze jestem nieco ostrożność podczas pracy z danych binarnych, jak to wydaje się być kwestią Kompatybilność (mimo rozwoju i żyć powinien uruchomić tę samą wersję serwera przez cały czas).


Lub - ze względu na brak „EXPLAIN CREATE TABLE” w T-SQL - robisz coś, wywozi do istniejącej bazy danych SQL skrypty, które można uruchomić na serwerze docelowym? Jeśli tak, to czy jest to narzędzie, które może automatycznie zrzucić danej bazy danych do zapytań SQL i który działa z linii poleceń? (Ponownie, Enterprise Manager / Management Studio Express nie liczą).


I wreszcie - biorąc pod uwagę fakt, że na żywo baza danych zawiera już dane, rozmieszczenie może nie obejmować tworzenie wszystkich tabel, ale raczej sprawdzenie różnicy w strukturze i ALTER TABLE żywe te zamiast, który może również potrzebne dane identyfikacyjne / konwersji przy zmianie istniejących pól.


Teraz słyszę wiele wspaniałych rzeczy o [Red Gate](http://www.red-gate.com/products/index.htm) produktów, ale dla projektów hobby, cena jest nieco strome.


Więc, co używasz do automatycznego rozmieszczenia baz danych SQL Server z testu żyć?
Wziąłem do ręki kodowania wszystkich moich DDL (tworzy / zmieniać / usuwać) sprawozdania, dodając je do mojego .sln jako pliki tekstowe, a przy użyciu normalnego wersjonowanie (przy użyciu Subversion, ale każda kontrola korekta powinna działać). W ten sposób nie tylko uzyskać korzyści z wersjami, ale żyć z aktualizacją dev / etap jest taki sam proces dla kodu i bazy danych - tagi, gałęzie itd pracy wszystko jedno.


W przeciwnym razie, zgadzam Redgate jest drogie, jeśli nie masz firmę kupując go dla Ciebie. Jeśli można uzyskać firmę kupić go dla ciebie chociaż, to naprawdę warto!
<p>w witrynach, w których pracowałem, wszelkie zmiany, które należy wprowadzić w instancjach produkcyjnych, muszą być skryptowane jako skrypty zmian, które będą działać w sql * plus; ponadto skrypty potrzebne do odtworzenia od podstaw wszystkich obiektów schematu muszą być aktualizowane. wszystkie te skrypty są sprawdzane pod kątem kontroli zmian i stamtąd migrowane.</p><p>możesz kontrolować zmiany ddl lub używać wyzwalaczy ddl, aby wykrywać zmiany, a nawet używać oprogramowania różnicowego do porównywania dwóch wystąpień, ale metody te są niedyskryminujące; często programista wprowadza i cofa wiele zmian w schemacie (np. małe zmiany testowe, tworzenie fałszywych tabel do testowania koncepcji itp.) przed ustaleniem, co dokładnie należy zmienić.</p> <p>ma więcej kolumn niż pokaż status tabeli; ale robi sztuczkę:</p><pre><code>select * from information\_schema.tables where table\_schema = database(); </code></pre><p>aktualizacja 2011-06-07 19:02</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = database(); </code></pre><p>te zapytania działają, jeśli ustawisz bieżącą bazę danych.</p><p>możesz także kodować konkretną bazę danych:</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = 'mysql'; </code></pre> Często jest to realizowane za pomocą [„Data Driven Subskrypcje”](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale ta funkcja jest dostępna tylko w niektórych wersjach SQL: Enterprise i Business Intelligence, ale nie w standardzie.


Tak więc istnieje wiele twórczych obejścia. Ale nie lubię żadnego z nich, a wszystko to wymaga uczciwej trochę pracy poza SSRS.


Do obejścia widziałem to: Tworzenie subskrypcji, a następnie wyłączenie lub włączenie zadanie SQL, który wysyła subskrypcję (zidentyfikowanego przez GUID).


Tworzenie .exe .NET otoki do obsługi wysyłania wiadomości e-mail. Można go uruchomić kwerendę najpierw sprawdzić, ile zwracane są wiersze, a następnie w razie potrzeby wygenerować raport i umieścić go w wiadomości e-mail. <p>najlepszym sposobem byłoby użycie tabel, które już masz. utwórz dwie tabele - tabela-a, tabela-b na potrzeby testu możesz nawet zaktualizować tę samą kolumnę o te same informacje, aby nie wpływać na żadne rzeczywiste dane.</p><p>na przykład update table\_a ustaw id = id gdzie id = 100;</p><p>otwórz dwie sesje dla tej samej bazy danych. na jeden biegnij</p><pre><code>begin tran update table\_a set id=id where id = 100; </code></pre><p>dwa biegi</p><pre><code>begin tran update table\_b set id=id where id =100; </code></pre><p>następnie skopiuj instrukcje aktualizacji do sesji przeciwnych i uruchom je w tym samym czasie. w jednym,</p><pre><code>update table\_b set id=id where id =100; </code></pre><p>we dwóch</p><pre><code>update table\_a set id=id where id = 100; </code></pre><p>właśnie próbowałem tego teraz i dostałem na ms-sql</p><pre><code>msg 1205, level 13, state 56, line 1 transaction (process id 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. rerun the transaction. </code></pre> <p>przekazanie <a href="https://dba.stackexchange.com/questions/5774/why-is-ssms-inserting-new-rows-at-the-top-of-a-table-not-the-bottom/5775#5775">moja odpowiedź</a> na podobne pytanie dotyczące programu sql server:</p><blockquote> <p>w świecie sql porządek nie jest nieodłączną właściwością zestawu danych. w ten sposób nie otrzymujesz żadnych gwarancji z rdbms, że twoje dane wrócą w określonej kolejności - lub nawet w spójnej kolejności - chyba że zapytasz o swoje dane klauzulą ​​order by.</p> </blockquote><p>tak więc, aby odpowiedzieć na twoje pytanie:</p><ul> <li>mysql sortuje rekordy, jak chce, bez żadnej gwarancji spójności.</li> <li>jeśli zamierzasz cokolwiek polegać na tym zamówieniu, <strong> musisz określić żądane zamówienie za pomocą <code>order by</code>. robienie czegokolwiek innego to przygotowywanie się na niepożądane niespodzianki. </strong></li> </ul><p>jest to właściwość całego sql, nie tylko mysql. odpowiedni tekst w <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt">specyfikacja sql-92</a> to:</p><blockquote> <p>jeśli nie podano &lt;kolejność według klauzuli&gt;, kolejność wierszy q zależy od implementacji.</p> </blockquote><p>w specyfikacji kursorów znajdują się podobne fragmenty tekstu.</p> <p><strong>skalowanie w poziomie</strong><br> skalowanie w poziomie zasadniczo buduje się zamiast w górę. nie kupujesz większego, mocniejszego serwera i przenosisz na niego całe swoje obciążenie, zamiast tego kupujesz ponad 1 dodatkowe serwery i rozkładasz obciążenie na nie.</p><p>skalowanie w poziomie jest używane, gdy masz możliwość uruchamiania wielu instancji na serwerach jednocześnie. zazwyczaj dużo trudniej jest przejść z 1 serwera na 2 serwery, niż z 2 do 5, 10, 50 itd.</p><p>po rozwiązaniu problemów z uruchamianiem równoległych instancji możesz w pełni korzystać ze środowisk takich jak amazon ec2, usługa cloud rackspace, gogrid itp., ponieważ możesz zwiększać i zmniejszać liczbę instancji w zależności od zapotrzebowania, zmniejszając potrzebę płacenia za moc serwera nie używasz tylko do pokrycia tych szczytowych obciążeń.</p><p>relacyjne bazy danych są jednym z trudniejszych elementów do równoległego uruchamiania pełnego odczytu/zapisu.</p><p>widziałem damiena katza mówiącego o couchdb na stackoverflow devdays w austin, a jednym z jego głównych celów w jego tworzeniu były te równoległe przypadki. ponieważ było to przedmiotem zainteresowania od samego początku, byłoby znacznie lepiej wykorzystać skalowanie w poziomie.</p><p><strong>skalowanie pionowe</strong><br> skalowanie w pionie jest odwrotne, buduj zamiast na zewnątrz. idź i kup najsilniejszy sprzęt, na jaki cię stać, i umieść na nim swoją aplikację, bazę danych itp.</p><p><strong>real world</strong><br> oczywiście oba mają swoje zalety i wady. często kombinacja tych dwóch jest wykorzystywana do ostatecznego rozwiązania.</p><p>możesz mieć swoją główną bazę danych, w której wszyscy zapisują i odczytują dane w czasie rzeczywistym na dużym sprzęcie. następnie rozdałem tylko do odczytu kopie bazy danych w celu dokładniejszej analizy danych i raportowania tam, gdzie bycie na bieżąco nie ma większego znaczenia. wtedy aplikacja sieci web frontonu może działać na wielu serwerach www za modułem równoważenia obciążenia.</p> <p>użycie sql server profiler (narzędzie gui) do śledzenia serwera produkcyjnego nie jest dobrym pomysłem. ale to zależy od obciążenia. zamiast tego należy używać śledzenia sql po stronie serwera (patrz <a href="http://msdn.microsoft.com/en-us/library/ms188662%28v=sql.100%29.aspx">sp\_trace\_xxx</a> procedury). znalazłem również artykuły:</p><p> <a href="http://sqlblog.com/blogs/linchi\_shea/archive/2007/08/01/trace-profiler-test.aspx">wpływ na wydajność: śledzenie profilera vs. śledzenie sql po stronie serwera</a> ,</p><p> <a href="http://vyaskn.tripod.com/server\_side\_tracing\_in\_sql\_server.htm">automatyzacja śledzenia po stronie serwera w programie sql server</a> </p><p> <a href="http://weblogs.sqlteam.com/dang/archive/2007/12/16/avoid-causing-problems-with-profiler.aspx">nikaj powodowania problemów z profiler</a> </p><p>może będzie zainteresowany i przydatny.</p><p> <a href="http://msdn.microsoft.com/en-us/library/ms187023.aspx">rezerwuj online</a> mówi:</p><ul> <li>uruchom profiler zdalnie zamiast bezpośrednio na serwerze</li> <li>unikaj włączania zdarzeń, które występują często (np. zablokuj: nabyte), chyba że jest to absolutnie konieczne</li> <li>uwzględnij tylko potrzebne klasy zdarzeń</li> <li>określ filtry ograniczające, aby zmniejszyć liczbę zdarzeń</li> <li>unikaj zbędnych danych (np. sql: batchstarting i sql: batchcompleted)</li> <li>unikaj uruchamiania dużych śladów za pomocą profiler; zamiast tego rozważ śledzenie sql po stronie serwera</li> <li>ogranicz rozmiar pliku śledzenia po stronie serwera i zarządzaj wykorzystaniem miejsca</li> </ul> <p>tak.</p><p>możesz zmienić domyślne sortowanie instancji ekspresowej sql server 2008 r2 i poszczególnych baz danych, ale jest to złożone zadanie.</p><p>niestety nie ma opcji wizualnej, aby to zrobić za pośrednictwem ssms.</p><blockquote> <p><strong> sql server 2008 obsługuje ustawianie sortowania na następujących poziomach: </strong></p> <ul> <li> <p>serwer</p> </li> <li> <p>baza danych</p> </li> <li> <p>kolumna</p> </li> <li> <p>wyrażenie</p> </li> </ul> <p>domyślne ustawienia instalacji są określone przez ustawienia regionalne systemu windows. sortowanie na poziomie serwera można zmienić podczas instalacji lub przez zmianę ustawień regionalnych systemu windows przed instalacją. <a href="http://technet.microsoft.com/en-us/library/ms143508%28sql.100%29.aspx">więcej ...</a> </p> </blockquote><p> <a href="http://technet.microsoft.com/en-us/library/ms179254%28sql.100%29.aspx">stawianie i zmiana sortowania serwerów - sql server 2008</a> </p><ul> <li> <p>upewnij się, że masz wszystkie informacje lub skrypty potrzebne do odtworzenia baz danych użytkowników i wszystkich zawartych w nich obiektów.</p> </li> <li> <p>wyeksportuj wszystkie dane za pomocą narzędzia takiego jak narzędzie bcp. aby uzyskać więcej informacji, zobacz importowanie i eksportowanie danych masowych.</p> </li> <li> <p>usuń wszystkie bazy danych użytkowników.</p> </li> <li> <p> <a href="http://blogs.msdn.com/b/psssql/archive/2008/08/29/how-to-rebuild-system-databases-in-sql-server-2008.aspx">odbuduj główną bazę danych</a> określając nowe sortowanie we właściwości sqlcollation polecenia setup</p> </li> <li> <p>utwórz wszystkie bazy danych i wszystkie zawarte w nich obiekty.</p> </li> <li> <p>zaimportuj wszystkie swoje dane.</p> </li> </ul><p> <a href="http://technet.microsoft.com/en-us/library/ms175835%28sql.100%29.aspx">stawianie i zmiana sortowania bazy danych - sql server 2008</a> </p><ul> <li>ustaw opcję <code>collation</code> w <code>create database</code> instrukcja podczas tworzenia nowej bazy danych.</li> <li> <p>podobnie ustaw opcje <code>collation</code> w <code>alter database</code> instrukcja zmiany sortowania istniejącej bazy danych.</p> <p><code>alter database [database\_name] collate sql\_latin1\_general\_cp1\_ci\_as;</code></p> </li> </ul><p> <a href="http://technet.microsoft.com/en-us/library/ms190920%28sql.100%29.aspx">stawianie i zmiana sortowania kolumn</a> </p><ul> <li>niektóre sortowania kolumn pozostaną takie same, nawet po zmianie sortowania bazy danych. w takim przypadku musisz zmodyfikować zestawienie poszczególnych kolumn.</li> </ul> <p>logiczne przetwarzanie zapytania odbywa się na <a href="http://msdn.microsoft.com/en-us/library/ms189499.aspx"> msdn </a> (napisane przez zespół microsoft sql server, a nie firmy zewnętrzne)</p><pre><code>1. from 2. on 3. join 4. where 5. group by 6. with cube or with rollup 7. having 8. select 9. distinct 10. order by 11. top </code></pre><p>tabela pochodna podąża za tym, a następnie zapytanie zewnętrzne robi to ponownie itp. itd</p><p>jest to <strong> logiczne </strong> chociaż: nie <strong> rzeczywiste </strong>. bez względu na to, jak sql server to robi, semantyka jest honorowana <em> do litery</em>. „rzeczywisty” jest określany przez optymalizator zapytań (qo) i unikasz wspomnianego pośredniego produktu cartesion.</p><p>warto wspomnieć, że sql jest deklaratywny: mówisz „co”, a nie „jak”, jak w przypadku programowania proceduralnego/imperatywnego (java, .net). zatem powiedzenie „dzieje się to wcześniej” jest w wielu przypadkach błędne (np. założenie, że występują zwarcia lub kolejność l-do-r, gdzie)</p><p>w powyższym przypadku qo wygeneruje ten sam plan, bez względu na jego strukturę, ponieważ jest to proste zapytanie.</p><p>jednak qo opiera się na kosztach i w przypadku złożonego zapytania wygenerowanie idealnego planu może zająć 2 tygodnie. więc robi to „wystarczająco dobrze”, co tak naprawdę nie jest.</p><p>twój pierwszy przypadek może pomóc optymalizatorowi w znalezieniu lepszego planu, ponieważ logiczna kolejność przetwarzania jest inna dla 2 zapytań. ale może nie.</p><p>użyłem tej sztuczki w sql server 2000, aby uzyskać 60-krotną poprawę wydajności w zapytaniach dotyczących raportowania. ponieważ qo ulepsza wersję do wersji, staje się coraz lepszy w rozwiązywaniu tych problemów.</p><p>i wspomniana książka: istnieje spór<br> patrz so i kolejne linki: <a href="https://stackoverflow.com/q/3270338/27535">https://stackoverflow.com/q/3270338/27535</a> </p> <p>josh,</p><p>jest to bardzo częste zadanie dla wszystkich dba i poprawna odpowiedź nie jest taka sama dla każdego i dla każdego serwera. podobnie jak wiele innych rzeczy, zależy to od tego, czego potrzebujesz.</p><p>zdecydowanie nie chcesz uruchamiać „shrink database”, jak już sugerowano. jego zło do wydajności, a poniżej odniesienie pokaże ci dlaczego. powoduje to fragmentację dysku i indeksów, co może prowadzić do problemów z wydajnością. lepiej jest, jeśli wstępnie przydzielisz duży rozmiar danych i plików dziennika, aby automatyczne uruchamianie nie uruchomiło się.</p><p>nie zrozumiałem twojego nr 2. pełna kopia zapasowa wybranych tabel. czy możesz rozwinąć więcej na ten temat?</p><p>przychodząc do reorganizacji indeksu, aktualizacji statystyk i przebudowy indeksu, musisz uważać na to, jak to zrobisz, w przeciwnym razie skończy się to na użyciu większej ilości zasobów, a także na problemach z wydajnością.</p><p>po przebudowaniu indeksów statystyki indeksów są aktualizowane za pomocą fullscan, ale jeśli później zaktualizujesz statystyki, zostaną one ponownie zaktualizowane z domyślną próbką (która zależy od kilku czynników, zwykle 5% tabeli, gdy rozmiar tabeli&gt; 8 mb), co może prowadzić do problemów z wydajnością. w zależności od posiadanej edycji może być możliwe przebudowywanie indeksu online. właściwym sposobem wykonywania tej czynności jest sprawdzenie stopnia fragmentacji i w zależności od tego albo przebuduj indeks, albo zreorganizuj indeks + zaktualizuj statystyki. możesz także określić, które tabele wymagają częstszej aktualizacji statystyk i próbować częściej aktualizować statystyki.</p><p>plany konserwacji są w porządku, ale trudno jest uzyskać z nich jak najwięcej, wykonując te dostosowania, chyba że możesz zalogować się do ssis i poprawić mp. dlatego wolę nie używać ich i używać <a href="https://ola.hallengren.com">darmowe skrypty oli hallengren</a> , które są bardziej niezawodne niż mp. poleciłbym również nadrobić zaległości w artykule paula randala na ten temat.</p><p>ref: <a href="http://technet.microsoft.com/en-us/magazine/2008.08.database.aspx">http://technet.microsoft.com/en-us/magazine/2008.08.08.database.aspx</a> </p><p>to nie jest wyczerpująca odpowiedź na twoje pytanie, ale dobry punkt wyjścia. hth i daj nam znać, jeśli masz dodatkowe pytania/komentarze.</p>