【问题标题】:Google Cloud SQL and sql_mode flag谷歌云 SQL 和 sql_mode 标志
【发布时间】:2019-11-05 16:17:43
【问题描述】:

我正在尝试运行以下命令

gcloud beta sql instances create my_replica \
--master-instance-name=db-master01 \
--master-username=replication_user \
--master-password='replication_password' \
--master-dump-file-path=gs://path/to/dump.sql.gz \
--database-flags default_time_zone='-05:00' \
                 sql_mode='STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION' \
--region=us-central \
--tier=db-g1-small

但我收到以下错误:

ERROR: (gcloud.beta.sql.instances.create) unrecognized arguments: sql_mode=STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

To search the help text of gcloud commands, run:
  gcloud help -- SEARCH_TERMS

我是否输入错误?不支持吗?

更新: 根据 Stefan 的回复,我更新了命令以修复语法。我得到的新错误如下:

这是我的命令:

gcloud beta sql instances create $replica_name \
--master-instance-name=db-master01 \
--master-username=replication_user \
--master-password='replication_password' \
--master-dump-file-path=gs://path/to/dump.sql.gz \
--database-flags default_time_zone='-05:00',sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' \
--region=us-central \
--tier=db-g1-small

这是错误:

ERROR: (gcloud.beta.sql.instances.create) argument --database-flags: Bad syntax for dict arg: [NO_ZERO_IN_DATE]. Please see `gcloud topic flags-file` or `gcloud topic escaping` for information on providing list or dictionary flag values with special characters.
Usage: gcloud beta sql instances create INSTANCE [optional flags]
  optional flags may be  --activation-policy | --assign-ip | --async |
                         --authorized-gae-apps | --authorized-networks |
                         --availability-type | --backup | --backup-start-time |
                         --client-certificate-path | --client-key-path | --cpu |
                         --database-flags | --database-version |
                         --enable-bin-log | --failover-replica-name |
                         --follow-gae-app | --gce-zone | --help | --labels |
                         --maintenance-release-channel |
                         --maintenance-window-day | --maintenance-window-hour |
                         --master-ca-certificate-path |
                         --master-dump-file-path | --master-instance-name |
                         --master-password | --master-username | --memory |
                         --network | --pricing-plan |
                         --prompt-for-master-password | --region |
                         --replica-type | --replication | --require-ssl |
                         --root-password | --source-ip-address | --source-port |
                         --storage-auto-increase |
                         --storage-auto-increase-limit | --storage-size |
                         --storage-type | --tier | --zone

For detailed information on this command and its flags, run:
  gcloud beta sql instances create --help

我不明白为什么NO_ZERO_IN_DATE 是个问题。是否因为我为标志传递了不止一个值而在抱怨?

【问题讨论】:

  • 去掉你的sql模式之间的空格。
  • @BillKarwin 感谢您的回复,我已经更新并重新运行了命令。输出是一样的。我确实看到几年前的一些旧帖子表明这是不可能的(stackoverflow.com/questions/39081389/…)。这篇文章是 3 年前的,所以我不确定是否有任何变化。
  • 好的,值得一试。我不使用谷歌云,所以我不知道谷歌是否有任何限制。我只是想删除空格,因为如果 sql_mode 中有空格,标准 MySQL 会引发错误。

标签: mysql google-cloud-sql


【解决方案1】:

所以我在 GCP 支持的帮助下解决了这个问题。结果——惊喜! - gcloud sql instances create 命令中有一个错误,如果它设置为逗号分隔的列表,它会阻止它解析 SQL_MODE。

此错误自 2016 年以来就存在,但他们并未优先修复。 如果他们至少将其记录在文档中会很好,但这是我们现在的生活。

解决方法如下:a flags file

您的标志文件只是纯 YAML,但它看起来有点时髦。注意第一个破折号表示列表项,后跟一个空格,然后是实际的标志语法(--my-attribute: yadddayadda)。另外值得注意的是,整数需要被引用,以便将它们转换为字符串进行解析:

# sql-flags-file.yaml

- --availability-type: zonal
- --backup-start-time: 05:00 
- --database-flags:
    explicit_defaults_for_timestamp: on
    lower_case_table_names: '1'
    group_concat_max_len: '67108864'
    sql_mode: NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    default_time_zone: -07:00
    log_bin_trust_function_creators: on
    interactive_timeout: '600'
