Drei Implementierungsmethoden für die MySQL-Kopiertabelle und die Grant-Analyse

Drei Implementierungsmethoden für die MySQL-Kopiertabelle und die Grant-Analyse

So kopieren Sie schnell eine Tabelle

Erstellen Sie zunächst eine Tabelle db1.t und fügen Sie 1000 Datenzeilen ein. Erstellen Sie gleichzeitig eine Tabelle db2.t mit derselben Struktur.

Angenommen, wir müssen die Datenzeilen mit a>900 in db1.t exportieren und in db2.t einfügen.

mysqldump-Methode

Einige wichtige Parameterhinweise:

  • –single-transaction wird verwendet, um Daten zu exportieren, ohne die Tabelle db1.t zu sperren.
  • Methode zum Starten einer Transaktion mit einem konsistenten Snapshot;
  • –no-create-info bedeutet, dass die Tabellenstruktur nicht exportiert werden muss;
  • –result-file gibt den Pfad der Ausgabedatei an, wobei „Client“ bedeutet, dass sich die generierte Datei auf dem Clientcomputer befindet.

CSV-Datei exportieren

Wählen Sie * aus db1.t, wobei a>900 in die Ausgabedatei „/server_tmp/t.csv“;

Diese Anweisung speichert das Ergebnis auf dem Server. Wenn sich der Client, auf dem Sie den Befehl ausführen, und der MySQL-Server nicht auf demselben Computer befinden, wird die Datei t.csv nicht im temporären Verzeichnis des Client-Computers generiert.

Dieser Befehl überschreibt die Datei nicht für Sie, Sie müssen also sicherstellen, dass die Datei /server_tmp/t.csv nicht existiert, da sonst beim Ausführen der Anweisung ein Fehler gemeldet wird, weil eine Datei mit gleichem Namen existiert.

Nachdem Sie die CSV-Exportdatei erhalten haben, können Sie den folgenden Befehl zum Laden von Daten verwenden, um die Daten in die Zieltabelle db2.t zu importieren.

Daten aus der Datei „/server_tmp/t.csv“ in die Tabelle db2.t laden;

Öffnen Sie die Datei /server_tmp/t.csv, verwenden Sie das Tabulatorzeichen (\t) als Trennzeichen zwischen Feldern und das Zeilenumbruchzeichen (\n) als Trennzeichen zwischen Datensätzen und lesen Sie die Daten.

Starten Sie eine Transaktion.

Bestimmen Sie, ob die Anzahl der Felder in jeder Zeile mit der Anzahl in der Tabelle db2.t übereinstimmt:

  • Wenn sie unterschiedlich sind, wird direkt ein Fehler gemeldet und die Transaktion zurückgesetzt.
  • Wenn sie gleich sind, wird eine Zeile erstellt, die Schnittstelle der InnoDB-Engine aufgerufen und die Daten in die Tabelle geschrieben.

Wiederholen Sie Schritt 3, bis die gesamte Datei /server_tmp/t.csv eingelesen ist, und bestätigen Sie die Transaktion.

Methode der physischen Kopie

Sowohl die mysqldump-Methode als auch die Methode zum Exportieren von CSV-Dateien sind logische Datenimportmethoden, d. h. Daten werden aus der Tabelle db1.t gelesen, Text generiert und anschließend in die Zieltabelle db2.t geschrieben. Gibt es eine Möglichkeit, Daten physisch zu importieren? Ist es beispielsweise möglich, die .frm-Datei und die .ibd-Datei der db1.t-Tabelle direkt in das db2-Verzeichnis zu kopieren? Die Antwort ist nein.

Denn zusätzlich zu diesen beiden physischen Dateien muss eine InnoDB-Tabelle auch im Datenwörterbuch registriert sein. Wenn Sie diese beiden Dateien direkt kopieren, werden sie vom System nicht erkannt und akzeptiert, da im Datenwörterbuch keine db2.t-Tabelle vorhanden ist.

MySQL 5.6 führte die Methode transportierbarer Tablespaces ein, die die Funktion des physischen Kopierens von Tabellen durch Exportieren und Importieren von Tablespaces erreichen kann.

