Cloud SQL for MySQL 错误消息

本页面讨论了 Cloud SQL 中遇到的一些错误消息。

概览

Cloud SQL 中的错误消息有许多来源,并会出现在很多地方。一些错误消息来自数据库引擎本身,一些来自 Cloud SQL 服务,一些来自客户端应用,还有一些是由 Cloud SQL Admin API 调用返回的。

本页面包含 Cloud SQL 中最常见的一些错误。如果您在此找不到所看到的错误代码或消息,则可以在以下位置查找来源参考资料:

如果您找不到有关所看到的错误消息的参考材料,还可以在以下这些其他用户可能有相关经验的位置进行搜索:

操作错误

A | B | C | D | E | F | G | I | L | M | N | O | P | Q | R | S | T | U | W

错误消息 问题排查
已中止 xxx 到 db: DB_NAME 的连接。 应用未正确终止连接。

检查是否存在以下情况:

  • 应用在退出前未调用 mysql_close()。
  • 通信错误
  • 应用可能处于休眠状态的时间超过了在“wait_timeout”或“interactive_timeout”中指定的秒数,未向服务器发出任何请求。请参阅第 5.1.7 节:服务器系统变量
  • 应用在数据传输过程中突然终止。
  • max_allowed_packet 变量值可能太小,或者查询需要的内存多于为 mysqld 分配的内存。这可以通过将 max_allowed_packet 标志增加到更大的数字来解决。
访问遭拒;您需要(至少其中一种)SUPER 特权才能执行此操作 源数据库中可能有以 Cloud SQL 不支持的方式引用 DEFINER 的视图、函数或过程。

更新外部数据库中的定义器,例如从 root@localhost 更新为 root@% 或非超级用户。如需了解详情,请参阅存储对象访问权限控制

用户“XXX”@“XXX”的访问遭拒(使用密码:XXX) 可能存在多种原因,包括:
  • 用户名(或密码)不正确。
  • 用户正在通过 @XXX 以外的网址进行连接。
  • 用户对他们尝试连接到的数据库没有正确的权限。

请尝试以下操作 ...

  • 验证用户名和相应的密码。
  • 检查连接的来源,查看它与用户具有访问权限的网址是否匹配。
  • 在数据库中检查用户的授予权限。
在网络中找不到分配的 IP 范围。 在修改或移除分配的范围后,VPC 对等互连未更新。

您需要修改专用连接。使用以下命令,并务必使用 --force 参数:

gcloud services vpc-peerings update \
--network=VPC_NETWORK \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force
任何针对表对用户 'root'@'%' 拒绝的命令。 用户不具备执行此操作所需的所有权限。

请尝试以下操作:

  1. 连接到数据库(例如,使用 Cloud Shell)并以根用户身份登录。
  2. 执行 USE mysql;
  3. 使用语法授予以下权限:
    GRANT PERMISSION_1,PERMISSION_2 ON *.* TO 'root' WITH GRANT OPTION;
       
    • SELECT
    • INSERT
    • 更新
    • 删除
    • 创建
    • DROP
    • 重新加载
    • SHUTDOWN
    • PROCESS
    • REFERENCES
    • INDEX
    • ALTER
    • SHOW DATABASES
    • CREATE TEMPORARY TABLES
    • LOCK TABLES
    • EXECUTE
    • REPLICATION SLAVE
    • REPLICATION CLIENT
    • CREATE VIEW
    • SHOW VIEW
    • CREATE ROUTINE
    • ALTER ROUTINE
    • CREATE USER
    • 活动
    • TRIGGER
    • CREATE TABLESPACE
  4. 执行 USE 'Database_Name';,其中 Database_Name 是要在其中创建视图的数据库。
  5. 在该会话中执行所有创建视图并提交。
错误消息 问题排查
错误请求 此消息可能有多种原因。Illegal Argument 是最常见的一种。在这种情况下,请求使用不正确的参数或参数的无效值。对于许多其他原因,错误消息可能包含有用的提示。

对于 Illegal Argument,请检查请求以确保每个参数都允许使用,并且参数的每个值都是有效的。对于其他所有原因,请检查日志文件,查看是否有更多信息。

错误消息 问题排查
无法修改 CreateConnection 中分配的范围。请使用 UpdateConnection。 在修改或移除分配的范围后,VPC 对等互连未更新。

您需要修改专用连接。使用以下命令,并务必使用 --force 参数:

gcloud services vpc-peerings update \
--network=VPC_NETWORK \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force
Constraints/sql.restrictAuthorizedNetworks。 克隆操作被 Authorized Networks 配置阻止。在 Google Cloud 控制台的“连接”部分中为公共 IP 地址配置了 Authorized Networks,并且出于安全考虑,不允许克隆。

