将 MySQL 转储导入 Google SQL - unique_checks=0 是不确定的

Posted

技术标签:

【中文标题】将 MySQL 转储导入 Google SQL - unique_checks=0 是不确定的【英文标题】:Import MySQL dump into Google SQL - unique_checks=0 is non deterministic 【发布时间】:2018-06-26 12:02:55 【问题描述】:

我目前正在尝试将一个 mysqldump (~60GB),包括触发器和存储过程导入到谷歌云 sql 数据库实例中。

我已使用 terraform 将 log_bin_trust_function_creators 设置为 true/on,并使用 perl 从触发器中删除了 DEFINER 部分。

我尝试使用gcloud sql导入功能和Web控制台(从存储桶导入)导入,每次在stackdriver中弹出相同的错误。

严重性:“错误” textPayload:“2018-06-26T10:48:42.727799Z 87406 [警告] 使用不确定的 unique_checks=0!”

在转储期间设置 Afaik unique_checks 以加快导入速度。 我在互联网上找不到任何东西。

谁能告诉我错误的含义以及如何解决它? 我想避免再次转储数据库,因为它需要很长时间。

我必须注意,我只是使用了基本的mysqldump,没有here建议的参数,因为我刚刚找到了这篇文章。

最好的问候,

最大

【问题讨论】:

【参考方案1】:

警告(而不是错误!)与数据的导入没有直接关系,而是与在目标 MySQL 环境中如何配置复制有关。

正如Determination of Safe and Unsafe Statements in Binary Logging 上的 MySQL 文档所说(突出显示是我的):

MySQL 复制中语句的“安全性”是指是否 该语句及其效果可以使用正确复制 基于语句的格式。如果这句话是真的,我们指的是 声明为安全的;否则,我们将其称为不安全的。

一般来说,如果一个语句是确定性的,那么它是安全的,如果它是不安全的 不是。

...

对系统变量的引用。 大多数系统变量不是 使用基于语句的格式正确复制。 参见章节 17.4.1.39,“复制和变量”。有关例外情况,请参阅第 5.4.4.3 节,“混合二进制日志记录格式”。

unique_checks=0 设置一个系统变量,代码可能将其设置在全局级别,这在基于语句的复制中被认为是不安全的。

要么更改代码以设置unique_checks=0 on session level(推荐),要么将change the binary logging type 设置为mixed

【讨论】:

我将此解释为错误,因为导入确实因此停止。【参考方案2】:

您必须注意一些Differences between Cloud SQL and standard MySQL functionality。这里的问题很可能出在触发器中。您可以尝试禁用二进制日志。看看this SO post。

但是,正确的方法是在您提到的documentation 之后执行 MySQL 转储。

如果上述步骤都不起作用,请在 Cloud SQL 实例的日志中发布您遇到的错误。

【讨论】:

以上是关于将 MySQL 转储导入 Google SQL - unique_checks=0 是不确定的的主要内容,如果未能解决你的问题,请参考以下文章

将MySQL转储文件导入数据库

导入大 sql 转储时出现 PHPMYADMIN 错误

sqlite数据导入mysql

SQL Server 转储到 MySQL [关闭]

mysql数据库解转储sql文件的问题

sh 导入未使用--opt或--extended-insert转储的单个MySQL .sql文件(如来自VaultPress转储。显示一些* very * basic