【问题标题】:How to skip slave replication errors on Google Cloud SQL 2nd Gen如何在 Google Cloud SQL 2nd Gen 上跳过从属复制错误
【发布时间】:2019-09-15 10:46:52
【问题描述】:

我正在将数据库从外部服务器迁移到云 sql 第二代。一直遵循推荐的步骤,2TB mysqlsump 过程已完成并开始复制。但是,出现错误:

'错误''访问被拒绝用户''skip-grants user''@''skip-grants host''(使用密码:NO)''查询。默认数据库:''mondovo_db''。查询:''LOAD DATA INFILE''/mysql/tmp/SQL_LOAD-0a868f6d-8681-11e9-b5d3-42010a8000a8-6498057-322806.data'' IGNORE INTO TABLE seoi_volume_update_tracker FIELDS TERMINATED BY ''^@^'' ENCLOSED BY' ''' ESCAPED BY ''\'' LINES TERMINATED BY ''^|^'' (keyword_search_volume_id)'''

2 个问题,

1) 我猜这个错误是因为云 sql 需要 LOAD DATA LOCAL INFILE 而不是 LOAD DATA INFILE?但是我很确定在主服务器上我们只运行 LOAD DATA LOCAL INFILE 所以不确定在复制时它如何更改以删除 LOCAL,这可能吗?

2) 我无法停止从站跳过错误并重新启动,因为超级权限不可用,因此我不确定如何跳过此错误,并在最终同步发生时避免它在未来发生。有什么建议吗?

【问题讨论】:

  • 您应该可以使用LOAD DATA LOCAL INFILE。我不确定是否可以跳过此错误。这可能是您的用户帐户的 MySQL 权限问题。也许它缺少necessary privilege。如果问题是导出的文件,您可以尝试 Cloud SQL 文档中的 query 以避免任何问题。
  • 命令失败是“LOAD DATA INFILE”而不是“LOAD DATA LOCAL INFILE”,我猜这是一个问题,因为没有“LOCAL”它在云 SQL 上不起作用。所以现在,我想不出如何跳过这个错误并继续复制。
  • 抱歉,我误读了查询。对于你的第一个问题,你能澄清一下大师做了什么吗?根据我的理解,LOAD DATA INFILE 应该在 Cloud SQL 实例上运行,而不是在主实例上运行。对于第二个问题,您能否澄清跳过错误的意思?错误是否仅发生在某些行?如果您不使用 LOCAL,则查询根本不会运行。确认一下,当您说复制时,您是指到主 Cloud SQL 实例的导入过程吗?或者你有没有提到的副本设置here
  • 你找到答案了吗?我遇到了同样的问题

标签: google-cloud-platform google-cloud-sql


【解决方案1】:

没有办法解决 Google Cloud SQL 中的从属复制错误,因此不得不想出另一种方法。

由于无法进行复制,我不得不复制所有数据库。但是,由于我所有数据库的总大小为 2TB,因此需要很长时间。

耗时最少的最终策略:

1) 先决条件:您的 SQL 驱动器上剩余的磁盘空间至少是当前数据库大小的 1.5 倍。因此,我的 2TB 数据库位于 2.7TB SSD 上,我最终需要将所有内容临时移动到 6TB SSD 上,然后才能继续执行以下步骤。不要在没有足够磁盘空间的情况下继续操作,你会像我一样浪费很多时间。

2) 在您的服务器上安装cloudsql-import。没有这个,你就无法继续,我花了一段时间才发现。这将有助于将您的 SQL 转储快速传输到 Google。

3) 我有多个数据库要迁移。因此,如果在类似情况下,一次选择一个,并且对于访问该数据库的站点,防止任何进一步的插入/更新。我需要在每个站点上放置一个“正在维护的网站”,同时执行下面概述的操作。

4) 在单独的screen 中运行以下步骤中的命令。我在不同的屏幕上并行启动了几个进程。

screen -S DB_NAME_import_process

5) 使用以下命令运行 mysqldump 并注意,输出是 SQL 文件而不是压缩文件:

mysqldump {DB_NAME} --hex-blob --default-character-set=utf8mb4 --skip-set-charset --skip-triggers --no-autocommit --single-transaction --set-gtid-purged=off > {DB_NAME}.sql

6) (可选) 对于大约 1.2TB 的最大数据库,我还使用此处提到的脚本将数据库备份拆分为单独的表 SQL 文件:https://stackoverflow.com/a/9949414/1396252

7) 对于转储的每个文件,我将 INSERT 命令转换为 INSERT IGNORE,因为在导入过程中不希望出现任何重复的错误。

cat {DB_OR_TABLE_NAME}.sql | sed s/"^INSERT"/"INSERT IGNORE"/g > new_{DB_OR_TABLE_NAME}_ignore.sql

8) 在您要导入的 Google Cloud SQL 上创建一个同名的数据库。同时创建一个有权访问所有数据库的全局用户。

9) 现在,我们使用 cloudsql-import 插件导入 SQL 文件。如果您在第 6 步中将较大的数据库拆分为单独的表文件,请使用 cat 命令将其中一批合并到一个文件中,并根据需要创建尽可能多的批处理文件。

运行以下命令:

cloudsql-import --dump={DB_OR_TABLE_NAME}.sql --dsn='{DB_USER_ON_GLCOUD}:{DB_PASSWORD}@tcp({GCLOUD_SQL_PUBLIC_IP}:3306)/{DB_NAME_CREATED_ON_GOOGLE}'

10) 在进程运行时,您可以使用 Ctrl+a 退出 screen 会话 + Ctrl+d(或refer here),然后稍后重新连接到屏幕以检查进度。您可以创建另一个屏幕会话,并为您需要导入的每个数据库/表批次重复相同的步骤。

由于我必须导入大尺寸,我相信它确实花了我一两天的时间,现在不记得了,因为已经有几个月了,但我知道它比任何其他方式都快得多。我曾尝试使用 Google 的复制实用程序将 SQL 文件复制到 Cloud Storage,然后使用 Cloud SQL 的内置可视化导入工具,但这很慢而且不如 cloudsql-import 快。在谷歌修复跳过从属错误的能力之前,我会推荐这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2021-12-27
    • 1970-01-01
    • 2021-07-18
    • 2015-05-20
    相关资源
    最近更新 更多