如果可以,请移除 Cloud SQL 实例中的所有 Authorized Networks 条目。否则,请创建副本(不包含 Authorized Networks 条目)。

错误消息 问题排查
磁盘已满。 主实例磁盘大小可能在副本创建期间变满。

对主实例进行修改以将其升级为更大的磁盘。

错误消息 问题排查
未能创建子网。 IP 地址范围中没有更多可用的地址。

在分配的 IP 范围中找不到可用块。请为该服务提供商分配新的范围。

分配的 IP 范围中没有更多的可用地址。

请考虑以下可能出现的情况:

  • 专用服务连接所分配 IP 地址范围的大小小于 /24。
  • 专用服务连接所分配 IP 范围的大小对于 Cloud SQL 实例数量而言太小。
  • 如果在多个区域中创建实例,则分配的 IP 地址范围大小要求将更大。请参阅分配的范围大小

对于上述每种场景,您可以选择展开现有 IP 范围,也可以选择分配其他 IP 范围给专用服务连接。

如果您要分配新的范围,请注意不要创建与任何现有分配重叠的分配。

创建新的 IP 地址范围后,使用以下命令更新 VPC 对等互连:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com
--ranges=OLD_RESERVED_RANGE_NAME,NEW_RESERVED_RANGE_NAME \
--network=VPC_NETWORK
--project=PROJECT_ID \
--force

如果要扩展现有分配,请注意只能扩大分配范围,不能缩减分配范围。例如,如果原始分配是 10.0.10.0/24,则新分配至少为 10.0.10.0/23。

一般来说,如果从 /24 分配开始,对于每个条件(额外的实例类型组、额外的区域),将“/子网掩码位数”递减 1 是一种较好的做法。例如,如果尝试在同一分配中创建两个实例类型组,则从 /24 递减到 /23 就足够了。

扩展现有 IP 地址范围后,使用以下命令更新 VPC 对等互连:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com
--ranges=RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID \
--force
错误消息 问题排查
(gcloud.sql.connect) 您的客户端似乎没有 IPv6 连接,并且数据库实例没有 IPv4 地址。 您正尝试使用 Cloud Shell 连接到您的专用 IP 实例。

目前不支持从 Cloud Shell 连接到仅使用专用 IP 地址的实例。

转储表时获取的数据包超过 max_allowed_packet 字节 数据包超过设置所允许的数据包大小。

mysqldumpmax_allowed_packet 选项搭配使用。

如需详细了解如何使用 mysqldump 标志进行托管式导入迁移,请参阅允许和默认的初始同步标志

错误消息 问题排查
InnoDB:写入文件 ./ibtmp1 在偏移 XXXX 处失败,应已写入 YYYY 字节,但仅写入 0 个。 实例在进行自动备份时达到硬性限制。

检查确认您的操作系统和文件系统支持此大小的文件。检查确认磁盘未满,或者磁盘配额未用尽。您可以通过 Google Cloud 控制台申请增加配额,也可以对实例进行修改以将其升级为更大的磁盘。

内部错误。 项目可能缺少此功能所需的 Service Networking 服务账号。

如需修复服务权限,请停用 Service Networking API,等待五分钟,然后重新启用。

请求无效:实例的 Service Networking 配置不正确。 未在项目中启用 Service Networking API

在您的项目中启用 Service Networking API。如果您在尝试为 Cloud SQL 实例分配专用 IP 地址时看到此错误并且您使用共享 VPC,则还需要为宿主项目启用 Service Networking API

错误消息 问题排查
元数据表被锁定。 另一个查询、进程或事务阻止了查询并锁定表。

找到锁定表的进程并停止该进程。

  1. 使用以下命令进行诊断:sql> show processlist;

    列表中的第一项可能是占用锁的项,后面的项正在等待获取该锁。

  2. SHOW INNODB STATUS 命令可能也会有用。
  3. 运行 KILL <var>PID</var> 命令:
错误消息 问题排查
网络关联失败。 未在项目中启用 Service Networking API

在您的项目中启用 Service Networking API。如果您在尝试为 Cloud SQL 实例分配专用 IP 地址时看到此错误并且您使用共享 VPC,则还需要为宿主项目启用 Service Networking API

错误消息 问题排查
操作失败,因为正在进行其他操作。 Cloud SQL 中的大多数操作是同步的。一次只能运行一个。

等待上一个操作完成后,再开始另一个操作。

操作对此实例无效。 此错误从对 instances.restoreBackup 的 API 调用返回,这意味着您无法从备份恢复到存储空间大小 (XX GB) 比备份大小 (YY GB) 小的实例。