Angenommen, das aktuelle Ziel besteht darin, eine Tabelle r zu kopieren, die mit der Tabelle t in der Datenbank von db1 identisch ist. Die spezifischen Ausführungsschritte sind wie folgt:

  • Führen Sie „create table r like t“ aus, um eine leere Tabelle mit derselben Tabellenstruktur zu erstellen.
  • Führen Sie „alter table r discard tablespace“ aus, dann wird die Datei r.ibd gelöscht
  • Führen Sie zum Exportieren „Flush Table t“ aus. Es wird eine t.cfg-Datei generiert.
  • Führen Sie die folgenden beiden Befehle im Verzeichnis db1 aus: cp t.cfg r.cfg; cp t.ibd r.ibd;
  • Führen Sie die Funktion „Tabellen entsperren“ aus. Die Datei t.cfg wird gelöscht.
  • Führen Sie „alter table r import tablespace“ aus und verwenden Sie die Datei r.ibd als neuen Tablespace für Tabelle r. Da der Dateninhalt dieser Datei mit dem von t.ibd identisch ist, enthält Tabelle r dieselben Daten wie Tabelle t.

Vor- und Nachteile dieser drei Methoden

Die physische Kopiermethode ist die schnellste, insbesondere zum Kopieren großer Tabellen. Es muss jedoch eine vollständige Kopie sein, keine Teilkopie. Daten müssen auf den Server kopiert werden. Es kann nicht verwendet werden, wenn sich der Benutzer nicht beim Datenbankhost anmelden kann. Darüber hinaus müssen sowohl die Quelltabelle als auch die Zieltabelle die InnoDB-Engine verwenden.

Wenn Sie mysqldump zum Generieren einer Datei mit INSERT-Anweisungen verwenden, können Sie dem Where-Parameter Filterbedingungen hinzufügen, um nur einen Teil der Daten zu exportieren. Einer der Nachteile dieser Methode besteht darin, dass sie keine komplexeren Where-Bedingungen wie „Join“ verwenden kann.

Die Methode „Select ... into outfile“ ist die flexibelste und unterstützt alle SQL-Schreibmethoden. Zu den Nachteilen dieser Methode gehört allerdings, dass immer nur die Daten einer Tabelle exportiert werden können und die Tabellenstruktur zudem mit einem weiteren Anweisung separat gesichert werden muss.

Die beiden letztgenannten Methoden sind logische Backups und können Engine-übergreifend verwendet werden.

Globale MySQL-Berechtigungen

SELECT * FROM MYSQL.USER WHERE USER='UA'\G Alle Berechtigungen anzeigen

Der Umfang umfasst das gesamte MySQL und die Informationen werden in der Benutzertabelle von MySQL gespeichert.

Gewähren Sie dem Benutzer ua die höchste Berechtigung:

grant all privileges on *.* to 'ua'@'%' with grant option;

Dieser Grant-Befehl bewirkt zwei Dinge: Er ändert die Berechtigungsfelder in der mysql.user-Tabelle auf der Festplatte auf Y und ändert den Zugriffswert des entsprechenden Objekts des Benutzers im acl_user im Speicher auf „alle 1“.

Wenn sich ein neuer Client erfolgreich mit dem Benutzernamen ua anmeldet, verwaltet MySQL ein Thread-Objekt für die neue Verbindung. Alle Entscheidungen über globale Berechtigungen werden direkt anhand der im Thread-Objekt gespeicherten Berechtigungsbits getroffen.

Der Befehl „Grant“ aktualisiert die Festplatte und den entsprechenden Speicher für globale Berechtigungen. Die neu erstellte Verbindung verwendet die neuen Berechtigungen. Die globalen Berechtigungen der bestehenden Verbindung werden durch die Gewährung nicht beeinflusst.
Wenn Sie die oben genannten Berechtigungen widerrufen möchten:

revoke all privileges on *.* from 'ua'@'%';

Es gibt auch zwei entsprechende Vorgänge. Das Berechtigungsfeld auf der Festplatte wird auf Bit N geändert und der Zugriffswert des Objekts im Speicher wird auf Bit 0 geändert.

mysqlDB-Berechtigungen

grant all privileges on db1.* to 'ua'@'%' with grant option;

Verwenden Sie SELECT * FROM MYSQL.DB WHERE USER = 'UA'\G, um die Datenbankberechtigungen des aktuellen Benutzers sowie die Berechtigungen zum Ändern von Objekten auf der Festplatte und im Speicher anzuzeigen.

Die Datenbankberechtigungen werden in der Tabelle mysql.db gespeichert.

