So stellen Sie eine einzelne Datenbank oder Tabelle in MySQL wieder her und mögliche Fallstricke

So stellen Sie eine einzelne Datenbank oder Tabelle in MySQL wieder her und mögliche Fallstricke

Vorwort:

Das am häufigsten verwendete logische MySQL-Backup-Tool ist mysqldump. Im Allgemeinen sichern wir die gesamte Instanz oder einen Teil der Geschäftsdatenbank. Ich bin nicht sicher, ob Sie eine Wiederherstellung durchgeführt haben. Es kann viele Wiederherstellungsszenarien geben, z. B. das Wiederherstellen einer Datenbank oder einer Tabelle. Wie stellt man also eine einzelne Datenbank oder Tabelle aus einem vollständigen Backup wieder her? Welche versteckten Fallstricke gibt es? Schauen wir uns diesen Artikel gemeinsam an.

1. So stellen Sie eine einzelne Datenbank oder Tabelle wieder her

Im vorherigen Artikel wurde die Sicherung und Wiederherstellung von MySQL vorgestellt. In jeder unserer Datenbankinstanzen kann es mehr als eine Datenbank geben. Normalerweise soll die Sicherung die gesamte Instanz sichern, aber die Wiederherstellungsanforderungen sind unterschiedlich. Ich möchte beispielsweise nur eine bestimmte Datenbank oder eine bestimmte Tabelle wiederherstellen. Was soll ich jetzt tun?

Wenn die Datenmenge in Ihrer Instanz nicht groß ist, können Sie die gesamte Instanz in einer anderen Umgebung wiederherstellen und dann die erforderliche Datenbank oder Tabelle zur Wiederherstellung separat sichern. Allerdings ist diese Methode nicht flexibel genug und nur anwendbar, wenn die Datenmenge relativ gering ist.

Tatsächlich ist es recht praktisch, eine einzelne Datenbank aus einem vollständigen Backup wiederherzustellen. Es gibt einen Parameter --one-database, mit dem die Wiederherstellung einer einzelnen Datenbank angegeben werden kann. Im Folgenden finden Sie eine konkrete Demonstration:

# Alle Bibliotheken anzeigen und sichernmysql> show databases;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|mysql |
| Leistungsschema |
|sbtest|
|System|
|testdb|
| testdb2 |
+--------------------+

mysqldump -uroot -pxxxx -R -E --single-transaction --all-databases > all_db.sql

# Löschen Sie die Testdb-Datenbank und führen Sie eine einzelne Datenbankwiederherstellung durch mysql> drop database testdb;
Abfrage OK, 36 Zeilen betroffen (2,06 Sek.)

# Wenn die Testdb-Datenbank vor der Wiederherstellung nicht vorhanden ist, müssen Sie sie manuell erstellen: mysql -uroot -pxxxx --one-database testdb < all_db.sql

Zusätzlich zu den oben genannten Methoden können Sie auch eine manuelle Überprüfung verwenden, um eine einzelne Datenbank oder Tabelle wiederherzustellen. Zu diesem Zeitpunkt sind die bekannten sed- und grep-Befehle in Linux praktisch. Wir können diese beiden Befehle verwenden, um die Anweisungen einer einzelnen Datenbank oder einer einzelnen Tabelle aus dem vollständigen Backup herauszufiltern. Die Screening-Methode ist wie folgt:

# Wiederherstellen einer einzelnen Datenbank aus einem vollständigen Backup sed -n '/^-- Aktuelle Datenbank: `testdb`/,/^-- Aktuelle Datenbank: `/p' all_db.sql > testdb.sql

# Einzeltabellenanweisungen herausfiltern cat all_db.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test_tb`/!d;q' > /tmp/test_tb_info.sql 
grep --ignore-case 'insert into `test_tb`' > /tmp/test_tb_data.sql

2. Vorsicht vor Fallstricken

Die oben beschriebene Methode zum manuellen Filtern zur Wiederherstellung einer einzelnen Datenbank oder einer einzelnen Tabelle scheint einfach und bequem zu sein, birgt jedoch tatsächlich eine kleine Tücke. Lassen Sie uns dies im Folgenden im Detail demonstrieren:

# Sichern Sie die gesamte Instanz mysqldump -uroot -pxxxx -R -E --single-transaction --all-databases > all_db.sql

# Manuelles Sichern von test_tb und anschließendes Löschen von test_tb
mysql> Tabelle test_tb_bak wie test_tb erstellen;
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)

mysql> in test_tb_bak einfügen, auswählen * aus test_tb;
Abfrage OK, 4 Zeilen betroffen (0,02 Sek.)
Datensätze: 4 Duplikate: 0 Warnungen: 0

mysql> Tabelle test_tb löschen;
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)

