内容纲要
概要描述
本文主要介绍Inceptor 如何通过数据字典 批量导出如下数据对象的DDL语句
- 视图和表
- 函数
- 存储过程
- 包
- 序列
详细说明
1. 导出表和视图的DDL语句
下载脚本 export_ddl.py ,部署到TDH集群任一服务器上,建议选择manager节点,因为需要结合TDH-Client一起使用。
需要修改的配置(脚本顶部)
BEELINE = "/root/TDH-Client/inceptor/bin/beeline" # beeline 路径
JDBC = "jdbc:hive2://172.18.131.171:10000/default" # JDBC 连接地址
USER = "hive" # 用户名
PASS = "123456" # 密码
BEELINE_TIMEOUT = 300 # 单次 beeline 超时秒数
执行方式
# 基本用法(全量导出,20并发)
python -u /root/export_ddl.py --threads 20 --output /root/ddl_export --verbose
# 后台运行(推荐,表多时耗时长)
nohup python -u /root/export_ddl.py --threads 20 --output /root/ddl_export > /root/ddl_export.log 2>&1 &
# 查看进度
tail -f /root/ddl_export.log
可选参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| –threads N | 并发线程数 | 20 |
| –output DIR | 输出目录 | /root/ddl_export |
| –retry N | 失败重试次数 | 2 |
| –db PATTERN | 只导出指定库,逗号分隔,支持 * 通配 | 全部 |
| –tables-only | 只导出表 | 表+视图 |
| –views-only | 只导出视图 | 表+视图 |
| –include-system | 包含 system 库 | 默认跳过 |
| –verbose | 详细日志 | 关闭 |
# 只导出 dsy 和 mydb 两个库
python -u /root/export_ddl.py --db 'dsy,mydb' --verbose
# 只导出表,50 并发
python -u /root/export_ddl.py --threads 50 --tables-only --verbose
# 通配符匹配库名
python -u /root/export_ddl.py --db 'sdm*' --verbose
每次执行生成一个带时间戳的 SQL 文件:all_ddl_20260529_180524.sql
文件内全局先 TABLE 后 VIEW,按库分组排列
如有失败,生成 _failed_时间戳.txt
2. 导出函数的DDL语句
--所有函数DDL语句都可以在system.FUNCTIONSS_V表的full_text列拿到,可以通过下面SQL语句拿到所有PL/SQL函数的DDL:
INSERT OVERWRITE DIRECTORY '/tmp/function/' SELECT "use " ||database_name||"\;" || "\n" ||"!set plsqlUseSlash true"||"\n"||full_text||"\n"||"\/"||"\n"||"!set plsqlUseSlash false" from system.functions_v ;
root@kevin1 ~# hadoop fs -get /tmp/function/000000_0 .
3. 导出存储过程的DDL语句
--所有存储过程的DDL语句都可以在system.PROCEDURES_V表的full_text列拿到,可以通过下面SQL语句拿到所有存储过程的DDL:
INSERT OVERWRITE DIRECTORY '/tmp/procedure/' SELECT "use " ||database_name||"\;" || "\n" ||"!set plsqlUseSlash true"||"\n"||full_text||"\n"||"\/"||"\n"||"!set plsqlUseSlash false" from system.procedures_v ;
--如果需要额外打印出即将编译的存储过程名称,可以使用如下sql
INSERT OVERWRITE DIRECTORY '/tmp/procedure/' SELECT "SET plsql.compile.dml.check.semantic=false;"||"\n" || "use " ||database_name||"\;" || "\n" ||"!set plsqlUseSlash true"||"\n" || "SELECT '" || "Begin to parse " || database_name || "." || procedure_name || "("|| parameters || ")" || "' from system.dual;" ||"\n"||full_text||"\n"||"\/"||"\n"||"!set plsqlUseSlash false" from system.procedures_v;
root@kevin1 ~# hadoop fs -get /tmp/procedure/000000_0 .
4. 导出Package的DDL语句
注意:这里无法避免会出现plsql依赖的问题,比如存储过程依赖package,需要手动调整执行顺序
--system.PACKAGES_V/full_text 包头
--system.PACKAGES_V/package_body 包体
INSERT OVERWRITE DIRECTORY '/tmp/package' select "use " ||database_name||"\;" || "\n" ||"!set plsqlUseSlash true"||"\n" || full_text || "\n" ||"/" || "\n" ||package_body||"\n"||"\/"||"\n"||"!set plsqlUseSlash false"
from system.packages_v;
root@kevin1 ~# hadoop fs -get /tmp/package/000000_0 .
5. 导出Sequence的DDL语句
通过dblink查询元数据,
SELECT
SEQ_NAME,
concat(
'CREATE SEQUENCE ', t2.name,'.',SEQ_NAME,
' INCREMENT BY ',INCRE_BY,
' START WITH ',START_WITH,
if(MAX_VAL='9223372036854775807',' NOMAXVALUE ',concat(' MAXVALUE ',MAX_VAL)),
if(MIN_VAL='1',' NOMINVALUE ',concat(' MINVALUE ',MIN_VAL)),
if(CYCLE='0',' NOCYCLE ',' CYCLE '),
if(CACHE_SIZE='0',' NOCACHE ',concat(' CACHE ',CACHE_SIZE)),';') as seq_ddl
FROM SEQS@system_dblink t1
JOIN DBS@system_dblink t2
ON t1.db_id=t2.db_id;
