暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从docker postgresql 14迁移到postgresql 16集群过程

原创 伟鹏 2024-05-11
477

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索引

为了维护数据库性能,定期运行VACUUMREINDEX是很有必要的。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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论