使用 Cloud Shell 从 Cloud Storage 导入 CSV 到 Cloud SQL
CSV import to Cloud SQL from Cloud Storage using Cloud Shell
我在云存储实例 (bd_storage) 上有一个 CSV 文件,需要导入到云 SQL 数据库中已经创建的 table (matriculas) (测试)。问题是 UI 导入选项默认使用以逗号 (',') 分隔的字段,而我的 CSV 文件以分号分隔 (';')。
我知道我可以使用文本编辑器将所有逗号更改为分号,但 CSV 文件对我的 PC 来说太大了(这就是我使用 Google 云平台的原因) .我如何使用云 Shell 来做到这一点?
以下是我尝试过但没有成功的一些示例:
注意:我使用 gcloud sql connect mschiaff --user=root
登录,然后 use test
指定数据库,其中 'mschiaff' 是 Cloud SQL 实例。
LOAD DATA LOCAL INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
错误:
2 (HY000): File 'gs:/bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' not found (Errcode: 2 "No such file or directory")
LOAD DATA INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
错误:
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
这是我的论文。
我有几个建议,您可以使用其中任何一个来实现。
LOAD DATA LOCAL INFILE
不能用于指向存储桶,因为它希望文件存储在本地。因此,您需要一份存储在您用于连接到 CloudSQL 实例的机器的文件系统上的 CSV 副本。例如,假设您要从云端 Shell 执行此操作。
1) 将 CSV 从您的存储桶复制到云端的主目录 Shell:
cd ~
gsutil cp gs://YOU_BUCKET_NAME/file.csv .
1) 从云端连接到 CloudSQL 实例 Shell:
gcloud sql connect CLOUDSQL_INSTANCE_NAME --user root
2) 连接到正确的数据库:
use DATABASE_NAME;
3) 将 csv 导入数据库中的 table 并指定分号分隔符(此命令中的文件位置将在 Cloud Shell 文件系统中查找文件,因为这是您从哪里连接):
LOAD DATA LOCAL INFILE '/home/USERNAME/file.csv' INTO TABLE table_name FIELDS TERMINATED BY ';';
您现在应该已成功将 CSV 文件导入数据库 table。
或者,关于您无法打开文件以将分隔符更改为逗号而不是分号,您可以尝试将 CSV 所在的存储桶安装到 Compute Engine 实例,然后 运行从实例中使用 sed
命令将文件中的所有分号替换为逗号。
您可以使用 FUSE 将存储桶挂载到实例。相关说明是 here。
安装到实例后,您可以 运行 在 CSV 上使用以下命令将分号替换为逗号。
$ sed -ie "s/;/,/g /path/to/mount/point/file.csv
用逗号替换分号后,您就可以通过控制台导入 CSV 文件了。
如果对您有意义,Amazon RDS 支持 LOAD DATA LOCAL INFILE 添加以下连接参数(应包含在连接字符串中)
ENABLE_LOCAL_INFILE=1
我在云存储实例 (bd_storage) 上有一个 CSV 文件,需要导入到云 SQL 数据库中已经创建的 table (matriculas) (测试)。问题是 UI 导入选项默认使用以逗号 (',') 分隔的字段,而我的 CSV 文件以分号分隔 (';')。
我知道我可以使用文本编辑器将所有逗号更改为分号,但 CSV 文件对我的 PC 来说太大了(这就是我使用 Google 云平台的原因) .我如何使用云 Shell 来做到这一点?
以下是我尝试过但没有成功的一些示例:
注意:我使用 gcloud sql connect mschiaff --user=root
登录,然后 use test
指定数据库,其中 'mschiaff' 是 Cloud SQL 实例。
LOAD DATA LOCAL INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
错误:
2 (HY000): File 'gs:/bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' not found (Errcode: 2 "No such file or directory")
LOAD DATA INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
错误:
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
这是我的论文。
我有几个建议,您可以使用其中任何一个来实现。
LOAD DATA LOCAL INFILE
不能用于指向存储桶,因为它希望文件存储在本地。因此,您需要一份存储在您用于连接到 CloudSQL 实例的机器的文件系统上的 CSV 副本。例如,假设您要从云端 Shell 执行此操作。
1) 将 CSV 从您的存储桶复制到云端的主目录 Shell:
cd ~
gsutil cp gs://YOU_BUCKET_NAME/file.csv .
1) 从云端连接到 CloudSQL 实例 Shell:
gcloud sql connect CLOUDSQL_INSTANCE_NAME --user root
2) 连接到正确的数据库:
use DATABASE_NAME;
3) 将 csv 导入数据库中的 table 并指定分号分隔符(此命令中的文件位置将在 Cloud Shell 文件系统中查找文件,因为这是您从哪里连接):
LOAD DATA LOCAL INFILE '/home/USERNAME/file.csv' INTO TABLE table_name FIELDS TERMINATED BY ';';
您现在应该已成功将 CSV 文件导入数据库 table。
或者,关于您无法打开文件以将分隔符更改为逗号而不是分号,您可以尝试将 CSV 所在的存储桶安装到 Compute Engine 实例,然后 运行从实例中使用 sed
命令将文件中的所有分号替换为逗号。
您可以使用 FUSE 将存储桶挂载到实例。相关说明是 here。
安装到实例后,您可以 运行 在 CSV 上使用以下命令将分号替换为逗号。
$ sed -ie "s/;/,/g /path/to/mount/point/file.csv
用逗号替换分号后,您就可以通过控制台导入 CSV 文件了。
如果对您有意义,Amazon RDS 支持 LOAD DATA LOCAL INFILE 添加以下连接参数(应包含在连接字符串中)
ENABLE_LOCAL_INFILE=1