环境

系统平台:UOS(海光),UOS (飞腾),UOS(鲲鹏),银河麒麟svs(X86_64),银河麒麟(飞腾)svs,银河麒麟 (X86_64),银河麒麟 (飞腾),银河麒麟 (鲲鹏),银河麒麟 (海光)
版本:9.0.5,9.0.4,9.0.3,6.0.4.1,6.0.4,9.0.1,9.0,6.0,4.5.11,4.5.10,4.5.8.9,4.5.8.5,4.5.8,4.5.7,4.5.6

文档用途

本文档介绍在瀚高数据库中,将现有模式(Schema)中的所有对象(包括表、视图、序列、函数、存储过程、索引、约束等)复制到同一数据库下新模式的两种操作方法,适用于数据库迁移、环境克隆、测试数据准备等场景。

详细信息

背景说明

瀚高数据库基于 PostgreSQL 开发,在模式(Schema)管理方面与 PostgreSQL 高度兼容。一个数据库可以被多个模式切分,所有数据库对象均创建于某个模式之下。在实际运维中,经常需要将某个模式下的全部对象复制到同一数据库中的新模式,例如:

  • 为测试环境克隆生产环境的表结构
  • 将业务数据从 public 模式迁移到自定义模式
  • 按业务模块拆分现有模式

方法一:使用 pg_dump + psql(通用方法)

这是最通用、最可靠的方法,适用于复制模式中的所有对象(表结构、数据、索引、约束、函数、存储过程等)。但对于几十GB以上的大数据量场景,不推荐使用此方法,建议直接跳至方法二。

操作步骤

  1. 创建目标模式

首先在数据库中创建目标模式(假设源模式为 source_schema,目标模式为 target_schema):

psql  -U  用户名  -d  数据库名            
CREATE SCHEMA target_schema;    --该模式属主为登录用户

如果需要指定模式所有者:

CREATE SCHEMA target_schema AUTHORIZATION 用户名;
  1. 使用 pg_dump 导出源模式

使用 pg_dump 命令导出源模式的所有对象定义及数据(必须使用 plain 格式,即默认的SQL文本格式):

pg_dump -h 主机地址 -p 端口 -U 用户名 -d 数据库名 -n source_schema -f /path/to/backup.sql
#确保备份路径存储空间足够

参数说明:

  • -n source_schema:只导出指定模式的对象
  • -f:指定输出文件路径

如果只需要复制表结构而不需要数据,可添加 -s 或 --schema-only 参数:

pg_dump -h 主机地址 -p 端口 -U 用户名 -d 数据库名 -n source_schema -s -f /path/to/structure_only.sql
  1. 修改导出的 SQL 文件

导出文件中所有对象的模式名称均为 source_schema,需要将其替换为 target_schema。

使用 sed 命令进行批量替换(Linux环境):

sed -i 's/source_schema/target_schema/g' /path/to/backup.sql

或者手动编辑 SQL 文件,将所有 source_schema. 替换为 target_schema.。

注意:如果对象名称中包含模式名前缀,确保替换完整。注意检查文件中的 search_path 设置,按需调整。数据量较大时(几十GB以上),此替换操作将极为耗时,且占用大量磁盘I/O,文本替换还可能误伤数据内容,建议改用方法二。

  1. 导入到目标模式

使用 psql 命令执行修改后的 SQL 文件:

psql -h 主机地址 -p 端口 -U 用户名 -d 数据库名 -f /path/to/backup.sql
  1. 验证复制结果

登录数据库验证对象是否已成功复制:

-- 查看目标模式下的所有表
\dt target_schema.*

-- 查看目标模式下的所有对象
SELECT 
    nspname AS schema_name,
    relname AS object_name,
    relkind AS object_type
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE nspname = 'target_schema';

方法二:备份→重命名原模式→恢复(需停业务操作)

该方法通过将源模式重命名为目标模式,然后利用 pg_restore 直接将备份恢复到重命名后的模式中,从而避免了修改SQL文件的繁琐步骤。尤其适用于大数据量(几十GB以上) 场景。

流程说明(按顺序执行以下四个步骤):
1、使用 pg_dump 对源模式 source_schema 进行备份,生成备份文件。
2、执行 ALTER SCHEMA source_schema RENAME TO target_schema; 将源模式重命名。
3、新建模式source_schema,使用 pg_restore 将备份文件恢复到source_schema中。
4、验证两模式中的对象是否完整。
操作步骤(均使用业务用户和业务库操作,也就是source_schema的属主和所在库)

  1. 备份源模式

对于小数据量场景,可使用自定义格式(-Fc):

pg_dump -h 主机 -p 端口 -U 用户名 -d 数据库名 -n source_schema -Fc -f /path/source_backup.dump

对于大数据量场景,强烈建议使用目录格式(-Fd)并结合并行(-j)以提升性能:

# -Fd: 目录格式, -j 8: 使用8个并行任务
pg_dump -h 主机 -p 端口 -U 用户名 -d 数据库名 -Fd -j 8 -n source_schema -f /path/backup_dir

说明:-j 的值应根据服务器CPU核心数和I/O能力进行调整。目录格式支持并行导出,且默认启用压缩,可大幅缩短备份时间。

  1. 重命名源模式为目标模式(确保该模式目前没有用户在用)
ALTER SCHEMA source_schema RENAME TO target_schema;

前提:确保 target_schema 在操作前不存在,否则重命名会失败。

  1. 创建模式
create schema source_schema ;
  1. 恢复备份到新模式

针对自定义格式(-Fc)的恢复:

pg_restore -h 主机 -p 端口 -U 用户名 -d 数据库名 /path/source_backup.dump

针对目录格式(-Fd)的恢复(大数据量场景推荐):

pg_restore -h 主机 -p 端口 -U 用户名 -d 数据库名 -j 8   /path/backup_dir
  1. 验证复制结果
-- 查看新模式中的对象
\dt target_schema.*

-- 统计新模式中的对象数量
SELECT count(*) FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE nspname = 'target_schema';

大数据量场景性能优化建议

优化项说明
使用目录格式(-Fd)支持并行读写,默认压缩,比自定义格式更适合大数据量
启用并行(-j N)N建议为CPU核心数的1~2倍,可大幅缩短导出导入时间
使用 pg_restore 的 --jobs恢复时并行创建索引、约束等

特别注意事项(针对此方法)

  • 对象依赖关系:如果外部其他模式的对象(如视图、外键)依赖于 source_schema,重命名会破坏这些依赖,导致外部对象失效。操作前需评估并处理依赖。
  • 操作影响范围:重命名操作会对模式加锁,该部分数据短暂不可用,需停业务进行。
  • 务必先备份:执行前建议对整个数据库进行完整备份,以防操作失误。
  • 测试验证:强烈建议在测试环境中完整模拟一遍流程,确认无误后再上生产。

相关文档

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