# Filtern Sie die Anweisungen zum Erstellen der Tabelle test_db und zum Einfügen der Daten aus dem vollständigen Backup cat all_db.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test_tb`/!d;q' > test_tb_info.sql 
grep --ignore-case 'insert in `test_tb`' > test_tb_data.sql

# Überprüfen Sie die Anweisung. Sie scheint in Ordnung zu sein. cat test_tb_info.sql

Tabelle löschen, wenn `test_tb` vorhanden ist;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET Zeichensatzclient = utf8 */;
Tabelle erstellen `test_tb` (
 `inc_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren',
 `col1` int(11) NICHT NULL,
 `col2` varchar(20) DEFAULT NULL,
 `col_dt` Datum/Uhrzeit DEFAULT NULL,
 `create_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit',
 `update_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit',
 PRIMÄRSCHLÜSSEL (`inc_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Testtabelle';
/*!40101 SET Zeichensatzclient = @saved_cs_client */;

Katze test_tb_data.sql

INSERT INTO `test_tb` VALUES (1,1001,'dsfs','2020-08-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'),
(2,1002,'vfsfs','2020-09-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'),
(3,1003,'adsfsf',NULL,'2020-09-17 06:19:27','2020-09-17 06:19:27'),
(4,1004,'walfd','2020-09-17 14:19:27','2020-09-17 06:19:27','2020-09-18 07:52:13');

# Führen Sie eine Wiederherstellungsoperation für eine einzelne Tabelle aus mysql -uroot -pxxxx testdb < test_tb_info.sql
mysql -uroot -pxxxx testdb < test_tb_data.sql

# Zeigen Sie die wiederhergestellten Daten an und vergleichen Sie sie mit der Sicherungstabellemysql> select * from test_tb;
+--------+------+--------+---------------------+---------------------+---------------------+
| inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit |
+--------+------+--------+---------------------+---------------------+---------------------+
| 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 |
| 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 |
| 3 | 1003 | adsfsf | NULL | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 |
| 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 06:19:27 | 18.09.2020 07:52:13 |
+--------+------+--------+---------------------+---------------------+---------------------+
4 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus test_tb_bak;
+--------+------+--------+---------------------+---------------------+---------------------+
| inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit |
+--------+------+--------+---------------------+---------------------+---------------------+
| 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 |
+--------+------+--------+---------------------+---------------------+---------------------+
4 Zeilen im Satz (0,00 Sek.)

Wenn Sie genau hinsehen, werden Sie feststellen, dass mit den wiederhergestellten Daten etwas nicht stimmt. Es scheint, dass die Zeit nicht stimmt. Wenn Sie noch einmal genau hinsehen, werden Sie feststellen, dass die Zeit teilweise um 8 Stunden abweicht! Nach eingehender Untersuchung stellten wir fest, dass es ein Problem mit der Wiederherstellung der Zeitdaten des Zeitstempeltypfelds gab. Genauer gesagt zeichnete die Sicherungsdatei die Zeitzone 0 auf, aber unser System verwendet im Allgemeinen die Zeitzone Ost 8, sodass der Fehler von 8 Stunden auftrat.

Dann fragen Sie sich vielleicht, warum es kein Problem geben sollte, wenn alles wiederhergestellt ist? Gute Frage. Um das herauszufinden, werfen wir einen Blick auf die Sicherungsdatei.

# Anfang der Sicherungsdatei – MySQL-Dump 10.13 Distrib 5.7.23 für Linux (x86_64)
--
-- Host: localhost Datenbank:
-- ------------------------------------------------------
--Serverversion 5.7.23-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 NAMEN FESTLEGEN utf8 */;
/*!40103 SETZEN @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SETZE ZEITZONE='+00:00' */; 
Beachten Sie die beiden obigen Zeilen /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SETZEN @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Ende der Sicherungsdatei /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SETZEN SIE FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SETZEN SIE UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@ALTER_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@ALTE_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump abgeschlossen am 18.09.2020 15:56:40

Wenn Sie sich die Sicherungsdatei genau ansehen, werden Sie feststellen, dass in der von mysqldump gesicherten Datei die Sitzungszeitzone zuerst auf 0 und am Ende wieder auf die ursprüngliche Zeitzone geändert wird. Dies bedeutet, dass die in der Sicherungsdatei aufgezeichneten Zeitstempeldaten auf der Zeitzone 0 basieren. Wenn das gefilterte SQL direkt ausgeführt wird, wird der Zeitstempel der Zeitzone 0 in das System der Zeitzone Ost 8 eingefügt, was offensichtlich einen Zeitunterschied von 8 Stunden verursacht.

Ich frage mich, ob Sie verstehen, was ich hier gelesen habe. Wer Erfahrung mit Backup und Wiederherstellung hat, wird es vielleicht leichter verstehen. Die Lösung für das obige Problem ist ebenfalls sehr einfach: Ändern Sie vor dem Ausführen der SQL-Datei die aktuelle Sitzungszeitzone auf 0. Lassen Sie es uns noch einmal demonstrieren:

# Löschen Sie die Tabelle test_db datamysql> truncate table test_tb;
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)

