Ist es möglich, sekundärer Server zur Verfügung schreibgeschützt in einem Protokollversand Szenario zu haben?

StackOverflow https://stackoverflow.com/questions/1832848

Frage

Ich bin auf der Suche in dem Protokollversand in einer SQL Server 2005-Umgebung. Die Idee war, häufiger Protokollversand zu einem sekundären Server. Die Absicht:. Verwenden Sie den sekundären Server Berichtsabfragen zu dienen, wodurch den primären DB-Server ausgelagert

Ich kam in diese auf einem sqlservercentral Forum-Thread :

Wenn Sie den Protokollversand erstellen Sie haben zwei Möglichkeiten. Sie können konfigurieren, Protokollwiederherstellungsvorgang mit NORECOVERY oder mit Standby-Option zu tun. Wenn Sie die Option NORECOVERY verwenden, können Sie nicht erteilen select-Anweisungen darauf. Wenn statt NORECOVERY Sie die Standby-Option verwenden, können Sie wählen Sie Abfragen auf der Datenbank ausgeführt. Denken Sie daran, mit der Standby-Option, wenn Protokolldatei Wiederherstellungen Benutzer auftreten werden ohne Vorwarnung werden durch den Wiederherstellungsprozess hinausgeworfen. Akut, wenn Sie den Protokollversand mit Standby-Option zu konfigurieren, können Sie auch zwischen zwei Möglichkeiten wählen - alle Prozesse in der sekundären Datenbank töten und oder führen Sie Wiederherstellung durchführen Protokoll nicht wiederherstellen log, wenn die Datenbank verwendet wird. Natürlich, wenn Sie die zweite Option wählen, führen Sie der Wiederherstellungsvorgang möglicherweise nie, wenn jemand eine Verbindung zur Datenbank wird geöffnet und es nicht schließen, so ist es besser, die erste Option zu verwenden.

Also meine Fragen sind:

  • Ist die oben wahr? Kann man wirklich nicht Versand im Weg einloggen verwende ich die Absicht?
  • Wenn es wahr ist, könnte jemand erklären, warum Sie nicht SELECT-Anweisungen in einer Datenbank ausführen können, während das Transaktionsprotokoll wiederhergestellt wird?

EDIT:

Die erste Frage ist Duplikat href="https://serverfault.com/questions/82846/sql-log-shipping-for-reporting">. Aber ich würde immer noch die zweite Frage wie beantwortet: Warum ist es nicht möglich, SELECT-Anweisungen auszuführen, während das Transaktionsprotokoll gestellt wird

War es hilfreich?

Lösung

  

könnte jemand erklären, warum kann man nicht   ausführen, um eine SELECT-Anweisungen   Datenbank, während das Transaktionsprotokoll   wird wiederhergestellt?

Kurze Antwort ist, dass RESTORE-Anweisung nimmt eine exklusive Sperre für die Datenbank gestellt werden.

Für schreibt, ich hoffe, dass es für mich keine Notwendigkeit zu erklären, warum sie mit einer Wiederherstellung nicht kompatibel ist. Warum erlaubt es auch nicht liest? Zunächst einmal gibt es keine Möglichkeit zu wissen, ob eine Sitzung, die eine Sperre auf einer Datenbank hat wird eine Lese- oder eine Schreib tun. Aber selbst wenn es möglich wäre, wieder herstellen (log oder Backup) ist eine Operation, die direkt auf die Datenseiten in der Datenbank aktualisiert. Da dieses Updates gehen Sie direkt auf den physischen Speicherort (die Seite) und nicht der logische Hierarchie (Metadaten-Partition-Seite-Reihe) folgen, würden sie möglich Absichtssperren von anderen Daten Lesern nicht ehren, und damit die Möglichkeit hat, Strukturen zu verändern wie sie gelesen werden . Ein SELECT-Table-Scan im Anschluss an der Seite der nächsten i.Vj. Zeigers würde in Unordnung geworfen werden, in einem beschädigten Lese führt.

Andere Tipps

Nun ja und nein.

Sie können genau das tun, was Sie tun wollen, dass Sie Reporting-Workloads auf einem sekundären Server durch Konfigurieren des Protokollversands auf eine Nur-Lese-Kopie einer Datenbank auslagern kann. Ich habe diese Art von Architektur aufgebaut auf einer Reihe von Gelegenheiten zuvor und es funktioniert sehr gut in der Tat.

Der Nachteil ist, dass, um eine Wiederherstellung einer Transaktionsprotokollsicherungsdatei ausführen muß keine andere Verbindungen zu der Datenbank in Frage. Daher sind die beiden Möglichkeiten zu sein, wenn der Wiederherstellungsvorgang läuft wird es entweder nicht, wodurch Benutzerverbindungen Priorisierung, oder es wird durch Trennen Sie alle Benutzer-Verbindung, um erfolgreich die Wiederherstellung durchführen.

Abhängig von der Wiederherstellungsfrequenz ist dies nicht unbedingt ein Problem. Sie einfach Ihre Benutzer auf die Tatsache erziehen, dass, sagen wir jede Stunde bei 10 nach der vollen Stunde gibt es eine Möglichkeit, dass Ihr Bericht fehlschlagen. Wenn dies geschieht einfach erneut ausführen den Bericht.

EDIT: Sie können auch alternative architeciture Lösungen für Ihr Unternehmen benötigen bewerten möchten. Zum Beispiel Transaktionsreplikation oder Datenbankspiegelung mit einer Datenbank Snapshot

Wenn Sie Enterprise-Version haben, können Sie die Datenbankspiegelung + Snapshot verwenden schreibgeschützte Kopie der Datenbank zu erstellen, für Reporting etc. Mirroring „kontinuierlich“ Protokollversand „unter der Haube“ verwendet. Es wird häufig in Szenario verwenden Sie beschrieben haben.

Ja, es ist wahr.

Ich denke, passiert folgendes:
Während das Transaktionsprotokoll gestellt wird, wird die Datenbank gesperrt, da große Teile davon aktualisiert werden.
Dies ist aus Gründen der Leistung mehr als alles andere.

Ich kann zwei Optionen zur Verfügung:

  1. Verwenden der Datenbankspiegelung.
  2. Planen Sie den Protokollversand nur dann auftreten, wenn das Meldesystem nicht in Gebrauch ist.

Leichte Verwirrung, dass die NORECOVERY Flagge auf der Wiederherstellung bedeutet, dass Ihre Datenbank wird aus einem Wiederherstellungszustand und in einen Online-Zustand nicht gehen zu gebracht - das ist, warum die select-Anweisungen werden nicht funktionieren - die Datenbank offline ist. Die No-Recovery-Flag gibt es, damit Sie, ohne daß die Datenbank wieder online mehrere Protokolldateien in einer Reihe (in einem DR-Typ-Szenario) wiederherzustellen.

Wenn Sie nicht Schiff anmelden wollten / die Nachteile haben Sie auf eine Art und Weise einer Transaktionsreplikation tauschen könnten, aber der Aufwand / Set-up wird komplexer sein Gesamt.

Möchten Peer-to-Peer-Replikation Arbeit. Dann können Sie Abfragen auf einer Instanz laufen und so die Last auf der ursprünglichen Instanz speichern.

scroll top