对目标实例进行修改以增加其存储空间大小。

错误消息 问题排查
已超出配额。 您已达到每分钟或每日配额的上限。查看 Cloud SQL 的配额和限制

通过 Google Cloud 控制台申请增加配额。

错误消息 问题排查
保留剩余的连接槽。 已达到允许的连接数上限。

增加 max_connections 标志的值。请参阅配置数据库标志

请求缺少有效的 API 密钥。 您可能没有有效的服务账号密钥 JSON 文件,或者该文件可能未存储在预期位置。

验证 GOOGLE_APPLICATION_CREDENTIALS 环境变量中存储的位置包含有效的服务账号密钥 JSON 文件,并且该变量指向正确的位置。

错误消息 问题排查
指定的键过长;键长度上限为 767 字节。 外部主实例可以设置变量 innodb_large_prefix

在创建副本时,将 innodb_large_prefix 标志设置为 ON,或使用该标志更新现有副本。

SSL 错误:填充无效。 服务器证书错误。

创建新的服务器证书并轮替

发生了系统错误。
  • 用户可能没有所需的所有 Cloud Storage 权限。
  • 数据库表可能不存在。

请尝试以下操作 ...

  • 检查核实您对存储桶至少拥有 WRITER 权限,并且对导出文件至少拥有 READER 权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问权限控制列表
  • 确保表已存在。如果表已存在,请确认您对存储桶拥有正确的权限。
错误消息 问题排查
表定义已更改。 在导出过程中,表发生了更改。

如果在导出操作期间使用以下语句,则转储事务可能会失败:

  • ALTER TABLE
  • CREATE TABLE
  • DROP TABLE
  • RENAME TABLE
  • TRUNCATE TABLE

从转储操作中移除所有这些语句。

临时文件大小超出 temp_file_limit。 对于您的数据库用量,temp_file_limit 标志设置得太低。

增加 temp_file_limit 大小。 请参阅配置数据库标志

db.table 不存在 如果在 MySQL 重启后一个或多个 InnoDB 表消失,并且 MySQL 错误日志同时存在以下警告,则是因为外键和引用键列不同步。
[Warning] InnoDB: Load table db.table failed, the table has missing
foreign key indexes. Turn off 'foreign_key_checks' and try again.
[Warning] InnoDB: Cannot open table db/table from the internal data
dictionary of InnoDB though the .frm file for the table exists.
See InnoDB troubleshooting
for more information.
      

数据库重启后,MySQL 需要在首次访问时将表加载到 InnoDB 字典缓存中。如果检测到差异,它将阻止访问该表。

mysql> select * from db.table;
ERROR 1146 (42S02): Table db.table doesn't exist
      

对 MySQL 会话停用 foreign_key_checks 后可重新访问该表。访问表并将其加载到字典缓存中后,在下一次数据库重启之前,InnoDB 不会再检查和处理外键不匹配的问题。

您应修复外键不匹配的问题,以避免出现任何其他问题。

  1. mysql 客户端会话停用 foreign_key_checks 并访问该表。
    mysql> SET SESSION FOREIGN_KEY_CHECKS=0;
                
  2. 检查父表和子表,并识别外键和引用键列之间的不匹配问题。
    mysql> SHOW CREATE TABLE parent_table;
    mysql> SHOW CREATE TABLE child_table;
                

    验证相应列是否具有类似的数据类型。固定精度类型(例如 INTEGERDECIMAL)的大小和符号应相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

  3. 使用 ALTER TABLE 语句修复不匹配问题。某些操作可能需要先删除外键限制条件,然后应用更改,之后再重新添加外键。
  4. 重新启用 foreign_key_checks
    mysql> SET SESSION FOREIGN_KEY_CHECKS=1;
                
(超时)在导出期间。 CSV 和 SQL 格式的导出方式不同。SQL 格式包含整个数据库,可能需要更长时间才能完成。

使用 CSV 格式,并运行多个较小的导出作业,以减小每项操作的规模和长度。

连接数量过多。 max_connections 标志值设置得过高可能会导致此错误。这也可能是由启用顺序不一致的标志造成的。

降低 max_connections 标志值,或联系客户服务以请求移除标志,后跟 hard drain。这会强制实例在使用新配置(没有标志或设置)的其他主机上重启。

错误消息 问题排查
没有连接权限。 由于在多个级层进行授权,因此可能存在多个原因:
  • 在数据库级层,数据库用户必须存在且其密码一致
  • 在项目级层,用户可能没有正确的 IAM 权限,包括 serviceusage.services.usecloudsql.instances.connect 权限。
  • 在网络级层,如果 Cloud SQL 实例使用公共 IP,则连接的来源 IP 必须在已获授权的网络中。