# Fügen Sie die Zeitzonendeklaration am Anfang der Datei vim test_tb_data.sql hinzu
setze Sitzung TIME_ZONE='+00:00';
INSERT INTO `test_tb` VALUES (1,1001,'dsfs','2020-08-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'),
(2,1002,'vfsfs','2020-09-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'),
(3,1003,'adsfsf',NULL,'2020-09-17 06:19:27','2020-09-17 06:19:27'),
(4,1004,'walfd','2020-09-17 14:19:27','2020-09-17 06:19:27','2020-09-18 07:52:13');

# Führen Sie die Wiederherstellung aus und vergleichen Sie, um festzustellen, ob die Daten korrekt sindmysql> select * from test_tb;
+--------+------+--------+---------------------+---------------------+---------------------+
| inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit |
+--------+------+--------+---------------------+---------------------+---------------------+
| 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 |
+--------+------+--------+---------------------+---------------------+---------------------+
4 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus test_tb_bak;
+--------+------+--------+---------------------+---------------------+---------------------+
| inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit |
+--------+------+--------+---------------------+---------------------+---------------------+
| 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 |
| 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 |
+--------+------+--------+---------------------+---------------------+---------------------+
4 Zeilen im Satz (0,00 Sek.)

Zusammenfassen:

Im Internet kann man leicht nach Methoden suchen, um eine einzelne Datenbank oder Tabelle wiederherzustellen. Die meisten davon erwähnen die oben erwähnte Methode der manuellen Überprüfung mithilfe der Befehle sed und grep. Die meisten Artikel erwähnen jedoch keine möglichen Probleme. Wenn Ihr Tabellenfeld den Typ „Zeitstempel“ hat, sollten Sie bei der Verwendung dieser Methode besonders vorsichtig sein. Unabhängig davon, mit welchen Wiederherstellungsanforderungen wir konfrontiert sind, müssen wir besonders vorsichtig sein, damit sich die Situation nicht verschlimmert, je mehr wir wiederherstellen. Am besten ist es, vor der Wiederherstellung eine leere Instanz zum Üben zu haben.

Oben finden Sie Einzelheiten zum Wiederherstellen einer einzelnen Datenbank oder einer einzelnen Tabelle in MySQL sowie Hinweise zu den möglichen Fallstricken. Weitere Informationen zum Wiederherstellen einer einzelnen Datenbank oder einer einzelnen Tabelle in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So stellen Sie einzelne Tabellendaten mithilfe der vollständigen MySQL-Datenbanksicherungsdaten wieder her
  • Schritte zum Wiederherstellen einer einzelnen MySQL-Tabelle
  • So stellen Sie eine Datenbank und eine Tabelle aus einer vollständigen MySQL-Datenbanksicherung wieder her
  • 3 Methoden zum Wiederherstellen der Tabellenstruktur aus einer FRM-Datei in MySQL [empfohlen]
  • InnoDB-Typ MySql stellt Tabellenstruktur und Daten wieder her
  • MySQL-Wiederherstellung angegebener Tabellen und Bibliotheken aus einer vollständigen Datenbanksicherung – Beispiel
  • Detaillierte Erläuterung der Methode zur Wiederherstellung von MySQL-Einzeltabellen-IBD-Dateien
  • MySQL verwendet .frm, um die Datentabellenstruktur wiederherzustellen
  • So verwenden Sie mysqldump zum Sichern und Wiederherstellen bestimmter Tabellen
  • MySQL verwendet frm-Dateien und ibd-Dateien, um Tabellendaten wiederherzustellen

<<:  JavaScript implementiert einfache Rechnerfunktion

>>:  VUE realisiert Registrierungs- und Login-Effekte

Artikel empfehlen

Eine kurze Erläuterung der Rolle des Parameters docker --privileged=true

Mit etwa Version 0.6 wurde Privileged in Docker e...

Detaillierte Erläuterung der Hochverfügbarkeitskonfiguration von Docker

Docker Compose Docker Compose unterteilt die verw...

6 interessante Tipps zum Einstellen von CSS-Hintergrundbildern

Das Hintergrundbild ist wahrscheinlich eine diese...

Optimierte Aufzeichnung der Verwendung von IN-Datenvolumen in Mysql

Die MySQL-Versionsnummer ist 5.7.28. Tabelle A ha...

CentOS 8-Installationsdiagramm (superdetailliertes Tutorial)

CentOS 8 ist offiziell veröffentlicht! CentOS ent...

Reines JavaScript zur Implementierung des Zahlenratespiels

Entwickeln Sie ein Zahlenratespiel, bei dem zufäl...

So starten Sie mehrere MySQL-Instanzen in CentOS 7.0 (mysql-5.7.21)

Konfigurationsanweisungen Linux-System: CentOS-7....