Teilen von Daten zwischen SQL-Datenbanken
Ich versuche, ein problem zu lösen, dass für einmal ich nicht erstellen.
Ich arbeite in einer Umgebung mit vielen web-apps unterstützt, die von verschiedenen Datenbanken auf verschiedenen Servern.
Jede Datenbank ist ziemlich einzigartig in seiner Konstruktion und Anwendung, aber es bleibt immer noch die gemeinsamen Daten in jedem, die würde ich gerne Abstrakt. Jede Datenbank, zum Beispiel hat eine Anbieter-Tabelle, eine Tabelle Benutzer, etc...
Ich würde gerne Abstrakt aus diesem gemeinsamen Daten in einer einzigen Datenbank, aber immer noch lassen die anderen Datenbanken join über diese Tabellen, die haben sogar Schlüssel, um Einschränkungen zu erzwingen, etc... ich bin in einer MsSql-Umgebung.
Was sind die verfügbaren Optionen? So wie ich das sehe habe ich folgende Optionen:
- Verbindungsserver
- Nur-lese-Anmeldungen zu geben, den Zugang zu Ansichten
Gibt es sonst noch etwas zu beachten?
InformationsquelleAutor der Frage Matt | 2013-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es viele Möglichkeiten, wie Sie könnte, dieses problem anzugehen. Ich würde dringend empfehlen, entweder die Lösungen 1, 2, oder 3, je nach Ihren geschäftlichen Bedürfnissen:
Die Transaktionsreplikation: Wenn die gemeinsame Datenbank ist die Aufzeichnung von Konto und Sie möchten nur-lese-Versionen der Daten in separaten Anwendungen, dann können Sie replizieren die core-Tabellen, möglicherweise sogar den Kern Spalten von Tabellen, zu jedem anderen server. Ein Vorteil dieser Methode ist, dass Sie replizieren kann, wie viele Abonnenten-Datenbanken, wie Sie wollen. Dies bedeutet auch, Sie können anpassen, welche Tabellen und Felder stehen zur Verfügung, um die Abonnenten, basierend auf Ihre Bedürfnisse. Also, wenn eine Anwendung muss der Benutzer die Tabellen und nicht Verkäufer-Tabellen, dann hast du nur abonnieren, um die user-Tabellen. Wenn der andere nur braucht, Lieferanten-Tabellen verwendet werden und nicht Benutzer-Tabellen, dann kannst du dich auf der Verkäufer-Tische nur. Ein weiterer Vorteil ist, dass die Replikation hält sich synchronisiert, und Sie können jederzeit ein Abonnement erneut initialisieren, wenn ein problem auftaucht.
Habe ich verwendet, Transaktions-Replikation-push-über 100 Tabellen aus einem data warehouse zu trennen downstream-Anwendungen, die benötigt Zugriff auf aggregierte Daten aus mehreren Systemen. Da unser data warehouse wurde aktualisiert auf eine Stündliche geplant von Spiegel und Protokollversand Datenquellen, die Produktion Anwendungen Daten aus zahlreichen Systemen innerhalb eines gleitenden Fensters von 20 bis 80 Minuten jede Stunde.
Peer-zu-Peer-Transaktionsreplikation als eine Veröffentlichung, die Art möglicherweise besser geeignet für den Einsatz-Fall Sie zur Verfügung gestellt. Dies kann sehr hilfreich sein, wenn Sie wollen, um roll-out-schema oder die Replikation der änderungen, die Knoten, die von Knoten. Der standardmäßigen Transaktionsreplikation hat einige Einschränkungen in diesem Bereich.
Snapshot-Replikation Veröffentlichung Typen hat mehr Latenz als Transaktionsveröffentlichungen, aber möchten Sie vielleicht zu berücksichtigen, wenn ein Grad der Latenz akzeptabel ist.
Obwohl Sie erwähnt werden, Sie sind ein Microsoft SQL-Server, shop, bitte beachten Sie andere RDBMs haben ähnliche Technologien. Seit Sie reden über MS-SQL-Server bitte beachten Sie insbesondere, transactional replication können Sie die Replikation von Oracle-Datenbanken zu. Also, wenn Sie ein paar von diesen in Ihrem Unternehmen, kann diese Lösung noch funktioniert.
Einen Nachteil bei der Transaktionsreplikation ist, dass, wenn Ihr server ausfällt, können Sie anfangen zu erleben die Latenz mit Daten in der downstream-Kopien der replizierten Objekte. Wenn die replizierten Objekte (Gegenstände) sind wirklich groß und Sie müssen neu zu initialisieren einer Tabelle, dann kann eine wirklich lange Zeit zu tun, auch.
Spiegel: Wenn Sie möchten, um die Datenbank zugänglich, in der Nähe von real-time downstream-Server, könnten Sie setup bis zu zwei asynchronen Spiegel. Ich habe integrierte Daten mit einer CRM-Anwendung auf diese Weise. Alle liest, kam aus dem tritt zum Spiegel. Alle schreibt geschoben wurden, um eine message-queue, die dann angewandt, die änderungen an die zentrale Produktions-server. Der Nachteil dieses Ansatzes ist, dass man nicht mehr als 2 asynchrone Spiegel. Sie wollen nicht, synchrone Spiegel für diesen Zweck, es sei denn, Sie planen, verwenden Sie den Spiegel für die Notfallwiederherstellung, zu.
Messaging-Systeme: Wenn Sie erwarten, dass zahlreiche separate Anwendungen, die Daten aus einer zentralen Datenbank, dann möchten Sie vielleicht zu prüfen, enterprise-messaging-Systeme wie IBM Web-Sphere, Microsoft BizTalk, Vitria, TIBCO, etc. Diese Anwendungen sind speziell auf dieses problem anzusprechen. Sie neigen dazu, teuer und umständlich zu implementieren und zu pflegen, aber Sie skalieren kann, wenn Sie Global verteilte Systeme, oder die Dutzende von separaten Anwendungen, die alle Daten gemeinsam nutzen müssen zu einem gewissen Grad.
Verbindungsserver: Es klingt wie Sie bereits dachte. Könnte man aussetzen, die Daten über linked Server. Ich glaube nicht, dass dies eine gute Lösung. Wenn Sie wirklich wollen, diesen Weg zu gehen, dann überlegen Sie sich, ob eine asynchrone spiegelung aus der zentralen Datenbank auf einen anderen server und dann setup verknüpfte Serververbindungen mit dem Spiegel. Dies wird zumindest das Risiko mindern, dass eine Abfrage von web-Anwendungen verursachen, Sperrung oder performance-Probleme mit Ihrem zentralen Produktionsdatenbank.
IMO, verlinkten Servern neigen dazu, eine gefährliche Methode für den Austausch von Daten für Anwendungen. Dieser Ansatz behandelt die Daten als Bürger zweiter Klasse in Ihrer Datenbank. Es führt zu einigen ziemlich schlecht Codierung Gewohnheiten, besonders da die Entwickler daran arbeiten, auf verschiedenen Servern in verschiedenen Sprachen, mit verschiedenen Methoden für die Verbindung. Sie weiß nicht, ob jemand schreibt ein wirklich henious Abfrage gegen Ihre Kern-Daten. Wenn Sie einen standard gesetzt, erfordert das drücken einer vollständigen Kopie der gemeinsam genutzten Daten bis auf die non-core-server, dann müssen Sie sich nicht darum zu sorgen, ob oder nicht ein Entwickler schreibt schlechten code. Zumindest aus der Perspektive, dass Ihre schlechten code nicht jeapordize die Leistung des anderen gut geschrieben-Systeme.
Gibt es viele, viele Ressourcen gibt, die erklären, warum die Verwendung von Verknüpften Servern kann schlecht sein, in diesem Zusammenhang. Eine nicht erschöpfende Liste der Gründe, die umfasst: (a) das Konto für die verknüpften server muss DBCC ZEIGEN STATISTIKEN, Berechtigungen oder die Abfragen werden nicht in der Lage, bestehende Statistiken(b) query-hints nicht sein kann uesd, es sei denn, eingereicht als OPENQUERY (c) können die Parameter nicht übergeben werden, wenn verwendet mit OPENQUERY, (d) der server nicht über ausreichende Statistiken über die verknüpften server befindet, wird folglich schafft ziemlich schrecklich Abfrage-Pläne (e) Netzwerk-Konnektivität Probleme können zu Ausfällen führen, (f) jeder dieser fünf performance-Problemeund (g) die gefürchtete SSPI-Kontext-Fehler beim Authentifizierung windows active directory-Anmeldeinformationen in einem double-hop-Szenario. Verknüpfte Server kann nützlich sein, für bestimmte Szenarien, aber die Gebäude auf eine zentrale Datenbank zugreifen um diese Funktion, obwohl technisch möglich, wird nicht empfohlen.
Bulk-ETL-Prozess: Wenn eine hohe Latenz ist akzeptabel für die web-Anwendungen, dann könnten Sie schreiben, bulk ETL-Prozesse mit SSIS (viele gute links in diesem StackOverflow-Frage)die ausgeführt werden, durch die SQL Server-agent-Aufträge zum verschieben von Daten zwischen Servern. Es gibt auch andere alternative ETL-tools wie Informatica, Pentaho, etc., so verwenden Sie, was für Sie am besten funktioniert.
Dies ist nicht eine gute Lösung, wenn Sie einen niedrigen Grad der Latenz. Ich habe diese Lösung, wenn die Synchronisierung zu einem 3rd-party-hosted-CRM-Lösung für die Felder, könnte tolerieren, hohe Latenzzeiten. Für Felder, die nicht dulden konnte, hohe Latenz (basic-Konto erstellen-Daten) wir verlassen auf doppelte Datensätze im CRM durch web-service-Aufrufe an der Stelle von Konto-generation.
Nächtlichen Sicherung und Wiederherstellung: Wenn Sie Ihre Daten verträgt hohe Grad der Latenz (bis zu einem Tag), sowie Zeiten der Nichtverfügbarkeit, dann könnte man sichern und wiederherstellen der Datenbank über mehrere Umgebungen hinweg. Dies ist nicht eine gute Lösung für web-Anwendungen, die 100% up-Zeit. Die Idee ist, dass man ein Basis-backup, die Wiederherstellung es zu einem separaten wiederherstellen Namen, benennen Sie die ursprüngliche Datenbank und die neue ein, sobald der neue ist bereit für den Einsatz. Ich habe dies getan, für einige internen Anwendungen der website, aber ich im Allgemeinen nicht empfehlen, diesen Ansatz. Das ist besser geeignet für einen geringeren Entwicklungs-Umgebung, nicht in einer Produktionsumgebung.
Log-Versand "Secondaries": Man könnte das setup Protokollversand zwischen der primären und einer beliebigen Anzahl von Wicklungen. Dies ist ähnlich wie die nächtlichen backup-und restore-Prozess, außer dass Sie aktualisieren die Datenbank Häufig. In einem Fall diese Lösung wurde verwendet, um die zu entlarven, die Daten aus einer unserer wichtigsten Kern-systems für nachgeschaltete Anwender durch Umschalten zwischen zwei log-Versand-Empfänger. Es war ein anderer server, der zeigte den beiden Datenbanken und wechselte zwischen Ihnen, wenn die neuen verfügbar war. Ich hasse diese Lösung, aber das eine mal, als ich sah, diese Umsetzung ist es hat die Bedürfnisse des Unternehmens.
InformationsquelleAutor der Antwort Registered User
Könnte man auch erwägen, vordefinierte SQL-Server-Replikation zwischen common-data-store-und app-DBs. Aus meiner Erfahrung ist es gut geeignet für zwei-Wege-Datenübertragung, und es ist eine Instanz der Tabellen in jeder db ermöglicht Einsatz von foreign keys (ich glaube nicht, dass FKs sind möglich via linked server).
InformationsquelleAutor der Antwort mweber
Kann es andere Optionen, aber denken, Sie sind genau der richtige track für die beste option mit einer Kombination von linked Server und views. Dies könnte so einfach wie das erstellen einer neuen Datenbank, das hinzufügen von zwei miteinander verbundenen Servern, Einstellung der Berechtigungen und erstellen die notwendigen anzeigen.
Wenn Sie Ihre Ziele sind zu
abstract out this common data to a single database but still let the other databases join on these tables, even have keys to enforce constraints
dann diese Lösung sollte funktionieren.Auf der Seite nach unten, die Sie ausführen können in performance-Probleme mit verknüpften Servern, so dass, wenn Sie sehen die Datenbank immer viel Verkehr, dann möchten Sie vielleicht zu schauen, in tatsächlich verschieben der Daten mithilfe der Methoden, Doug oder mwebber vorgeschlagen.
Wenn man die verlinkten server route, die ich empfehlen würde Lesen auf
OPENQUERY
. Gibt es einen guten Artikel aufOPENQUERY
vs 4 Teil-IDS hier.InformationsquelleAutor der Antwort Abe Miessler
Werfen Sie einen Blick auf die Microsoft Sync Framework. Sie haben zu schreiben, eine sync-app, aber es könnte Ihnen die Flexibilität, die Sie brauchen.
InformationsquelleAutor der Antwort Doug L.
Ich denke, Sie sollten einen guten Blick auf die Replikation, wie viele Antworten bereits gesagt haben, vor allem in einem high-TPS-Umgebung, oder Sie möchten diese auf vielen Tischen. Aber, ich werde einige code, wie ich das erreichen Ihrer gesetzten Ziele in einigen meiner Systeme Verbindungsserver, Synonyme und check-Einschränkungen.
Können Sie die Einstellungen einer Ansicht oder synonym in Ihren Datenbanken an einem gemeinsamen Tisch in einem verknüpften server (oder einer anderen lokalen DB). Ich bevorzuge Synonyme, wenn die anzeigen würden habe gerade
select * from table
sowieso.Einer Tabelle synonym ermöglicht Ihnen das ausführen von DML auf das remote-Element, wenn Sie über Berechtigungen verfügen.
Zu diesem Zeitpunkt, obwohl, können Sie nicht haben einen foreign key auf die Ansicht oder synonym, aber wir können erreichen, etwas ähnliches mit einer check-Einschränkung.
Lassen Sie uns sehen, einige code:
Natürlich, es ist wichtig zu beachten, dass Sie nicht erhalten eine Fehlermeldung, wenn Sie das löschen einer referenzierten Datensatz in der zentralen Tabelle.
InformationsquelleAutor der Antwort Tim Lehner