Hinweis: Im Gegensatz zu globalen Berechtigungen wirken sich Datenbankberechtigungen auf vorhandene Verbindungsobjekte aus.

MySQL-Tabellenberechtigungen und Spaltenberechtigungen

Tabellenberechtigungen werden in mysql.tables_priv gespeichert, Spaltenberechtigungen werden in mysql.columns_priv gespeichert und diese beiden Berechtigungstypen werden kombiniert und in der Hash-Struktur column_priv_hash im Speicher gespeichert.

Ähnlich wie bei Datenbankberechtigungen wird jedes Mal, wenn diese beiden Berechtigungen erteilt werden, die Datentabelle geändert und die Hash-Struktur im Speicher wird synchron geändert. Daher wirkt sich der Betrieb dieser beiden Berechtigungstypen auch auf vorhandene Verbindungen aus.

Verwenden Sie Szenarien für das Leeren von Berechtigungen

In einigen Dokumenten wird erwähnt, dass der Befehl „Flush Privileges“ unmittelbar nach der Gewährung von Berechtigungen ausgeführt werden muss, damit die Grant-Anweisung wirksam wird. Tatsächlich sollte eine genauere Aussage lauten: Wenn die Berechtigungen in der Datentabelle nicht mit den Berechtigungsdaten im Speicher übereinstimmen, kann die Anweisung „Flush Privileges“ verwendet werden, um die Speicherdaten neu aufzubauen und einen konsistenten Zustand zu erreichen.

Wird beispielsweise zu einem bestimmten Zeitpunkt ein Datensatz einer Datentabelle gelöscht, die Daten im Speicher sind aber weiterhin vorhanden, schlägt die Autorisierung des Benutzers fehl, da der Datensatz in der Datentabelle nicht gefunden werden kann.
Gleichzeitig funktioniert die Neuerstellung dieses Benutzers nicht, da bei der Beurteilung im Speicher davon ausgegangen wird, dass dieser Benutzer noch existiert.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So verwenden Sie den MySQL-Autorisierungsbefehl „grant“
  • Eine kurze Erklärung zum Erteilen und Entziehen von Berechtigungen in MySQL
  • Befehl zur Erteilung von Berechtigungen in der MySQL-Verwaltung zum Erstellen von Notizen
  • Detaillierte Erklärung des MySQL Grant-Befehls
  • Hinweise zu MySQL-Grants
  • Implementierung der MySQL GRANT-Benutzerautorisierung

<<:  Linux-Installation, MongoDB-Start und Lösung allgemeiner Probleme

>>:  Natives JS zur Implementierung eines Bildkarussells. JS zur Implementierung eines kleinen Werbe-Plugins.

Artikel empfehlen

Analyse des Verwendungsbeispiels für den Common Table Expression CTE in mysql8

Dieser Artikel beschreibt anhand eines Beispiels ...

Vue implementiert die Benutzeranmeldungsumschaltung

In diesem Artikelbeispiel wird der spezifische Co...

Implementierung der Benutzerregistrierungsfunktion mit js

In diesem Artikelbeispiel wird der spezifische Co...

So verwenden Sie die JSX-Syntax richtig in Vue

Inhaltsverzeichnis Vorwort Virtueller DOM Was ist...

Fassen Sie die häufigsten Anwendungsprobleme von XHTML-Code zusammen

Im Laufe der Zeit habe ich festgestellt, dass vie...

Mit CSS3 implementierter Gradienten-Folieneffekt

Ergebnisse erzielen Code html <div Klasse=&quo...

Prometheus überwacht MySQL mithilfe der Grafana-Anzeige

Inhaltsverzeichnis Prometheus überwacht MySQL übe...

Detaillierte Erklärung zur Verwendung von CSS3 RGB und RGBA (transparente Farbe)

Ich glaube, jeder Mensch ist sehr sensibel für Fa...

Lösung für mehrere 302-Antworten im Nginx-Proxy (Nginx Follow 302)

Proxying mehrerer 302er mit proxy_intercept_error...

Eine Zusammenfassung der Fuzzy-Abfrage von MySQL wie

1. Allgemeine Verwendung: (1) Mit % verwenden % s...

Implementierung von Socket-Optionen in der Linux-Netzwerkprogrammierung

Socket-Optionsfunktion Funktion: Methoden zum Les...

Swiper+echarts realisiert den Links- und Rechts-Scrolleffekt mehrerer Dashboards

In diesem Artikel wird der spezifische Code von S...