quark导出数据库对象的DDL语句

  数据迁移
内容纲要

概要描述


本文主要介绍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;

file

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 3

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。