请求获取现有Redshift集群全Schema全表DDL以跨区新建集群
获取Redshift全库表DDL的可行方案
方法1:用Redshift原生函数pg_get_tabledef
Redshift自带的pg_get_tabledef函数可以直接生成单表的DDL,结合系统表pg_tables就能批量导出所有非系统表的DDL:
批量列出各表DDL
SELECT schemaname, tablename, pg_get_tabledef(schemaname || '.' || tablename) AS table_ddl FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
生成合并后的完整DDL
如果需要把所有DDL合并成一个字符串方便导出,用STRING_AGG:
SELECT STRING_AGG(pg_get_tabledef(schemaname || '.' || tablename), ';' || CHR(10)) AS full_ddl FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
方法2:修复awslabs的视图脚本
你用的那个视图脚本失效,大概率是权限不足或者版本兼容问题,试试下面简化后的版本:
- 确保执行用户有
SELECT权限访问pg_catalog下的系统表 - 运行以下脚本创建视图:
CREATE OR REPLACE VIEW v_generate_tbl_ddl AS SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_tabledef(n.nspname || '.' || c.relname) AS ddl FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind = 'r' AND n.nspname NOT IN ('pg_catalog', 'information_schema');
创建完成后,执行SELECT * FROM v_generate_tbl_ddl;就能拿到所有表的DDL。
方法3:用AWS CLI批量导出
如果SQL层面操作受限,试试用AWS CLI的redshift-data工具:
# 先导出所有非系统表的列表 aws redshift-data execute-statement --cluster-identifier 你的集群名 --database 你的数据库名 --sql "SELECT schemaname || '.' || tablename FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema')" --output text > tables_list.txt # 循环生成每个表的DDL并写入文件 while read table; do aws redshift-data execute-statement --cluster-identifier 你的集群名 --database 你的数据库名 --sql "SELECT pg_get_tabledef('$table')" --output text >> all_tables_ddl.sql done < tables_list.txt
记得替换命令里的集群名和数据库名。
内容的提问来源于stack exchange,提问作者Sumant Kumar
相关产品推荐
相关产品推荐

