我试图创建一个自动管道来将数据从SQL Server表传输到我的Redshift数据库。我需要为几个表执行此操作,目前在SQL Server中。
我正在为此做的过程是:
以上将是每日转储仅加载自上次转储以来的新记录。现在,在开始这个管道之前,我想知道:
是否可以使用SQL Server表在我的Redshift数据库中自动创建表?或者某些东西将生成一个与SQL Server表中的Redshift表兼容的create table定义?因为,我需要为多个表格执行此操作并且表格非常庞大,我不想在Redshift中为每个表格手动执行"CREATE TABLE .."
。
请帮助!!
答案 0 :(得分:1)
这正是AWS Database Migration Service的用例,它可以执行初始迁移,但也可以执行正在进行的增量加载(但需要运行DMS服务器)。
请参阅:
要在Amazon Redshift中创建等效架构,您可以使用AWS Schema Conversion Tool,它将现有数据库架构从一个数据库引擎转换为另一个数据库引擎
答案 1 :(得分:0)
正如John所说,AWS数据库迁移服务将是将表从一个源DB复制到另一个目标数据库的最佳方式。
如果您仍在寻找获得等效的redshift create table DDL,您可以使用元数据表来获取它。我为Oracle做了同样的事情,为所有表格进行了红移和循环:
WITH COLUMN_DEFINITION AS (
SELECT
TABLE_NAME,
COLUMN_NAME,
CASE
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION <= 9) THEN 'INTEGER'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION <= 18) THEN 'BIGINT'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE = 0 AND DATA_PRECISION >= 19) THEN 'DECIMAL(' || DATA_PRECISION || ',0)'
WHEN (DATA_TYPE= 'NUMBER' AND DATA_SCALE > 0) THEN 'DECIMAL(' || DATA_PRECISION || ',' || DATA_SCALE ||')'
WHEN (DATA_TYPE= 'NUMBER' AND nvl(DATA_SCALE,0) = 0 AND nvl(DATA_PRECISION,0) = 0) THEN 'DECIMAL(38,18)'
WHEN DATA_TYPE= 'CHAR' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'VARCHAR' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'VARCHAR2' THEN 'VARCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'DATE' THEN 'TIMESTAMP'
WHEN DATA_TYPE= 'DATETIME' THEN 'TIMESTAMP'
WHEN DATA_TYPE LIKE 'TIMESTAMP%' THEN 'TIMESTAMP'
WHEN DATA_TYPE= 'LONG' THEN 'TEXT'
WHEN DATA_TYPE= 'CLOB' THEN 'TEXT'
WHEN DATA_TYPE LIKE '%RAW%' THEN 'TEXT'
WHEN DATA_TYPE= 'NCHAR' THEN 'NCHAR(' || DATA_LENGTH || ')'
WHEN DATA_TYPE= 'NVARCHAR' THEN 'NVARCHAR(' || DATA_LENGTH || ')'
ELSE DATA_TYPE || '(' || DATA_LENGTH || ')'
END AS REDSHIFT_COLUMN_DEFINITION
FROM ALL_TAB_COLUMNS
WHERE LOWER(OWNER)= LOWER('<schma_name>') AND LOWER(TABLE_NAME) in
LOWER('<Table name>')
ORDER BY COLUMN_ID
)
SELECT 'drop table if exists ' || LOWER(MAX(TABLE_NAME)) || ' cascade; '
FROM column_definition
UNION ALL
SELECT 'create table '|| LOWER(MAX(TABLE_NAME)) || ' (' AS TEXT FROM
COLUMN_DEFINITION
UNION ALL
SELECT ' '|| LOWER(COLUMN_NAME) ||' '|| REDSHIFT_COLUMN_DEFINITION
|| ', ' AS TEXT FROM COLUMN_DEFINITION
UNION ALL
SELECT ' );' AS TEXT FROM DUAL