请尝试以下操作 ...

  • 确保用户存在且其密码一致。
  • Service Usage Consumer 角色分配给用户账号: 此角色包含 serviceusage.services.use 权限。
  • 如果使用公共 IP,请确保来源 IP 在已获授权的网络中。
information_schema 中的表 COLUMN_STATISTICS 未知。 如果您使用 MySQL 8.0 中的 mysqldump 二进制文件转储 MySQL 5.7 数据库中的数据,并将其导入 MySQL 8.0 数据库,则会发生这种情况。

如果您转储 MySQL 5.7 数据库中的数据,并将其导入 MySQL 8.0 数据库,请确保使用 MySQL 5.7 中的 mysqldump 二进制文件。如果您使用的是 MySQL 8.0 中的 mysqldump 二进制文件,则需要添加 --column-statistics=0 标志。

错误消息 问题排查
x509:证书对任何名称均无效。 已知问题:Cloud SQL Proxy Dialer 目前与 Go 1.15 不兼容。

在问题获得修复之前,请参阅 GitHub 上的这一讨论,其中包括了解决方法。

未知错误

下表显示了 Unknown Error 可能发生的一些已知情况,并列出了具体补救措施(如适用)。不过,此列表并非完整列表。如果您在表中未找到您的情况,请参阅 Cloud SQL 的公开问题跟踪器。如果您在此处未找到问题,请考虑提交报告或查看其他支持选项

操作 可能的问题 可以尝试的操作
添加用户 如果数据库中已存在用户,当您尝试添加该用户时,可能会发生此错误。 检查以确保该用户不在数据库中。
备份 如果您在自动或手动备份期间看到此错误消息,可能是实例磁盘已满。 如果临时文件大小占用过多空间,您可以重启实例以移除该文件并释放磁盘可用空间。否则,您可能需要将实例升级为更大的磁盘。
克隆 当所选可用区中的资源不足时,可能会发生这种情况。 请尝试相应区域中的另一个可用区,或者稍后重试。
创建实例
  • 当您尝试重新使用与最近删除的实例相同的名称时,可能会发生这种情况。
  • 还可能是由间歇性连接问题引起的。
  • 日志可能显示项目未启用 Service Networking API。
  • 尝试并行创建多个实例时也会出现此错误。例如,Terraform 脚本可实现此尝试。
  • 另一个原因是特定资源已用尽或已超出配额限制。在日志中查找 Quota 'INTERNAL_FORWARDING_RULES_WITH_TARGET_INSTANCE_PER_NETWORK' exceeded. Limit: 100.0 globally 等条目
  • 如因 IP 范围中没有更多可用的地址,子网创建失败,则会发生此错误。
  • 实例名称在删除大约一周后才能重新使用。
  • 如果是间歇性连接问题,则唯一的补救方法是重试。
  • 为项目启用 Service Networking API
  • 并行实例创建脚本仅会成功创建一个实例。对该脚本进行修改,等到每个实例创建操作完成后再继续执行下一步。
  • 分配新范围
创建副本 日志文件中可能有更具体的错误信息。 Cloud Logging 中查看日志以找到实际错误。

如果错误为 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,请停用 Service Networking API,然后重新启用。此操作会创建继续执行该过程所需的服务账号。

如果错误为 The instance creation failed due to a permission error with the CMEK key defined,请查看密钥设置和位置

导出 如果您在尝试将数据库导出到 Cloud Storage 存储桶时看到此错误,则可能是带宽问题导致转移失败。 Cloud SQL 实例可能与 Cloud Storage 存储桶位于不同区域。从一个大洲读取数据并将数据写入另一个大洲涉及很多网络用量,可能会导致类似的间歇性问题。
故障切换(旧版) 如果您使用的是旧版故障切换配置,则在故障切换副本机器大小不足以处理故障切换时,可能会发生这种情况。 最好的解决方案是迁移到当前高可用性配置。否则,您需要将故障切换副本更新为更大的机器。
故障切换(自动) 当服务检测到主实例仍保持响应时,自动故障切换操作可能会产生此错误消息。 在这种情况下,您无需执行任何操作。不会发生故障切换,因为不需要。
导入 导入文件可能包含需要超级用户角色的语句。 修改该文件以移除任何需要超级用户角色的语句。

Cloud SQL 还会使用一些第三方二进制文件(例如 mysqld),它们可能会生成未知的错误消息。此类错误是第三方二进制文件的内部错误,不在 Cloud SQL 的范围内。但是,有时可以在 Cloud SQL 日志文件中找到更具体的错误。

有时,错误代码是未知的错误代码。在这种情况下,完整消息可能是 Unknown Error Code