如何跳过第二代Google Cloud SQL上的从属复制错误

时间:2019-06-12 16:48:42

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

我正在将数据库从外部服务器迁移到Cloud sql 2nd gen。遵循建议的步骤,并且2TB mysqlsump过程已完成,并且复制已开始。但是,出现错误:

查询时出现错误``用户''skip-grants用户''@''skip-grants主机''(使用密码:否)拒绝访问''。默认数据库:“ mondovo_db”。查询:``LOAD DATA INFILE''/mysql/tmp/SQL_LOAD-0a868f6d-8681-11e9-b5d3-42010a8000a8-6498057-322806.data''IGNORE INTO TABLE seoi_volume_update_tracker字段以``^ @ ^''终止'''以'\'开头的行以'^ | ^''(keyword_search_volume_id)'''

2个问题

1)我猜错了,因为云SQL需要LOAD DATA LOCAL INFILE而不是LOAD DATA INFILE?但是,可以肯定的是,在主服务器上,我们仅运行LOAD DATA LOCAL INFILE,因此不确定在复制时如何更改它以删除LOCAL,这可能吗?

2)由于无法使用SUPER特权,因此我无法停止从属设备跳过错误并重新启动,因此我不确定如何跳过此错误,并且在最终同步发生时也可以避免以后再发生。有建议吗?

1 个答案:

答案 0 :(得分:0)

无法解决Google Cloud SQL中的从属复制错误,因此必须提出另一种方法。

由于复制无法正常进行,因此我必须复制所有数据库。但是,由于我所有DB的总大小均为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中将较大的DB拆分为单个表文件,请使用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)在进程运行期间,您可以使用screen退出Ctrl+a会话 + Ctrl+d(或refer here),然后稍后重新连接到屏幕以检查进度。您可以创建另一个屏幕会话,并对每个需要导入的表的DB /批处理重复相同的步骤。

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