2013-02-15 16 views
9

Ich habe einige Backup-und Restore-Skripte, die ich für meine Datenbank verwende. Die Tabelle hat ein Zeitstempelfeld. Der Backup-Skript sieht wie folgen aus:MySQL Datenexport ändert sich mal

mysqldump -u user -ppass database --tab="../" --fields-terminated-by="|" --skip-comments table 

Es wird zwei Dateien erstellt, table.sql und table.txt. Der Wiederherstellungs Skript sieht wie folgt aus:

mysql -u user -ppass database < "../table.sql" 
mysqlimport -u user -ppass --local --fields-terminated-by="|" database "../table.txt" 

jedoch das Backup-Skript ist die falsche Zeit ausgibt - es ist eine Stunde hinter dem, was in der Datenbank - aber es funktioniert korrigieren es nicht beim Import.

Zum Beispiel der Zeit auf einer Reihe war 15.10.25 aber, wenn der Backup-Skript ausgeführt wird, 14.10.25 in table.txt aufgeführt. Wenn ich das Wiederherstellungsskript ausführe, hat dieselbe Zeile jetzt 14:10:25 als die Zeit in der Datenbank. Wenn ich wieder sichern, heißt es 13:10:25! Und so weiter ...

Ich kann nicht herausfinden, warum das ist. Die Zeitzone scheint auf "SYSTEM" eingestellt zu sein (ich bin auf GMT). Die Tabelle table.sql hat ein paar Zeilen, die Zeitzonen erwähnen, vielleicht stimmt da etwas nicht? Hier ist die vollständige Datei in Frage:

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @OLD_TIME[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 
DROP TABLE IF EXISTS `news_article`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `news_article` (
    `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(100) NOT NULL, 
    `alias` varchar(65) NOT NULL, 
    `author` tinyint(3) unsigned NOT NULL, 
    `category` tinyint(3) unsigned NOT NULL, 
    `posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `opening` text NOT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `alias` (`alias`) 
) ENGINE=MyISAM AUTO_INCREMENT=93 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

/*!40103 SET [email protected]_TIME_ZONE */; 

/*!40101 SET [email protected]_SQL_MODE */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
/*!40111 SET [email protected]_SQL_NOTES */; 

Antwort

20

eine Lösung gefunden am Ende: Hinzufügen der --skip-tz-utc Option zum Export-Skript.

Dies stellt einfach sicher, dass das genaue Datum, das Sie exportieren, das ist, was in der zweiten Datenbank importiert wird. Es funktioniert für mich, da die Datenbanken die gleiche Zeitzone haben, aber möglicherweise nicht ideal für andere, deren Datenbanken unterschiedliche Zeitzonen sind.

+0

Ich gehe davon aus, dass, da ich dies tun muss, habe ich etwas anderes falsch in der Anwendung. Die Verwendung dieser Option scheint genau das Gegenteil zu tun, was auf der Manpage steht. Könnte es sein, dass ich die MySQL-Zeitzone in der App auf UTC anstatt auf einen Offset gesetzt hätte? – Mike

+0

Ich denke, Sie sollten die Zeitzone auf UTC setzen, wenn Sie Daten importieren, nicht exportieren. Aus der Dokumentation der '--tz-utc' Option: "mysqldump legt seine Verbindungszeitzone auf UTC fest und fügt SET TIME_ZONE = '+ 00:00' zur Dump-Datei hinzu." Also, der Speicher ist in UTC. Da Sie jedoch Tab-Dumps verwenden, wird die Anweisung "SET TIME_ZONE = '+ 00:00" nicht ausgeführt, daher müssen Sie die Zeitzone für die Verbindung manuell festlegen. – Yuri