- --database-version: MYSQL_5_7

您可以将此标志文件与内联标志一起使用,如下所示:

gcloud --project=${project_name} beta sql instances create ${instance_name} \
--network="${MY_VPC_NAME}" \
--no-assign-ip \
--flags-file=sql-flags-file.yaml && echo "...done."

这允许您参数化动态变量(如上面示例中的实例名称和 VPC 网络),同时还可以跨实例标准化配置。

如果您喜欢的话,您甚至可以同时使用多个标志文件。这在我上面提供的链接中得到了解决。

真的希望这对你有帮助。没有其他人应该像我昨天在解决此问题时那样发誓。

【讨论】:

  • 哇,我没想到会有解决方案。我今天晚些时候需要试试这个,但如果它有效,这看起来不错!目前,每次创建副本时,我都必须通过 UI 手动添加 SQL_MODE 标志。这应该允许我的整个过程自动化。
  • @blueether 就是这个主意! GCP 最大的致命弱点是他们将所有精力都放在了 UI 上,而不是早期的 API 上。对我们这些开发人员来说,这很痛苦。
  • 顺便说一句,这个问题被谷歌跟踪为“功能请求”,这是完全的恶意。随时在他们的问题跟踪器中为问题加注星标,并添加您对此事的看法:issuetracker.google.com/issues/35904292
  • 非常感谢,我终于能够验证这一点。我的复制过程现在是完全自动化的,因为我不需要单独输入 SQL_MODE 标志。将此标记为已解决!
  • 甜蜜,恭喜,@blueether!
【解决方案2】:

--database-flags 带有几个可以传递的参数。 ","

您正在削减 --database-flags at default_time_zone='-05:00' 使用 "," 那里。

尝试像这样传递--database-flags,而不是用\分开它们

--database-flags default_time_zone='-05:00' , sql_mode='STRICT_TRANS_TABLES, NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、 NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' \

Here 你有更多关于应该如何传递数据库标志的具体信息。

告诉我。

编辑:

看看这个,这很有趣。显然,默认的 --sql_mode 标志包括您尝试传递的所有标志。

MySQL 5.7 中的默认 SQL 模式包括以下模式:ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER 和 NO_ENGINE_SUBSTITUTION。

Google Cloud SQL 使用 5.7 作为默认版本,因此如果您设置,所有这些标志都应该应用。

看看here

我所说的标志是this one。

部署后,您可以使用以下命令检查标志。

gcloud sql instances describe [INSTANCE_NAME]

如果您想了解更多关于command的信息。

EDIT2:

您无法设置这些标志,因为它们无法在 Google Cloud Platform 中作为 --database-flags 传递,here 您拥有所有标志的列表可以传递给 --database-flags 参数。问题是它们中的大多数要么根据 MySQL 文档被弃用,要么已经在您建立的 sql_mode 中实现。看看here

实现你想要的所有标志的最好方法是将 sql_mode 设置为traditional,我一直在研究严格模式,它包含你不希望拥有的那个。

告诉我。

【讨论】:

  • 感谢您的回复并发现我的语法错误。我更新了我的命令并重新运行它。我用新命令和新错误更新了原始帖子。
  • 看看我的编辑,这应该可以帮助您解决问题,如果没有,请告诉我,我们将继续调查。
  • 没错,你所说的默认标志。设置它的原因是我不希望该列表中的第一个标志ONLY_FULL_GROUP_BY。我真的不能告诉你为什么,我没有创建原始数据库,所以我不知道为什么它没有在原始数据库中设置。但是我遇到了这个问题,因为我试图通过 Grafana 进行的一些查询抱怨ONLY_FULL_GROUP_BY。这有帮助吗?我还能提供其他信息吗?
  • 嘿 blueether,在我的编辑中掠夺,这是我发现的唯一方法,您可以不使用 ONLY_FULL_GROUP_BY,希望这对您有所帮助。
  • 嘿,我假设您设法找到了最适合您的组合,我所说的标志不可用是因为它们没有出现在文档中的可用标志列表中我链接的。很高兴我们设法解决了它。如果您如此考虑,请将我的回答标记为已接受。如果您还需要什么,请告诉我。
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2016-06-18
  • 2013-09-08
相关资源
最近更新 更多