Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Binärspeicher mit BLOB VS OS-Dateisystem:große Dateien, große Mengen, große Probleme

Ich arbeite an einem großen Softwaresystem, das beide Mechanismen zum Speichern von Anhängen und anderen Inhalten bietet. Die erste Iteration des Systems speicherte alle Daten in BLOBs in der DB. Ich habe es damals verflucht. Als Programmierer konnte ich Nebenskripte schreiben, um sofort mit den Daten zu arbeiten und sie zu ändern, wann immer ich wollte.

Vor ungefähr 10 Jahren verwalte ich immer noch dieselbe Software, aber die Architektur hat sich geändert und sie wurde mit Dateisystemzeigern geschrieben. Ich verfluche es jetzt und wünschte, es wäre wieder in der DB. Ich habe den zusätzlichen Vorteil von mehreren Jahren und nachdem ich diese Anwendung in viel größerer Kapazität in viel mehr und vielen größeren Situationen gearbeitet habe, fühle ich mich jetzt besser informiert. Die Förderung oder Systemmigration der Anwendung erfordert umfangreiche Skripterstellung und das Kopieren von Millionen von Dateien. Einmal haben wir das Betriebssystem geändert und alle Dateizeiger hatten das falsche Verzeichnistrennzeichen, oder der Servername änderte sich, wo sich die Datei befand, und wir mussten einfache SQL-Aktualisierungsanweisungen mit dem DBA am Wochenende schreiben und planen, um das Problem zu beheben. Ein weiterer Grund ist, dass das Dateisystem und die DB-Datensätze nicht mehr synchron sind, warum ist ungewiss, aber nach Tausenden von Betriebstagen werden manchmal nicht transaktionale Systeme (Dateisystem und DB teilen keine Transaktionskontexte) einfach nicht mehr synchron. Manchmal gehen Dateien auf mysteriöse Weise verloren.

Als all dies in der DB war, war die Migration oder Umweltförderung eine Frage des Dump und Importierens der DB. Zeilenänderungen können ordnungsgemäß überwacht werden, alles ist synchron und Protokolle können bei Bedarf zum Zeitpunkt wiedergegeben werden. Sicher, die DB wird groß, aber es ist 2011 und dieses Zeug ist einfach keine Herausforderung für Datenbanken.

Für das, was es wert ist, hatten wir einige ähnliche Probleme mit großen Datenpuffern, wenn einige Daten gestreamt wurden, aber A) wir konnten die Daten in Byte-Puffer mit Input|OutputStreams in JDBC pumpen und B) bei Verwendung anderer Tools haben wir eine gespeicherte Prozedur geschrieben das würde das BLOB in eine temporäre Tabelle zerlegen und iterativ die Chunks aus der temporären Tabelle bereitstellen. Funktioniert super.

Es ist mir egal, was der technische Grund für nicht ist dieses Zeug in die DB zu schreiben, aber es ist viel einfacher Um an einem konsolidierten Ort zu verwalten, könnte ich die Hardware verdoppeln und verdreifachen oder die Datenbank für die von Beratern und Kunden verschwendete Zeit in nur kurzer Zeit mit der Verwaltung der unterschiedlichen Dateien vernetzen.

Update:Seien Sie vorsichtig mit den Kommentatoren, sie geben nur ihre Meinung zu diesem Thema ab.