Docker金仓数据库dump导出导入

186 阅读1分钟

1.进入容器

docker exec -it ...

2.直接运行脚本

sys_dump -v --progress --no-owner -F c  --schema=ry_vue  -f 20250113bak.dmp sx-db 
  • -v, --verbose 详细模式
  • --progress 显示进度信息
  • --no-owner 在纯文本格式中跳过对象所有权的恢复
  • -F, --format=c|d|t|p 输出文件格式(自定义、目录、tar、纯文本(默认))
  • sx-db 指定数据库
  • --schema=模式 仅转储指定的模式
  • -f, --file=文件名 输出文件或目录名称

3. 导出dump文件

4. 使用dump文件

  • 跨数据库
sys_restore -U admin -d test -v 20250113bak.dmp
- -d <database_name> 指定了目标数据库名。
- -v 参数用于启用详细模式,显示恢复过程中的更多细节。
  • 同一数据库,不同schema
    sys_restore -U admin -d sx-db --fromSchema=ry_vue --targetSchema=sx_model --clean --if-exists 20250526bak.dmp

-   ​**`--fromSchema`**​:指定备份文件中的原 Schema 名(例如 `ry_vue`)。
-   ​**`--targetSchema`**​:指定恢复后的新 Schema 名(例如 `sx-model`)。

其他【连接数据库】

  • 本地数据库
    ksql -U myuser -d mydb -K mypassword
  • 远程数据库
    ksql -U myuser -d mydb -h 192.168.1.100 -p 54321

删除无关表以及序列

先连接到数据库,再执行下列命令

DO $$
DECLARE
    tbl_name TEXT;  -- 表名变量(格式:Schema.表名)
    drop_sql TEXT;  -- 动态 SQL 语句
    seq_name TEXT;  -- 序列名变量
BEGIN
    -- 遍历所有符合条件的表
    FOR tbl_name IN
        SELECT table_name
        FROM information_schema.tables
        WHERE
            table_type = 'BASE TABLE'  -- 仅限普通表(排除视图)
            AND table_schema = 'sx_model'  -- 指定 Schema
            AND table_name NOT LIKE '%sx_model%'  -- 保留包含 sx_model 的表
            AND table_name NOT LIKE '%sys%'        -- 保留包含 sys 的表
    LOOP
        -- 生成删除命令(直接使用已包含 Schema 的完整表名)
        drop_sql := format('DROP TABLE IF EXISTS sx_model.%s CASCADE', tbl_name);
        RAISE NOTICE '执行命令: %', drop_sql;
        EXECUTE drop_sql;
    END LOOP;

    -- 删除不再被任何表引用的孤立序列
    FOR seq_name IN
        SELECT sequence_name
        FROM information_schema.sequences 
        WHERE 
            sequence_schema  = 'sx_model'  -- 指定 Schema
            AND sequence_name NOT LIKE '%sx_model%'  -- 保留含 sx_model 的序列
            AND sequence_name NOT LIKE '%sys%'       -- 保留含 sys 的序列
    LOOP
        EXECUTE format('DROP SEQUENCE IF EXISTS sx_model.%s CASCADE;', seq_name);  -- 级联删除序列
        RAISE NOTICE '已删除序列: %', seq_name;  -- 输出日志
    END LOOP;
END 
$$;

导入sql文件

ksql -U admin -d sx-model -f ry_vue_kingbase.sql

复制数据表到 另一个schema

DO $$
DECLARE
    src_table TEXT;  -- 源表名(格式:源Schema.表名)
    dst_table TEXT;  -- 目标表名(格式:目标Schema.表名)
BEGIN
    -- 遍历所有符合条件的表
    FOR src_table IN
        SELECT table_name
        FROM information_schema.tables
        WHERE 
            table_schema = 'sx_model'  -- 源 Schema 名
            AND table_name LIKE 'sx_model%' -- 表名前缀
            AND table_type = 'BASE TABLE'   -- 仅处理普通表
    LOOP
        -- 生成目标表名(去掉前缀或保留)
        dst_table := CONCAT('sx_dev.',src_table);
        src_table := CONCAT('sx_model.',src_table);

        -- 复制表结构(使用 LIKE 语法包含索引、约束)
        EXECUTE format('CREATE TABLE %s (LIKE %s INCLUDING ALL)', dst_table, src_table);

        -- 复制数据
        EXECUTE format('INSERT INTO %s SELECT * FROM %s', dst_table, src_table);

        -- 可选:同步表注释
        EXECUTE format('COMMENT ON TABLE %s IS %L', 
                      dst_table, 
                      (SELECT obj_description(src_table::regclass, 'pg_class')));
        
        RAISE NOTICE '已复制表: % → %', src_table, dst_table;
    END LOOP;
END 
$$;