瀚高数据库复制现有模式中所有对象到同库新模式操作方法
环境
系统平台: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以上的大数据量场景,不推荐使用此方法,建议直接跳至方法二。
操作步骤
- 创建目标模式
首先在数据库中创建目标模式(假设源模式为 source_schema,目标模式为 target_schema):
psql -U 用户名 -d 数据库名
CREATE SCHEMA target_schema; --该模式属主为登录用户
如果需要指定模式所有者:
CREATE SCHEMA target_schema AUTHORIZATION 用户名;
- 使用 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
- 修改导出的 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,文本替换还可能误伤数据内容,建议改用方法二。
- 导入到目标模式
使用 psql 命令执行修改后的 SQL 文件:
psql -h 主机地址 -p 端口 -U 用户名 -d 数据库名 -f /path/to/backup.sql
- 验证复制结果
登录数据库验证对象是否已成功复制:
-- 查看目标模式下的所有表
\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的属主和所在库)
- 备份源模式
对于小数据量场景,可使用自定义格式(-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能力进行调整。目录格式支持并行导出,且默认启用压缩,可大幅缩短备份时间。
- 重命名源模式为目标模式(确保该模式目前没有用户在用)
ALTER SCHEMA source_schema RENAME TO target_schema;
前提:确保 target_schema 在操作前不存在,否则重命名会失败。
- 创建模式
create schema source_schema ;
- 恢复备份到新模式
针对自定义格式(-Fc)的恢复:
pg_restore -h 主机 -p 端口 -U 用户名 -d 数据库名 /path/source_backup.dump
针对目录格式(-Fd)的恢复(大数据量场景推荐):
pg_restore -h 主机 -p 端口 -U 用户名 -d 数据库名 -j 8 /path/backup_dir
- 验证复制结果
-- 查看新模式中的对象
\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,重命名会破坏这些依赖,导致外部对象失效。操作前需评估并处理依赖。
- 操作影响范围:重命名操作会对模式加锁,该部分数据短暂不可用,需停业务进行。
- 务必先备份:执行前建议对整个数据库进行完整备份,以防操作失误。
- 测试验证:强烈建议在测试环境中完整模拟一遍流程,确认无误后再上生产。
相关文档
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)