【问题标题】:Should I CREATE TABLE every time I run COPY command每次运行 COPY 命令时我应该创建表吗
【发布时间】:2018-11-21 22:41:54
【问题描述】:

我的任务是将 MySQL 数据库迁移到 amazon redshift。目前我正在尝试通过

1) 将表格转换为 CSV 文件

2) 将它们存储在 S3 中

3) 在redshift中创建一个表

4) 使用 COPY 命令将数据从 S3 传输到 redshift

我正在使用 Python 尝试自动执行此过程,并使用 boto3 对前往 S3 的数据进行加密。

但是,按照我现在的流程,我必须在 Redshift 中为 S3 中的每个 csv 手动创建一个表。由于我最终要移动大量数据,这将非常低效。

我是否可以运行代码来检测架构并创建表,而无需在每次我想加载新数据时进入并更改 CREATE TABLE 语句?

【问题讨论】:

  • 您的问题不清楚。您是说每次加载数据时表架构都会发生变化吗?每个表只复制一个 CSV 文件?
  • 您可能无法将mysql_fdw 之类的扩展安装到数据库中,否则您可以使用IMPORT FOREIGN SCHEMA
  • 试试 AWS DMS 它适用于这个用例

标签: python mysql postgresql amazon-web-services amazon-redshift


【解决方案1】:

显然,下面的答案只是提供了工作步骤,如果遵循得当,这些步骤将完成您尝试自动化的工作。我在我的案例中做了类似的事情,尽管用例与您在这里尝试做的不完全一样。

  1. 导出所有表名。
  2. 遍历表名。
  3. 对每个表重复 4 到 8。
  4. 从 MySQL 导出表架构
  5. 在 Redshift 中创建表
  6. 从 MySQL 导出 TSV 中的数据
  7. 将 TSV 文件放入 S3
  8. 将数据复制到 Redshift 中

就是这样。

mysql -h localhost -u user -pPassword test --skip-column-names --execute="SHOW TABLES;" > database.tmp
echo "Start!"
/* Look over table name names */

for /F %%A in (database.tmp) do (
   echo "Exporting table Names for %%A"
   mysqldump -h localhost -u radhe -pPassword --no-data  database %%A > "%%A_tables.sql"
   
   psql -h redshift-hostname -d databasename -U username -f "%%A_tables.sql"
   
   mysql -h localhost -u user -pPassword  -e "select * from %%A" -B > %%A_data.tsv
   
   S3CMD put s3://yourbucket:path/%%A_data.tsv %%A_data.tsv
   
   psql -h redshift-hostname -d databasename -U username -c "copy %%A from 's3://yourbucket:path/%%A_data.tsv' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';"
  
)

PS:上面的 for 循环是针对 Windows 的,但您可以将其更改为 Linux/Unix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2019-04-07
    • 2021-02-05
    • 2014-01-17
    • 2012-03-12
    • 2017-10-31
    相关资源
    最近更新 更多