【问题标题】:MYSQL data import changes timeMYSQL数据导入更改时间
【发布时间】:2014-09-03 18:13:48
【问题描述】:

我在使用 MYSQL 时遇到问题。现在,我正在通过 mysqldump 转储数据,例如:

mysqldump -uuser -ppass --tab c:/temp --skip-dump-date dbName

这完全符合预期,数据库中的数据与生成的 .txt 文件相匹配。问题在于导入数据。为了解决导入阶段的一些外键问题,我使用了以下代码:

SET FOREIGN_KEY_CHECKS = 0;
LOAD DATA LOCAL INFILE 'c:/temp/tableName.txt' INTO TABLE tableName;
SET FOREIGN_KEY_CHECKS = 1;

这也没有问题,除了之后我检查数据库时,所有TIMESTAMPs 都向前移动了 5 小时。我知道这一定是时区的问题(我是 UTC-05:00,所以班次时间是有道理的),但我不明白应该做些什么来阻止数据库假设时间班次需要完成。

在我寻找答案的过程中,我遇到了一个类似的 SO 问题,但问题是倒退的。进口很好,出口转移了。 MySQL data export changes times

此外,我已经看到了一些在 MYSQL 中查看此信息的建议,但我不知道现在我应该如何处理这些信息。

SELECT @@global.time_zone, @@session.time_zone;

给我:

SYSTEM    +00:00

有没有办法告诉 MYSQL 在不更改 TIMESTAMPs 的情况下导入?我应该更改某种时区设置吗?如果是这样,我应该将其更改为导入还是导出?我不打算跨任何时区移动数据库。

更新 1

在我知道最佳实践之前,我在使用 LOAD DATA 命令块之前直接尝试了以下更改:

SET TIME_ZONE = '+00:00';

这解决了我的问题(我希望我的转储与我用来创建数据库的文件相同)。后来我把时间改回-05:00,但不确定是否有必要。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    --tz-utc 选项用于`mysqldump。来自文档:

    此选项允许在不同时区的服务器之间转储和重新加载 TIMESTAMP 列。 mysqldump 设置它的连接 时区为 UTC 并将 SET TIME_ZONE='+00:00' 添加到转储文件中。如果没有这个选项,TIMESTAMP 列会被转储并重新加载到 源服务器和目标服务器的本地时区,如果服务器处于不同的时间,这可能会导致值更改 区。 --tz-utc 还可以防止由于夏令时导致的更改。 --tz-utc 默认启用。要禁用它,请使用 --skip-tz-utc。

    【讨论】:

    • 使用--tz-utc--skip-tz-utc 不会更改数据文件。我正在使用--tab,并在与表不同的时间加载数据。问题仍然存在于导入中,而不是导出中。
    • 抱歉,我之前没有注意到这个选项。一定要用--tab吗?
    • 是的,--tab 是必要的;这是用于数据库版本控制。另外,如果我不使用--tab,我相信这个问题没有实际意义。使用mysqldump导出,不使用--tab可以导出使用INSERT语句,应该不会受到这个问题的影响。
    • 它仍然受到问题的影响,因为时间是在每个服务器的时区中解释的。这就是存在 --tz-utc 选项的原因,它强制所有内容进入一个公共时区。
    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多