1、基础环境
源端
基础:docker
数据库架构:单机
版本:postgresql 14
目标端
基础:物理机
数据库架构:3节点集群
版本:postgresql 16.2
2、迁移
2.1 备份
因为目标端的数据库是集群环境,并且已经有其他生产系统在运行。跨版本情况下采取的是通过pg_dump逻辑备份恢复的方式来迁移数据库,因为停机时间有限,这里使用多线程备份恢复。
ps:数据库备份与恢复是维护数据完整性和业务连续性的关键环节。多线程技术的应用可以显著提高大型数据库的备份与恢复效率
2.1.1 多线程备份
使用pg_dump
命令进行多线程备份可以并行处理多个表和索引,从而减少总体备份时间。这对于大型数据库尤其重要,因为它可以最小化备份窗口,减少对生产环境的影响。
nohup pg_dump -U postgres -h 127.0.0.1 -v -Fc -d postgres --no-owner -F d -j 16 -f /tmp/svnbak &
命令解释:
- `nohup`确保即使终端会话关闭,命令也会继续执行。
- `-U postgres`指定了用于连接数据库的用户名。
- `-h 127.0.0.1`指定了数据库服务器的IP地址。
- `-v`提供了详细的输出,有助于调试和记录。
- `-Fc`指定自定义格式,这允许更快的备份和恢复。
- `-d postgres`指定要备份的数据库名。
- `--no-owner`表示不包含有关对象所有者的信息。
- `-F d`跟随目录遍历时的符号链接。
- `-j 16`使用16个线程进行备份,可以根据系统资源调整线程数。
- `-f`指定了输出文件的位置和名称。
复制
2.1.2 传输文件
将备份文件传输到目标端服务器指定目录,并修改相关权限
复制
2.1.3 多线程恢复
与备份类似,恢复过程也可以利用多线程来加速数据的导入。pg_restore
工具被用来从备份文件中恢复数据。
pg_restore -h10.*.**.*** -p 5000 -U postgres -d pro_svn -j 16 -v /data/tmp/svnbak 命令解释 - `-h10.*.**.***`指定了数据库服务器的IP地址。 - `-p 5000`指定了数据库的端口号。 - `-U postgres`指定了用于连接数据库的用户名。 - `-d pro_svn`指定了要恢复的数据库名。 - `-j 16`使用16个线程进行恢复,可以根据系统资源调整线程数。 - `-v`提供了详细的输出,有助于跟踪恢复进度。 - `/data/tmp/svnbak`是转储文件的位置。
复制
2.2 更改属主
因为目标端数据库要放在指定用户下,使用指定的schema,所以这边需要将迁移后的数据库的属主更改为指定的用户以及schema下
如下存储过程可以完成属主的更改,
该代码非原创 |
DO $$
DECLARE
r record;
i int;
v_schema text[] := '{public}';
v_new_owner varchar := 'pro_svn';
BEGIN
FOR r IN
SELECT 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' AS a FROM information_schema.tables WHERE table_schema = ANY (v_schema)
UNION ALL
SELECT 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' AS a FROM information_schema.sequences WHERE sequence_schema = ANY (v_schema)
UNION ALL
SELECT 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' AS a FROM information_schema.views WHERE table_schema = ANY (v_schema)
UNION ALL
SELECT 'ALTER FUNCTION "' || nsp.nspname || '"."' || p.proname || '"(' || pg_get_function_identity_arguments(p.oid) || ') OWNER TO ' || v_new_owner || ';' AS a FROM pg_proc p JOIN pg_namespace nsp ON p.pronamespace = nsp.oid WHERE nsp.nspname = ANY (v_schema)
UNION ALL
SELECT 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner
LOOP
EXECUTE r.a;
END LOOP;
FOR i IN array_lower(v_schema, 1)..array_upper(v_schema, 1)
LOOP
EXECUTE 'ALTER SCHEMA "' || v_schema[i] || '" OWNER TO ' || v_new_owner;
END LOOP;
END
$$;
alter schema public rename to pro_svn;
set search_path to pro_svn;
复制
如上这些命令确保了所有数据库对象都拥有正确的所有权,并且搜索路径被设置为新的schema名称。
2.3 rebuild索引
为了维护数据库性能,定期运行VACUUM
和REINDEX
是很有必要的。VACUUM
清理已标记为“死”的行,并更新统计信息,而REINDEX
修复潜在的索引膨胀问题,保持索引的效率
vacuumdb -U postgres -h10.*.**.*** -p 5000 -d pro_svn --verbose --analyze > /data/pgsql/tmp/vacuumsvn240510.txt 2>&1 reindexdb -U postgres -h10.*.**.*** -p 5000 -d pro_svn
复制
至此完成了数据库的迁移,经开发测试没有异常反馈,集群环境比docker快多了。
最后修改时间:2024-05-11 19:04:13
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
AI时代的数据库与DBA将何去何从
老冯云数
758次阅读
2025-07-01 10:23:43
PostgreSQL济南高峰论坛9大感受
开源软件联盟PostgreSQL分会
383次阅读
2025-07-04 09:48:12
ACDU周度精选 | 本周数据库圈热点 + 技术干货分享(2025/7/25期)
墨天轮小助手
378次阅读
2025-07-25 15:54:18
6月“墨力原创作者计划”获奖名单公布!
墨天轮编辑部
327次阅读
2025-07-09 15:22:35
ACDU周度精选 | 本周数据库圈热点 + 技术干货分享(2025/7/11期)
墨天轮小助手
295次阅读
2025-07-11 15:14:25
开赛 | KWDB 核心贡献挑战赛,30万奖金池等你来瓜分!
KaiwuDB
254次阅读
2025-07-25 10:07:45
PostgreSQL DDL变更的坑和巧妙方案
liuzhilong62
254次阅读
2025-07-19 11:50:29
【GaussDB】构建一个GaussDB的Docker镜像
DarkAthena
249次阅读
2025-07-26 17:54:22
PostgreSQL高峰论坛:参会小记
老冯云数
224次阅读
2025-06-30 09:56:12
IvorySQL 专家顾问委员会成立啦!
IvorySQL开源数据库社区
208次阅读
2025-07-15 10:15:33